]> git.vpit.fr Git - perl/modules/Scope-Upper.git/commitdiff
Fix reap() clobbering the return stack, as reported by Torsten Foertsch in RT #44204 rt44204
authorVincent Pit <vince@profvince.com>
Mon, 16 Mar 2009 17:52:44 +0000 (18:52 +0100)
committerVincent Pit <vince@profvince.com>
Mon, 16 Mar 2009 17:53:11 +0000 (18:53 +0100)
Upper.xs
t/13-reap-ctl.t

index afb1275492c19352f46c44c3ee64c1d735d1fcc9..8f6bda8377418af6a8dd29d82ac833b9a6ce6e3c 100644 (file)
--- a/Upper.xs
+++ b/Upper.xs
@@ -310,7 +310,6 @@ STATIC void su_call(pTHX_ void *ud_) {
   --cxstack_ix;
 #endif
 
- SPAGAIN;
  PUTBACK;
 
  FREETMPS;
index cff7601f9432b7053a4fa0797c93d46f4815c236..7ec492a9906c8ffac3d06ad2943533be88c48d0e 100644 (file)
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 38;
+use Test::More tests => 38 + 4 * 7;
 
 use Scope::Upper qw/reap UP HERE/;
 
@@ -157,3 +157,42 @@ $y = undef;
  is $x, 1, 'die in reap inside eval [ok - x]';
  is $y, 1, 'die in reap inside eval [ok - y]';
 }
+
+sub hijacked {
+ my ($cb, $desc) = @_;
+ local $x = 2;
+ sub {
+  local $x = 3;
+  &reap($cb => UP);
+  is $x, 3,     "$desc [not yet 1 - x]";
+  is $y, undef, "$desc [not yet 1 - y]";
+ }->();
+ is $x, 2,     "$desc [not yet 2 - x]";
+ is $y, undef, "$desc [not yet 2 - y]";
+ 11, 12;
+}
+
+for ([ sub { ++$y; 15, 16, 17, 18 },        'implicit ' ],
+     [ sub { ++$y; return 15, 16, 17, 18 }, ''          ]) {
+ my ($cb, $imp) = @$_;
+ $imp = "RT #44204 - ${imp}return from reap";
+ my $desc;
+ $y = undef;
+ {
+  $desc = "$imp in list context";
+  local $x = 1;
+  my @l = hijacked($cb, $desc);
+  is $x,         1,          "$desc [ok - x]";
+  is $y,         1,          "$desc [ok - y]";
+  is_deeply \@l, [ 11, 12 ], "$desc [ok - l]";
+ }
+ $y = undef;
+ {
+  $desc = "$imp in list context";
+  local $x = 1;
+  my $s = hijacked($cb, $desc);
+  is $x, 1,  "$desc [ok - x]";
+  is $y, 1,  "$desc [ok - y]";
+  is $s, 12, "$desc [ok - s]";
+ }
+}