This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
The change #20809 opened up a code path that might leave s unset.
[perl5.git] / bytecode.pl
index 1bcf95a..bfe7502 100644 (file)
@@ -4,8 +4,8 @@ BEGIN {
 }
 use strict;
 my %alias_to = (
-    U32 => [qw(PADOFFSET STRLEN line_t)],
-    I32 => [qw(SSize_t long)],
+    U32 => [qw(line_t)],
+    PADOFFSET => [qw(STRLEN SSize_t)],
     U16 => [qw(OPCODE short)],
     U8  => [qw(char)],
 );
@@ -46,7 +46,7 @@ open(ASMDATA_PM, ">ext/B/B/Asmdata.pm") or die "ext/B/B/Asmdata.pm: $!";
 print ASMDATA_PM $perl_header, <<'EOT';
 package B::Asmdata;
 
-our $VERSION = '1.00';
+our $VERSION = '1.01';
 
 use Exporter;
 @ISA = qw(Exporter);
@@ -111,6 +111,7 @@ byterun(pTHX_ register struct byteloader_state *bstate)
     New(666, bstate->bs_obj_list, 32, void*); /* set op objlist */
     bstate->bs_obj_list_fill = 31;
     bstate->bs_obj_list[0] = NULL; /* first is always Null */
+    bstate->bs_ix = 1;
 
 EOT
 
@@ -142,6 +143,10 @@ while (<DATA>) {
        next;
     }
     ($insn, $lvalue, $argtype, $flags) = split;
+    my $rvalcast = '';
+    if ($argtype =~ m:(.+)/(.+):) {
+       ($rvalcast, $argtype) = ("($1)", $2);
+    }
     $insn_name[$insn_num] = $insn;
     $fundtype = $alias_from{$argtype} || $argtype;
 
@@ -161,7 +166,7 @@ while (<DATA>) {
        print BYTERUN_C "\t\tBSET_OBJ_STORE($lvalue$optarg);\n";
     }
     elsif ($optarg && $lvalue ne "none") {
-       print BYTERUN_C "\t\t$lvalue = arg;\n";
+       print BYTERUN_C "\t\t$lvalue = ${rvalcast}arg;\n";
     }
     print BYTERUN_C "\t\tbreak;\n\t    }\n";
 
@@ -205,6 +210,7 @@ struct byteloader_state {
     SV                         *bs_sv;
     void                       **bs_obj_list;
     int                                bs_obj_list_fill;
+    int                                bs_ix;
     XPV                                bs_pv;
     int                                bs_iv_overflows;
 };
@@ -335,6 +341,8 @@ nop         none                    none
 # ret so that \0-terminated strings can be read properly as bytecode.
 %number 0
 #
+# The argtype is either a single type or "rightvaluecast/argtype".
+#
 #opcode                lvalue                                  argtype         flags   
 #
 ret            none                                    none            x
@@ -344,8 +352,11 @@ stsv               bstate->bs_sv                           U32             s
 stop           PL_op                                   U32             s
 stpv           bstate->bs_pv.xpv_pv                    U32             x
 ldspecsv       bstate->bs_sv                           U8              x
+ldspecsvx      bstate->bs_sv                           U8              x
 newsv          bstate->bs_sv                           U8              x
+newsvx         bstate->bs_sv                           U32             x
 newop          PL_op                                   U8              x
+newopx         PL_op                                   U16             x
 newopn         PL_op                                   U8              x
 newpv          none                                    PV
 pv_cur         bstate->bs_pv.xpv_cur                   STRLEN
@@ -410,7 +421,9 @@ mg_name             SvMAGIC(bstate->bs_sv)                  pvcontents      x
 mg_namex       SvMAGIC(bstate->bs_sv)                  svindex         x
 xmg_stash      *(SV**)&SvSTASH(bstate->bs_sv)          svindex
 gv_fetchpv     bstate->bs_sv                           strconst        x
+gv_fetchpvx    bstate->bs_sv                           strconst        x
 gv_stashpv     bstate->bs_sv                           strconst        x
+gv_stashpvx    bstate->bs_sv                           strconst        x
 gp_sv          GvSV(bstate->bs_sv)                     svindex
 gp_refcnt      GvREFCNT(bstate->bs_sv)                 U32
 gp_refcnt_add  GvREFCNT(bstate->bs_sv)                 I32             x
@@ -440,7 +453,7 @@ op_pmreplstart      cPMOP->op_pmreplstart                   opindex
 op_pmnext      *(OP**)&cPMOP->op_pmnext                opindex
 #ifdef USE_ITHREADS
 op_pmstashpv   cPMOP->op_pmstashpv                     pvindex
-op_pmreplrootpo        (PADOFFSET)cPMOP->op_pmreplroot         PADOFFSET
+op_pmreplrootpo        cPMOP->op_pmreplroot                    OP*/PADOFFSET
 #else
 op_pmstash     *(SV**)&cPMOP->op_pmstash               svindex
 op_pmreplrootgv        *(SV**)&cPMOP->op_pmreplroot            svindex
@@ -479,7 +492,7 @@ push_end    PL_endav                                svindex         x
 curstash       *(SV**)&PL_curstash                     svindex
 defstash       *(SV**)&PL_defstash                     svindex
 data           none                                    U8              x
-incav          *(SV**)&PL_incgv                        svindex
+incav          *(SV**)&GvAV(PL_incgv)                  svindex
 load_glob      none                                    svindex         x
 #ifdef USE_ITHREADS
 regex_padav    *(SV**)&PL_regex_padav                  svindex