This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
optimise bare 'next'
authorDavid Mitchell <davem@iabyn.com>
Thu, 24 Dec 2015 22:37:48 +0000 (22:37 +0000)
committerDavid Mitchell <davem@iabyn.com>
Wed, 3 Feb 2016 09:19:17 +0000 (09:19 +0000)
If a 'next' without a label appears directly in the scope of the current
loop, then skip searching the context stack for a suitable LOOP context.

pp_ctl.c
t/perf/benchmarks

index 142dec7..c222dbb 100644 (file)
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -2546,7 +2546,10 @@ PP(pp_next)
 {
     PERL_CONTEXT *cx;
 
-    cx = S_unwind_loop(aTHX);
+    /* if not a bare 'next' in the main scope, search for it */
+    cx = CX_CUR();
+    if (!((PL_op->op_flags & OPf_SPECIAL) && CxTYPE_is_LOOP(cx)))
+        cx = S_unwind_loop(aTHX);
 
     TOPBLOCK(cx);
     PL_curcop = cx->blk_oldcop;
index 2a04845..19277a6 100644 (file)
         code    => 'for (@a) {}',
     },
 
+    'loop::for::next4' => {
+        desc    => 'for loop containing only next with my var and integer 4 array',
+        setup   => 'my @a = (1..4);',
+        code    => 'for my $x (@a) {next}',
+    },
+
     'loop::while::i1' => {
         desc    => 'empty while loop 1 iteration',
         setup   => 'my $i = 0;',