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 d4b40fb..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);
@@ -143,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;
 
@@ -162,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";
 
@@ -337,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
@@ -447,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