In perl.git, the branch blead has been updated <http://perl5.git.perl.org/perl.git/commitdiff/acdea6f0600816151724f1e3525a3e41433e2646?hp=faa5b915472fb587460f0f9249bf16fecdf6f103>
- Log ----------------------------------------------------------------- commit acdea6f0600816151724f1e3525a3e41433e2646 Author: David Mitchell <[email protected]> Date: Sat Mar 12 22:01:26 2011 +0000 [perl #82111] de-pessimise some my @array = ... Due to obscure closure and goto tricks, it's sometimes possible for the array or hash in the LHS of 'my @a = ...' and 'my %h = ...' to be non-empty. At compile-time, these conditions are detected and the assign op is compiled with the OPpASSIGN_COMMON, making the assignment slower. This commit speeds it up again by adding a run-time check to pp_aassign to only do the OPpASSIGN_COMMON code-branch if the LHS isn't an empty array or hash. See also #70171. ----------------------------------------------------------------------- Summary of changes: pp_hot.c | 13 ++++++++++++- 1 files changed, 12 insertions(+), 1 deletions(-) diff --git a/pp_hot.c b/pp_hot.c index 852ff80..f8a61cb 100644 --- a/pp_hot.c +++ b/pp_hot.c @@ -989,8 +989,19 @@ PP(pp_aassign) /* If there's a common identifier on both sides we have to take * special care that assigning the identifier on the left doesn't * clobber a value on the right that's used later in the list. + * Don't bother if LHS is just an empty hash or array. */ - if (PL_op->op_private & (OPpASSIGN_COMMON)) { + + if ( (PL_op->op_private & OPpASSIGN_COMMON) + && ( + firstlelem != lastlelem + || ! ((sv = *firstlelem)) + || SvMAGICAL(sv) + || ! (SvTYPE(sv) == SVt_PVAV || SvTYPE(sv) == SVt_PVHV) + || (SvTYPE(sv) == SVt_PVAV && AvFILL((AV*)sv) != -1) + || (SvTYPE(sv) == SVt_PVHV && HvKEYS((HV*)sv) != 0) + ) + ) { EXTEND_MORTAL(lastrelem - firstrelem + 1); for (relem = firstrelem; relem <= lastrelem; relem++) { if ((sv = *relem)) { -- Perl5 Master Repository
