[luatex] LuaTeX crashes
Taco Hoekwater
taco at elvenkind.com
Tue Jul 12 11:28:40 CEST 2011
On 07/12/2011 10:56 AM, Taco Hoekwater wrote:
> On 07/12/2011 09:11 AM, Hartmut Henkel wrote:
>>
>> looks as if the macro package calls for a direction other than the
>> four implemented ones (TLT, TRT, LTL, RTT).
>
> That is just a side-effect. I have deduced so far, that the problem is
> that one of internal structures for \halign becomes trashed somewhere
> in the process. That gives one of the nodes a bad field, which in turn
> causes a bad attribute assignment to happen, resulting in the assertion
> failure.
>
> Revision 4327 (trunk) adds an assert() so that the actual problem is
> discovered earlier (but luatex still crashes).
The problem is caused because the loop in bidi.lua is adding
stuff to node lists where it should not do so. I am not at all sure
what the correct fix is, but this replacement function for bidi.lua
makes the crash go away, at least:
local function process_node(head, group)
local str, line
head, str = node_string(head)
line = process_string(str, group)
assert(#line == node.length(head))
assign_levels(head, line)
for n in node.traverse(head) do
if n.id == glyph then
local v = node.has_attribute(n, level_attribute)
if v and odd(v) then
local mirror = chardata[n.char].mirror
if mirror then
n.char = mirror
end
end
end
local bdir = node.has_attribute(n, bdir_attribute)
local edir = node.has_attribute(n, edir_attribute)
local new
node.slide(head)
if bdir then
if not n.prev and group == "" then
while n and n.id ~= glyph do
n = n.next
end
end
if not n.id == node.id('unset') then
if bdir == 1 then -- +TRT
head, new = node.insert_before(head, n,
new_dir_node("+TRT"))
elseif bdir == 3 then -- +TLT
head, new = node.insert_before(head, n,
new_dir_node("+TLT"))
end
end
end
if edir then
if not n.next and group == "" then
while n and n.id ~= glyph do
n = n.prev
end
end
if not n.id == node.id('unset') then
if edir == 2 then -- -TRT
head, new = node.insert_after(head, n,
new_dir_node("-TRT"))
elseif edir == 4 then -- -TLT
head, new = node.insert_after(head, n,
new_dir_node("-TLT"))
end
end
end
if new then
node.unset_attribute(new, bdir_attribute)
node.unset_attribute(new, edir_attribute)
end
end
return head
end
More information about the luatex
mailing list