On Sat, Mar 7, 2020 at 2:13 PM Marcel Fabian Krüger <t...@2krueger.de> wrote:

> Hi,
>
> according to the documentation for `append_to_vlist_filter`:
>
> > The prevdepth is also optional
>
> so it should be allowed to only return a box in which case the prevdepth
> value shouldn't change.
>
> But if we actually try this:
>
> \directlua{
>   callback.register("append_to_vlist_filter", function(b)
>     return b
>   end)
> }
> abc
> \bye
>
> LuaTeX answers with
> warning  (pdf backend): no pages of output.
>
> because it discards all boxes. This is caused by a bug in luanode.c,
> lua_appendtovlist_callback:
> The callback is called with lua_pcall(Luas, 4, 2, 0). Then LuaTeX tries
> to determine if one or two values have been returned by looking at the
> type of slot -1: If this is a number, the second return value have been
> a number and it is evaluated as new prevdepth. Otherwise
>
>     else if (lua_type(Luas, -1) != LUA_TNIL) {
>         p = check_isnode(Luas, -1);
>         *result = *p;
>     }
>
> is evaluated to scan for a single return value which is a node. But because
> lua_pcall(Luas, 4, 2, 0) explicitly requested two return values, a
> callback with one return values would result in a stack where the one
> return value is followed by `nil`. Therefore this `if` block is not
> entered.
>
> The problem can be fixed  by always looking at stack slot -2 for the
> returned node:
>
>  source/texk/web2c/luatexdir/lua/luanode.c | 9 +++------
>  1 file changed, 3 insertions(+), 6 deletions(-)
>
> diff --git a/source/texk/web2c/luatexdir/lua/luanode.c
> b/source/texk/web2c/luatexdir/lua/luanode.c
> index a0c97e37d..d4baab96d 100644
> --- a/source/texk/web2c/luatexdir/lua/luanode.c
> +++ b/source/texk/web2c/luatexdir/lua/luanode.c
> @@ -183,12 +183,9 @@ int lua_appendtovlist_callback(halfword box, int
> location, halfword prev_depth,
>      if (lua_type(Luas,-1) == LUA_TNUMBER) {
>          *next_depth = lua_roundnumber(Luas,-1);
>          *prev_set = true;
> -        if (lua_type(Luas, -2) != LUA_TNIL) {
> -            p = check_isnode(Luas, -2);
> -            *result = *p;
> -        }
> -    } else if (lua_type(Luas, -1) != LUA_TNIL) {
> -        p = check_isnode(Luas, -1);
> +    }
> +    if (lua_type(Luas, -2) != LUA_TNIL) {
> +        p = check_isnode(Luas, -2);
>          *result = *p;
>      }
>      return 1;
> --
>

Thank you very much. Very likely I will see it this evening.

-- 
luigi
_______________________________________________
dev-luatex mailing list
dev-luatex@ntg.nl
https://mailman.ntg.nl/mailman/listinfo/dev-luatex

Reply via email to