This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
si_cxsubix not restored on goto &XS_sub
authorDavid Mitchell <davem@iabyn.com>
Mon, 23 Sep 2019 13:02:49 +0000 (14:02 +0100)
committerDavid Mitchell <davem@iabyn.com>
Mon, 23 Sep 2019 13:11:44 +0000 (14:11 +0100)
My recent merge commit v5.31.3-198-gd2cd363728 (temporarily reverted by
v5.31.4-0-g20ef288c53) added a si_cxsubix field to the stackinfo struct
to track the most recent sub context. This field wasn't being restored
correctly with 'goto &XS-sub', and broke Test::Deep.

pp_ctl.c
t/op/goto.t

index af95a9e..5bd9376 100644 (file)
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -2962,6 +2962,9 @@ PP(pp_goto)
                  * this is a cx_popblock(), less all the stuff we already did
                  * for cx_topblock() earlier */
                 PL_curcop = cx->blk_oldcop;
+                /* this is cx_popsub, less all the stuff we already did */
+                PL_curstackinfo->si_cxsubix = cx->blk_sub.old_cxsubix;
+
                 CX_POP(cx);
 
                /* Push a mark for the start of arglist */
index 08b612b..db08e1e 100644 (file)
@@ -10,7 +10,7 @@ BEGIN {
 
 use warnings;
 use strict;
-plan tests => 124;
+plan tests => 125;
 our $TODO;
 
 my $deprecated = 0;
@@ -884,3 +884,20 @@ eval {
     };
 };
 is $@,'', 'goto the first parameter of a binary expression [perl #132854]';
+
+# v5.31.3-198-gd2cd363728 broke this. goto &XS_sub  wasn't restoring
+# cx->blk_sub.old_cxsubix. Would panic in pp_return
+
+{
+    # isa is an XS sub
+    sub g198 {  goto &UNIVERSAL::isa }
+
+    sub f198 {
+        g198([], 1 );
+        {
+            return 1;
+        }
+    }
+    eval { f198(); };
+    is $@, "", "v5.31.3-198-gd2cd363728";
+}