summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bytecode.pl10
-rw-r--r--ext/ByteLoader/byterun.c2
2 files changed, 9 insertions, 3 deletions
diff --git a/bytecode.pl b/bytecode.pl
index d4b40fb263..68167e1050 100644
--- a/bytecode.pl
+++ b/bytecode.pl
@@ -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
diff --git a/ext/ByteLoader/byterun.c b/ext/ByteLoader/byterun.c
index 636c206c58..0a8afc627a 100644
--- a/ext/ByteLoader/byterun.c
+++ b/ext/ByteLoader/byterun.c
@@ -824,7 +824,7 @@ byterun(pTHX_ register struct byteloader_state *bstate)
{
PADOFFSET arg;
BGET_U32(arg);
- (PADOFFSET)cPMOP->op_pmreplroot = arg;
+ cPMOP->op_pmreplroot = (OP*)arg;
break;
}
#else