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

Reply via email to