Prevent premature death of @_ during leavesub
Chip Salzenberg [Tue, 28 Jan 1997 11:11:15 +0000 (23:11 +1200)]
pp_hot.c
t/op/misc.t

index 707239f..120c026 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -1656,7 +1656,7 @@ PP(pp_leavesub)
     register CONTEXT *cx;
 
     POPBLOCK(cx,newpm);
-    POPSUB(cx);
+    /* Delay POPSUB until stack values are safe */
 
     if (gimme == G_SCALAR) {
        MARK = newsp + 1;
@@ -1678,6 +1678,9 @@ PP(pp_leavesub)
                /* in case LEAVE wipes old return values */
     }
 
+    /* Now that stack values are safe, release CV and @_ */
+    POPSUB(cx);
+
     curpm = newpm;     /* Don't pop $1 et al till now */
 
     LEAVE;
index 09385b9..25eb661 100755 (executable)
@@ -289,3 +289,7 @@ $s = 0;
 map {#this newline here tickles the bug
 $s += $_} (1,2,4);
 print "eat flaming death\n" unless ($s == 7);
+########
+sub foo { local $_ = shift; split; @_ }
+@x = foo(' x  y  z ');
+print "you die joe!\n" unless "@x" eq 'x y z';