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 #defines, no #ifs.
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() ...
tosub foo() { ... }
since subroutine definitions are processed unconditionally at compile time, before the rest of the code starts running.In particular,
is equivalent to
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 uselessunless (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.