X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=bytecode.pl;h=2e3f9c6086d6637a4fcb5871dd3118b3d9940b51;hb=dc45a647708b6c5442e1362e6b6e7a2583c30346;hp=f24f379006e11cd9053eb6e67c77ef84b6106add;hpb=ed65db6c6bc1b1e4dbabdf2bae93837e52fa7473;p=p5sagit%2Fp5-mst-13.2.git diff --git a/bytecode.pl b/bytecode.pl index f24f379..2e3f9c6 100644 --- a/bytecode.pl +++ b/bytecode.pl @@ -20,7 +20,7 @@ while (($from, $tos) = each %alias_to) { my $c_header = <<'EOT'; /* - * Copyright (c) 1996, 1997 Malcolm Beattie + * Copyright (c) 1996-1998 Malcolm Beattie * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. @@ -34,20 +34,12 @@ EOT my $perl_header; ($perl_header = $c_header) =~ s{[/ ]?\*/?}{#}g; -if (-f "byterun.c") { - rename("byterun.c", "byterun.c.old"); -} -if (-f "byterun.h") { - rename("byterun.h", "byterun.h.old"); -} -if (-f "Asmdata.pm") { - rename("Asmdata.pm", "Asmdata.pm.old"); -} +unlink "byterun.c", "byterun.h", "ext/B/B/Asmdata.pm"; # # Start with boilerplate for Asmdata.pm # -open(ASMDATA_PM, ">Asmdata.pm") or die "Asmdata.pm: $!"; +open(ASMDATA_PM, ">ext/B/B/Asmdata.pm") or die "ext/B/B/Asmdata.pm: $!"; print ASMDATA_PM $perl_header, <<'EOT'; package B::Asmdata; use Exporter; @@ -73,20 +65,30 @@ print BYTERUN_C $c_header, <<'EOT'; #include "EXTERN.h" #include "perl.h" -#include "bytecode.h" -#include "byterun.h" + +void * +bset_obj_store(void *obj, I32 ix) +{ + if (ix > obj_list_fill) { + if (obj_list_fill == -1) + New(666, obj_list, ix + 1, void*); + else + Renew(obj_list, ix + 1, void*); + obj_list_fill = ix; + } + obj_list[ix] = obj; + return obj; +} #ifdef INDIRECT_BGET_MACROS -void byterun(bs) -struct bytestream bs; +void byterun(struct bytestream bs) #else -void byterun(fp) -FILE *fp; +void byterun(PerlIO *fp) #endif /* INDIRECT_BGET_MACROS */ { dTHR; int insn; - while ((insn = FGETC()) != EOF) { + while ((insn = BGET_FGETC()) != EOF) { switch (insn) { EOT @@ -163,18 +165,12 @@ struct bytestream { int (*fread)(char *, size_t, size_t, void*); void (*freadpv)(U32, void*); }; -void freadpv _((U32, void *)); void byterun _((struct bytestream)); #else -void byterun _((FILE *)); +void byterun _((PerlIO *)); #endif /* INDIRECT_BGET_MACROS */ -#ifndef PATCHLEVEL -#include "patchlevel.h" -#endif -#if PATCHLEVEL < 4 || (PATCHLEVEL == 4 && SUBVERSION < 50) -#define dTHR extern int errno -#endif +void *bset_obj_store _((void *, I32)); enum { EOT @@ -220,13 +216,14 @@ print BYTERUN_H <<'EOT'; EOT printf BYTERUN_H <<'EOT', scalar(@specialsv); -EXT SV * specialsv_list[%d] -#ifdef DOINIT +EXT SV * specialsv_list[%d]; +#define INIT_SPECIALSV_LIST STMT_START { \ EOT -print BYTERUN_H "= { ", join(", ", @specialsv), " }\n"; +for ($i = 0; $i < @specialsv; $i++) { + print BYTERUN_H "\tspecialsv_list[$i] = $specialsv[$i]; \\\n"; +} print BYTERUN_H <<'EOT'; -#endif /* DOINIT */ -; + } STMT_END EOT # @@ -310,7 +307,7 @@ xcv_outside *(SV**)&CvOUTSIDE(sv) svindex xcv_flags CvFLAGS(sv) U8 av_extend sv SSize_t x av_push sv svindex x -xav_fill AvFILL(sv) SSize_t +xav_fill AvFILLp(sv) SSize_t xav_max AvMAX(sv) SSize_t xav_flags AvFLAGS(sv) U8 xhv_riter HvRITER(sv) I32 @@ -356,10 +353,8 @@ op_pmreplrootgv *(SV**)&cPMOP->op_pmreplroot svindex op_pmreplstart cPMOP->op_pmreplstart opindex op_pmnext *(OP**)&cPMOP->op_pmnext opindex pregcomp op pvcontents x -op_pmshort cPMOP->op_pmshort svindex op_pmflags cPMOP->op_pmflags U16 op_pmpermflags cPMOP->op_pmpermflags U16 -op_pmslen cPMOP->op_pmslen char op_sv cSVOP->op_sv svindex op_gv *(SV**)&cGVOP->op_gv svindex op_pv cPVOP->op_pv pvcontents