This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Remove PMROOT and replace it with a small shell script. Er, magic.
[perl5.git] / bytecode.pl
index 1f30d9b..5747eae 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)],
 );
@@ -22,7 +22,8 @@ while (($from, $tos) = each %alias_to) {
 }
 
 my $c_header = <<'EOT';
-/*
+/* -*- buffer-read-only: t -*-
+ *
  *      Copyright (c) 1996-1999 Malcolm Beattie
  *
  *      You may distribute under the terms of either the GNU General Public
@@ -43,10 +44,11 @@ safer_unlink "ext/ByteLoader/byterun.c", "ext/ByteLoader/byterun.h", "ext/B/B/As
 # 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);
@@ -67,6 +69,7 @@ EOT
 # 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
@@ -103,6 +106,7 @@ bset_obj_store(pTHX_ struct byteloader_state *bstate, void *obj, I32 ix)
 int
 byterun(pTHX_ register struct byteloader_state *bstate)
 {
+    dVAR;
     register int insn;
     U32 ix;
     SV *specialsv_list[6];
@@ -143,6 +147,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 +170,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";
 
@@ -188,12 +196,15 @@ print BYTERUN_C <<'EOT';
     }
     return 0;
 }
+
+/* ex: set ro: */
 EOT
 
 #
 # 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;
@@ -243,6 +254,8 @@ for ($i = 0; $i < @optype - 1; $i++) {
 }
 printf BYTERUN_H "    OPt_%s\t\t/* %d */\n};\n\n", $optype[$i], $i;
 
+print BYTERUN_H "/* ex: set ro: */\n";
+
 #
 # Finish off insn_data and create array initialisers in Asmdata.pm
 #
@@ -318,6 +331,8 @@ or '&PL_sv_undef').
 Malcolm Beattie, C<mbeattie@sable.ox.ac.uk>
 
 =cut
+
+# ex: set ro:
 EOT
 
 
@@ -337,6 +352,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
@@ -359,12 +376,12 @@ sv_upgrade        bstate->bs_sv                           U8              x
 sv_refcnt      SvREFCNT(bstate->bs_sv)                 U32
 sv_refcnt_add  SvREFCNT(bstate->bs_sv)                 I32             x
 sv_flags       SvFLAGS(bstate->bs_sv)                  U32
-xrv            SvRV(bstate->bs_sv)                     svindex
+xrv            bstate->bs_sv                           svindex         x
 xpv            bstate->bs_sv                           none            x
-xpv_cur                SvCUR(bstate->bs_sv)                    STRLEN
-xpv_len                SvLEN(bstate->bs_sv)                    STRLEN
-xiv            SvIVX(bstate->bs_sv)                    IV
-xnv            SvNVX(bstate->bs_sv)                    NV
+xpv_cur                bstate->bs_sv                           STRLEN          x
+xpv_len                bstate->bs_sv                           STRLEN          x
+xiv            bstate->bs_sv                           IV              x
+xnv            bstate->bs_sv                           NV              x
 xlv_targoff    LvTARGOFF(bstate->bs_sv)                STRLEN
 xlv_targlen    LvTARGLEN(bstate->bs_sv)                STRLEN
 xlv_targ       LvTARG(bstate->bs_sv)                   svindex
@@ -402,10 +419,8 @@ av_pushx   bstate->bs_sv                           svindex         x
 av_push                bstate->bs_sv                           svindex         x
 xav_fill       AvFILLp(bstate->bs_sv)                  SSize_t
 xav_max                AvMAX(bstate->bs_sv)                    SSize_t
-xav_flags      AvFLAGS(bstate->bs_sv)                  U8
 xhv_riter      HvRITER(bstate->bs_sv)                  I32
 xhv_name       HvNAME(bstate->bs_sv)                   pvindex
-xhv_pmroot     *(OP**)&HvPMROOT(bstate->bs_sv)         opindex
 hv_store       bstate->bs_sv                           svindex         x
 sv_magic       bstate->bs_sv                           char            x
 mg_obj         SvMAGIC(bstate->bs_sv)->mg_obj          svindex
@@ -413,7 +428,7 @@ mg_private  SvMAGIC(bstate->bs_sv)->mg_private      U16
 mg_flags       SvMAGIC(bstate->bs_sv)->mg_flags        U8
 mg_name                SvMAGIC(bstate->bs_sv)                  pvcontents      x
 mg_namex       SvMAGIC(bstate->bs_sv)                  svindex         x
-xmg_stash      *(SV**)&SvSTASH(bstate->bs_sv)          svindex
+xmg_stash      bstate->bs_sv                           svindex         x
 gv_fetchpv     bstate->bs_sv                           strconst        x
 gv_fetchpvx    bstate->bs_sv                           strconst        x
 gv_stashpv     bstate->bs_sv                           strconst        x
@@ -436,7 +451,8 @@ op_sibling  PL_op->op_sibling                       opindex
 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
@@ -446,8 +462,8 @@ op_pmreplroot       cPMOP->op_pmreplroot                    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
@@ -486,7 +502,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