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

Reply via email to