[Dev-luatex] order of node linking matters

Taco Hoekwater taco at elvenkind.com
Wed Dec 23 17:28:50 CET 2009


Paweł Jackowski wrote:
> 
>     someglyph.next = someother
>     discretionary.pre = someglyph
> 
> is not the same. Why?

Because a discretionary's pre, post, and replace lists are a bit
special: internally the discretionary does not just have a next and
a prev link for each of the head nodes, but also a 'tail' link.
That last one points to the last node in the list for each of
the three fields. That extra link is used during hyphenation and
at end-of-line situations (those parts of the code would be much
more complex == slower without it).

So, when in lua you assign to <disc>.pre, that assingment also has
to fix up that tail link (it does so by running the C equivalent
of the node.tail() function).

If the list you are assigning is well-formed, this is transparent.
But yours isn't yet at that point in the code, because 'b.next' still
points to 'd' at the moment the 'd.pre = b' is seen; and that confuses
the internal code into an assertion failure.

I admit this is obscure, but the general rule is simple: never
assign a list to a node field until you are sure its internal link
structure is correct. (a warning to this effect will be added to
the manual).

Best wishes,
Taco


More information about the dev-luatex mailing list