}
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)],
);
# Start with boilerplate for Asmdata.pm
#
open(ASMDATA_PM, ">ext/B/B/Asmdata.pm") or die "ext/B/B/Asmdata.pm: $!";
+binmode ASMDATA_PM;
print ASMDATA_PM $perl_header, <<'EOT';
package B::Asmdata;
-our $VERSION = '1.00';
+our $VERSION = '1.01';
use Exporter;
@ISA = qw(Exporter);
# Boilerplate for byterun.c
#
open(BYTERUN_C, ">ext/ByteLoader/byterun.c") or die "ext/ByteLoader/byterun.c: $!";
+binmode BYTERUN_C;
print BYTERUN_C $c_header, <<'EOT';
#define PERL_NO_GET_CONTEXT
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
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;
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";
# Write the instruction and optype enum constants into byterun.h
#
open(BYTERUN_H, ">ext/ByteLoader/byterun.h") or die "ext/ByteLoader/byterun.h: $!";
+binmode BYTERUN_H;
print BYTERUN_H $c_header, <<'EOT';
struct byteloader_fdata {
SV *datasv;
SV *bs_sv;
void **bs_obj_list;
int bs_obj_list_fill;
+ int bs_ix;
XPV bs_pv;
int bs_iv_overflows;
};
# 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
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
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
op_ppaddr PL_op->op_ppaddr strconst x
op_targ PL_op->op_targ PADOFFSET
op_type PL_op OPCODE x
-op_seq PL_op->op_seq U16
+op_opt PL_op->op_opt U8
+op_static PL_op->op_static U8
op_flags PL_op->op_flags U8
op_private PL_op->op_private U8
op_first cUNOP->op_first opindex
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_pmstashpv cPMOP pvindex x
+op_pmreplrootpo cPMOP->op_pmreplroot OP*/PADOFFSET
#else
op_pmstash *(SV**)&cPMOP->op_pmstash svindex
op_pmreplrootgv *(SV**)&cPMOP->op_pmreplroot svindex
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