[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