This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
handle scope error in qr/\(?{/
authorDavid Mitchell <davem@iabyn.com>
Tue, 19 Mar 2019 10:58:46 +0000 (10:58 +0000)
committerDavid Mitchell <davem@iabyn.com>
Tue, 19 Mar 2019 11:26:35 +0000 (11:26 +0000)
commit170c919fc4986a85062e9292e4cfed24771d2224
treeafc2bfd4556d9663c82a637acd6d35666a557d97
parent2fe8bdbd8f254afbafdd3be0139e6df0e570b622
handle scope error in qr/\(?{/

RT #133879

In this code:

    BEGIN {$^H = 0x10000 }; # HINT_NEW_RE
    qr/\(?{/

When the toker sees the 'qr', it looks ahead and thinks that the
pattern *might* contain code blocks, so creates a new anon sub to wrap
compilation of the pattern in (so that any code blocks get compiled as
part of the anon sub rather than the main body of the code).

Normally at the end of parsing the qr construct, the parser notes that
no code blocks were found, and throws the unneeded CV away and
restores the old PL_compcv (via a LEAVE_SCOPE). This false positive is
normal and is expected in the relevant code paths.

However, setting the HINT_NEW_RE  (which indicates that
overload::constant is present for qr// but with no overloaded function
actually present) causes an error to be raised. The parser does error
recovery and continues.

However, v5.25.9-148-g7c44985626 added a test to not bother compiling a
pattern if the parser is in an errored state, which again is fine,
except it turns out that if this branch is taken, it skips the 'restore
the old PL_compcv' code, leading to the wrong value for PL_compcv when
ops are freed.

The fix is simple: move the "skip if errored" test to after PL_compcv
has been restored.
op.c
t/re/reg_eval_scope.t