mirror of
https://github.com/Perl/perl5.git
synced 2026-01-27 09:55:18 +00:00
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.