[Dev-luatex] Assignments in runtoks

luigi scarso luigi.scarso at gmail.com
Fri Aug 30 20:55:52 CEST 2019


On Thu, Aug 29, 2019 at 2:42 PM Marcel Fabian Kr├╝ger <tex at 2krueger.de>
wrote:

> Hello,
>
> in current versions of LuaTeX, `runtoks` does not preserve token lists
> of ongoing assignments. Therefore running `runtoks` inside of `\edef`
> or similar replace the definition with the defined value of the last
> inner assignment.
>
> For example:
>
> \toks0{\def\innermacro{inner}}
> \edef\outermacro{outer\directlua{tex.runtoks(0)}}
> \show\outermacro
> \bye
>
> in plain TeX should show
>
> > \outermacro=macro:
> ->outer.
>
> but currently does show
>
> > \outermacro=macro:
> ->inner.
>
> instead.
>
> (As a side effect the reference count isn't updated, so for example
>
> \toks0{\def\innermacro{inner}\let\innermacro\undefined}
> \edef\outermacro{outer\directlua{tex.runtoks(0)}}
> \show\outermacro
> \bye
>
> starts printing hyphenation patterns on my system.)
>
> This can be fixed by saving scanner_status, warning_index and def_ref
> when entering local_control:
>
> diff --git a/source/texk/web2c/luatexdir/tex/maincontrol.c
> b/source/texk/web2c/luatexdir/tex/maincontrol.c
> index b01931dd1..284fb0ae3 100644
> --- a/source/texk/web2c/luatexdir/tex/maincontrol.c
> +++ b/source/texk/web2c/luatexdir/tex/maincontrol.c
> @@ -1055,6 +1055,10 @@ extern void local_control_message(const char *s)
>  void local_control(void)
>  {
>      int ll = local_level;
> +    int save_scanner_status = scanner_status;
> +    halfword save_def_ref = def_ref;
> +    halfword save_warning_index = warning_index;
> +
>      main_control_state = goto_next;
>      local_level += 1;
>      while (1) {
> @@ -1077,14 +1081,17 @@ void local_control(void)
>              if (tracing_nesting_par > 2) {
>                  local_control_message("leaving due to level change");
>              }
> -            return ;
> +            break;
>          } else if (main_control_state == goto_return) {
>              if (tracing_nesting_par > 2) {
>                  local_control_message("leaving due to triggering");
>              }
> -            return;
> +            break;
>          }
>      }
> +    scanner_status = save_scanner_status;
> +    def_ref = save_def_ref;
> +    warning_index = save_warning_index;
>      return;
>  }
>


we are seeing it.

-- 
luigi
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.ntg.nl/pipermail/dev-luatex/attachments/20190830/9e69501b/attachment.html>


More information about the dev-luatex mailing list