[luatex] luatexbase.add_to_callback does not preserve the order
Hironori KITAGAWA
h_kitagawa2001 at yahoo.co.jp
Wed Feb 3 11:24:16 CET 2016
Hello David,
> I put a comment in github but I think that this fixes the issue (using
> ipairs rather than pairs in add_to_callback so the list is constituted
> in the right order) Below I redefine add_to_callback in the test file
> but if you locally edit luatexbase.sty with that definition and could
> confirm it works on your original files, we will push an update to
> ctan, thanks again.
This works as expected, thank you!
Regards
Hironori KITAGAWA <h_kitagawa2001 at yahoo.co.jp>
On Wed, 3 Feb 2016 10:12:26 +0000
David Carlisle <d.p.carlisle at gmail.com> wrote:
> I put a comment in github but I think that this fixes the issue (using
> ipairs rather than pairs in add_to_callback so the list is constituted
> in the right order) Below I redefine add_to_callback in the test file
> but if you locally edit luatexbase.sty with that definition and could
> confirm it works on your original files, we will push an update to
> ctan, thanks again.
>
>
>
> \batchmode
> \input luatexbase.sty
> \directlua{
> function luatexbase.add_to_callback(name,fun,description,priority)
> local priority= priority
> local len=\string#luatexbase.callback_descriptions(name)
> if (priority==nil) then
> priority=len+1
> end
> if(luatexbase.callbacktypes[name] == 3 and
> priority == 1 and
> len==1) then
> luatexbase.module_warning("luatexbase",
> "resetting exclusive callback: " .. name)
> luatexbase.reset_callback(name)
> end
> local saved_callback={},ff,dd
> for k,v in ipairs(luatexbase.callback_descriptions(name)) do
> if k >= priority then
> ff,dd= luatexbase.remove_from_callback(name, v)
> saved_callback[1+k-priority]={ff,dd}
> end
> end
> luatexbase.base_add_to_callback(name,fun,description)
> for k,v in ipairs(saved_callback) do
> luatexbase.base_add_to_callback(name,v[1],v[2])
> end
> return
> end
> }
> \scrollmode\catcode`\_=12
>
> \directlua{
> luatexbase.create_callback('test', 'data', function(n) return n end)
> local fn = {}
> for n=1,20 do
> fn[n] = function()
> texio.write(tostring(n) .. ', '); return 1
> end
> luatexbase.add_to_callback('test', fn[n], n, n)
> end
> luatexbase.call_callback('test', 0)
> texio.write_nl('')
> for i=1,300 do
> local n = math.random(20)
> luatexbase.remove_from_callback('test', n) % remove fn[n]
> luatexbase.add_to_callback('test', fn[n], n, n)
> end
> texio.write_nl('')
> luatexbase.call_callback('test', 0)
> }
>
> \batchmode\bye
More information about the luatex
mailing list