]> git.vpit.fr Git - perl/modules/autovivification.git/commitdiff
Also mark the unstack ops in our peephole optimizer rt99458 rt99904
authorVincent Pit <vince@profvince.com>
Sat, 1 Nov 2014 21:39:16 +0000 (19:39 -0200)
committerVincent Pit <vince@profvince.com>
Sat, 1 Nov 2014 21:46:24 +0000 (19:46 -0200)
This prevents infinite recursion at compile time for ... while 1
constructs, where the body may not contain neither nextstates nor
stubs.

This fixes RT #99458 and RT #99904.

autovivification.xs
t/43-peep.t

index 37b6d6509d06b1f3cc2df9462509534114b59a81..f0e00473b70709ee7b6915551e459f90db07f9ff 100644 (file)
@@ -1024,6 +1024,7 @@ STATIC void a_peep_rec(pTHX_ OP *o, ptable *seen) {
    case OP_NEXTSTATE:
    case OP_DBSTATE:
    case OP_STUB:
+   case OP_UNSTACK:
     if (ptable_fetch(seen, o))
      return;
     ptable_seen_store(seen, o, o);
index a91b5f4632b6abc237eba4ff86ef610912d9a33b..88d2afd7082c8d77ddb33e4b7ebb21570b6b1512 100644 (file)
@@ -8,7 +8,7 @@ use Test::More;
 use lib 't/lib';
 use VPIT::TestHelpers;
 
-plan tests => 11 + 1 * 2 + 5 * 3;
+plan tests => 11 + 5 * 2 + 5 * 3;
 
 {
  my $desc = 'peephole optimization of conditionals';
@@ -113,8 +113,9 @@ plan tests => 11 + 1 * 2 + 5 * 3;
 }
 
 {
+ my $base_desc = 'peephole optimization of infinite';
  my %infinite_tests = (
-  'peephole optimization of infinite for loops (RT #64435)' => <<'  TESTCASE',
+  "$base_desc for loops (RT #64435)" => <<'  TESTCASE',
    no autovivification;
    my $ret = 0;
    for (;;) {
@@ -123,6 +124,36 @@ plan tests => 11 + 1 * 2 + 5 * 3;
    }
    exit $ret;
   TESTCASE
+  "$base_desc while loops" => <<'  TESTCASE',
+   no autovivification;
+   my $ret = 0;
+   while (1) {
+    ++$ret;
+    exit $ret;
+   }
+   exit $ret;
+  TESTCASE
+  "$base_desc postfix while (RT #99458)" => <<'  TESTCASE',
+   no autovivification;
+   my $ret = 0;
+   ++$ret && exit $ret while 1;
+   exit $ret;
+  TESTCASE
+  "$base_desc until loops" => <<'  TESTCASE',
+   no autovivification;
+   my $ret = 0;
+   until (0) {
+    ++$ret;
+    exit $ret;
+   }
+   exit $ret;
+  TESTCASE
+  "$base_desc postfix until" => <<'  TESTCASE',
+   no autovivification;
+   my $ret = 0;
+   ++$ret && exit $ret until 0;
+   exit $ret;
+  TESTCASE
  );
 
  for my $desc (keys %infinite_tests) {