In perl.git, the branch blead has been updated <http://perl5.git.perl.org/perl.git/commitdiff/f84ff042dab5dfcde5d88d3ad4b28d1416321e65?hp=8abccac8ff0df19277ea7cd5207ec52ac011a3b9>
- Log ----------------------------------------------------------------- commit f84ff042dab5dfcde5d88d3ad4b28d1416321e65 Author: Nicholas Clark <[email protected]> Date: Tue Oct 12 18:03:45 2010 +0100 XS_Tie_Hash_NamedCapture_STORE should always croak on invalid parameters. Previously, it would return undef instead of calling Perl_croak_no_modify() if PL_localizing was true. However, that case can never be reached. PL_localizing is set non-zero for 1: Perl_mg_localize and PL_save_scalar, for the duration of executing the local 2: Perl_leave_scope for the duration of unwinding the local However, XS_Tie_Hash_NamedCapture_STORE can't be reached in either case, with PL_curpm NULL (or otherwise invalid) || !SvROK(ST(0)). Case 1 would be the call to save_helem_flags() in pp_helem. However, this is only reached if preeminent is TRUE, which will only hold if hv_exists_ent() has already returned TRUE, which will only be possible if PL_curpm and ST(0) are valid. Case 2 would be the case SAVEt_HELEM in Perl_leave_scope(). However, this case is only reached as part of the unwinding from Case 1 above, so again PL_curpm and ST(0) will be valid, for this dynamic scope. This commit is the patch proposed in RT ##77610. It does not resolve all issues in that ticket. Currently C<local $1> is legal - it's a runtime no-op, which neither errors *nor* resets $1 to undef. Clearly C<local $+{k}> is inconsistent with this, (as it errors at scope exit for all cases, and additionally errors at local time if $+{k} exists) but I consider it not worth fixing until we decide whether C<local $1>'s current behaviour is a "bug" or a "feature". ----------------------------------------------------------------------- Summary of changes: universal.c | 5 +---- 1 files changed, 1 insertions(+), 4 deletions(-) diff --git a/universal.c b/universal.c index e3e91cf..5442f87 100644 --- a/universal.c +++ b/universal.c @@ -1307,10 +1307,7 @@ XS(XS_Tie_Hash_NamedCapture_STORE) rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL; if (!rx || !SvROK(ST(0))) { - if (!PL_localizing) - Perl_croak_no_modify(aTHX); - else - XSRETURN_UNDEF; + Perl_croak_no_modify(aTHX); } SP -= items; -- Perl5 Master Repository
