In perl.git, the branch blead has been updated

<http://perl5.git.perl.org/perl.git/commitdiff/73f4c4fe76492cf68c8a57ccae33a9a3e5a87206?hp=c1bd5aaaae0e00fe17b9337100f4941bed955561>

- Log -----------------------------------------------------------------
commit 73f4c4fe76492cf68c8a57ccae33a9a3e5a87206
Author: Father Chrysostomos <spr...@cpan.org>
Date:   Sun Oct 12 08:10:41 2014 -0700

    Optimise "@_" to a single join
    
    instead of stringify(join(...)).

M       embed.h
M       lib/B/Deparse.t
M       op.c
M       opcode.h
M       proto.h
M       regen/op_private
M       regen/opcodes
M       t/op/opt.t

commit 457427054efbb32a4c1e4298aa72a5221d72628f
Author: Father Chrysostomos <spr...@cpan.org>
Date:   Sun Oct 12 06:58:11 2014 -0700

    opt.t: Test split-to-array optimisation

M       t/op/opt.t
-----------------------------------------------------------------------

Summary of changes:
 embed.h          |  1 +
 lib/B/Deparse.t  |  8 ++++----
 op.c             | 14 ++++++++++++++
 opcode.h         |  2 +-
 proto.h          |  6 ++++++
 regen/op_private |  1 +
 regen/opcodes    |  2 +-
 t/op/opt.t       | 22 +++++++++++++++++++++-
 8 files changed, 49 insertions(+), 7 deletions(-)

diff --git a/embed.h b/embed.h
index b4176c7..8231b87 100644
--- a/embed.h
+++ b/embed.h
@@ -1121,6 +1121,7 @@
 #define ck_sort(a)             Perl_ck_sort(aTHX_ a)
 #define ck_spair(a)            Perl_ck_spair(aTHX_ a)
 #define ck_split(a)            Perl_ck_split(aTHX_ a)
+#define ck_stringify(a)                Perl_ck_stringify(aTHX_ a)
 #define ck_subr(a)             Perl_ck_subr(aTHX_ a)
 #define ck_substr(a)           Perl_ck_substr(aTHX_ a)
 #define ck_svconst(a)          Perl_ck_svconst(aTHX_ a)
diff --git a/lib/B/Deparse.t b/lib/B/Deparse.t
index b51fe28..0046ce1 100644
--- a/lib/B/Deparse.t
+++ b/lib/B/Deparse.t
@@ -243,13 +243,13 @@ like($a, qr/-e syntax OK/,
 
 # [perl #93990]
 @] = ();
-is($deparse->coderef2text(sub{ print "@{]}" }),
+is($deparse->coderef2text(sub{ print "foo@{]}" }),
 q<{
-    print "@{]}";
+    print "foo@{]}";
 }>, 'curly around to interpolate "@{]}"');
-is($deparse->coderef2text(sub{ print "@{-}" }),
+is($deparse->coderef2text(sub{ print "foo@{-}" }),
 q<{
-    print "@-";
+    print "foo@-";
 }>, 'no need to curly around to interpolate "@-"');
 
 # Strict hints in %^H are mercilessly suppressed
diff --git a/op.c b/op.c
index f1cdc0a..1de26ae 100644
--- a/op.c
+++ b/op.c
@@ -10610,6 +10610,20 @@ Perl_ck_split(pTHX_ OP *o)
 }
 
 OP *
+Perl_ck_stringify(pTHX_ OP *o)
+{
+    OP * const kid = OP_SIBLING(cUNOPo->op_first);
+    PERL_ARGS_ASSERT_CK_STRINGIFY;
+    if (kid->op_type == OP_JOIN) {
+       assert(!OP_HAS_SIBLING(kid));
+       op_sibling_splice(o, cUNOPo->op_first, -1, NULL);
+       op_free(o);
+       return kid;
+    }
+    return ck_fun(o);
+}
+       
+OP *
 Perl_ck_join(pTHX_ OP *o)
 {
     OP * const kid = OP_SIBLING(cLISTOPo->op_first);
diff --git a/opcode.h b/opcode.h
index 142c75e..f555e91 100644
--- a/opcode.h
+++ b/opcode.h
@@ -1413,7 +1413,7 @@ EXT Perl_check_t PL_check[] /* or perlvars.h */
        Perl_ck_null,           /* subtract */
        Perl_ck_null,           /* i_subtract */
        Perl_ck_concat,         /* concat */
-       Perl_ck_fun,            /* stringify */
+       Perl_ck_stringify,      /* stringify */
        Perl_ck_bitop,          /* left_shift */
        Perl_ck_bitop,          /* right_shift */
        Perl_ck_cmp,            /* lt */
diff --git a/proto.h b/proto.h
index 8844932..0423160 100644
--- a/proto.h
+++ b/proto.h
@@ -651,6 +651,12 @@ PERL_CALLCONV OP * Perl_ck_split(pTHX_ OP *o)
 #define PERL_ARGS_ASSERT_CK_SPLIT      \
        assert(o)
 
+PERL_CALLCONV OP *     Perl_ck_stringify(pTHX_ OP *o)
+                       __attribute__warn_unused_result__
+                       __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_STRINGIFY  \
+       assert(o)
+
 PERL_CALLCONV OP *     Perl_ck_subr(pTHX_ OP *o)
                        __attribute__warn_unused_result__
                        __attribute__nonnull__(pTHX_1);
diff --git a/regen/op_private b/regen/op_private
index 94f1a9a..8d82142 100644
--- a/regen/op_private
+++ b/regen/op_private
@@ -239,6 +239,7 @@ use strict;
                             ops_with_check('ck_lfun'),
                             ops_with_check('ck_open'),
                             ops_with_check('ck_select'),
+                            ops_with_check('ck_stringify'),
                             ops_with_check('ck_tell'),
                             ops_with_check('ck_trunc'),
                             ;
diff --git a/regen/opcodes b/regen/opcodes
index d610d30..e0d3c9e 100644
--- a/regen/opcodes
+++ b/regen/opcodes
@@ -133,7 +133,7 @@ i_add               integer addition (+)    ck_null         
ifsT2   S S
 subtract       subtraction (-)         ck_null         IfsT2   S S
 i_subtract     integer subtraction (-) ck_null         ifsT2   S S
 concat         concatenation (.) or string     ck_concat       fsT2    S S
-stringify      string                  ck_fun          fsT@    S
+stringify      string                  ck_stringify    fsT@    S
 
 left_shift     left bitshift (<<)      ck_bitop        fsT2    S S
 right_shift    right bitshift (>>)     ck_bitop        fsT2    S S
diff --git a/t/op/opt.t b/t/op/opt.t
index 3090e35..892ec95 100644
--- a/t/op/opt.t
+++ b/t/op/opt.t
@@ -9,7 +9,7 @@ BEGIN {
     @INC = '../lib';
 }
 
-plan 12;
+plan 18;
 
 use B qw 'svref_2object OPpASSIGN_COMMON';
 
@@ -50,3 +50,23 @@ for (['CONSTANT', sub {          join "foo", "bar"    }, 0, 
"bar"    ],
     is $last_expr->name, 'const', "$tn optimised to constant";
     is $sub->(), $expect, "$tn folded correctly";
 }
+
+
+# split to array
+
+for(['@pkgary'      , '@_'       ],
+    ['@lexary'      , 'my @a; @a'],
+    ['my(@array)'   , 'my(@a)'   ],
+    ['local(@array)', 'local(@_)'],
+    ['@{...}'       , '@{\@_}'   ],
+){
+    my($tn,$code) = @$_;
+    my $sub = eval "sub { $code = split }";
+    my $split = svref_2object($sub)->ROOT->first->last;
+    is $split->name, 'split', "$tn = split swallows up the assignment";
+}
+
+
+# stringify with join kid --> join
+is svref_2object(sub { "@_" })->ROOT->first->last->name, 'join',
+  'qq"@_" optimised from stringify(join(...)) to join(...)';

--
Perl5 Master Repository

Reply via email to