Branch: refs/heads/blead Home: https://github.com/Perl/perl5 Commit: f38f760a1129030b3a4c5c3a3fe49409a65327c2 https://github.com/Perl/perl5/commit/f38f760a1129030b3a4c5c3a3fe49409a65327c2 Author: Lukas Mai <lukasmai....@gmail.com> Date: 2024-04-03 (Wed, 03 Apr 2024)
Changed paths: M t/lib/h2ph.h M t/lib/h2ph.pht M utils/h2ph.PL Log Message: ----------- h2ph: define all symbols at runtime Preprocessor directives must be processed strictly in order. `#if` and `#ifdef` directives can inspect the current state of defined symbols. That's why it is wrong to translate `#define FOO() ...` to `sub foo() { ... }` since subroutine definitions are processed unconditionally at compile time, before the rest of the code starts running. In particular, unless(defined(&FOO)) { sub FOO () { eval q(1); } } is equivalent to # at compile time: sub FOO () { eval q(1); } # ... later, at runtime: unless(defined(&FOO)) { # does nothing } Fix this case by always wrapping subroutines in eval '...', which moves the symbol definition to runtime, regardless of what $t (our indentation state) is. Similarly, generate `_h2ph_pre.ph` without the functionally useless `unless (defined &...) { }` blocks. We don't need runtime definitions (via eval) here because nothing in this file depends on the dynamic state of macro definitions. It's all `#define`s, no `#if`s. Fixes #22109. To unsubscribe from these emails, change your notification settings at https://github.com/Perl/perl5/settings/notifications