Lukas Mai f38f760a11 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.
2024-04-03 20:34:51 +02:00
..