my $c_header = <<'EOT';
/*
- * Copyright (c) 1996 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.
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;
#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
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 */
+void *bset_obj_store _((void *, I32));
+
enum {
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
#
xio_page_len IoPAGE_LEN(sv) long
xio_lines_left IoLINES_LEFT(sv) long
xio_top_name IoTOP_NAME(sv) pvcontents
-xio_top_gv IoTOP_GV(sv) svindex
+xio_top_gv *(SV**)&IoTOP_GV(sv) svindex
xio_fmt_name IoFMT_NAME(sv) pvcontents
-xio_fmt_gv IoFMT_GV(sv) svindex
+xio_fmt_gv *(SV**)&IoFMT_GV(sv) svindex
xio_bottom_name IoBOTTOM_NAME(sv) pvcontents
-xio_bottom_gv IoBOTTOM_GV(sv) svindex
+xio_bottom_gv *(SV**)&IoBOTTOM_GV(sv) svindex
xio_subprocess IoSUBPROCESS(sv) short
xio_type IoTYPE(sv) char
xio_flags IoFLAGS(sv) char
xcv_stash *(SV**)&CvSTASH(sv) svindex
xcv_start CvSTART(sv) opindex
xcv_root CvROOT(sv) opindex
-xcv_gv CvGV(sv) svindex
-xcv_filegv CvFILEGV(sv) svindex
+xcv_gv *(SV**)&CvGV(sv) svindex
+xcv_filegv *(SV**)&CvFILEGV(sv) svindex
xcv_depth CvDEPTH(sv) long
xcv_padlist *(SV**)&CvPADLIST(sv) svindex
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
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 cGVOP->op_gv svindex
+op_gv *(SV**)&cGVOP->op_gv svindex
op_pv cPVOP->op_pv pvcontents
op_pv_tr cPVOP->op_pv op_tr_array
op_redoop cLOOP->op_redoop opindex
op_lastop cLOOP->op_lastop opindex
cop_label cCOP->cop_label pvcontents
cop_stash *(SV**)&cCOP->cop_stash svindex
-cop_filegv cCOP->cop_filegv svindex
+cop_filegv *(SV**)&cCOP->cop_filegv svindex
cop_seq cCOP->cop_seq U32
cop_arybase cCOP->cop_arybase I32
cop_line cCOP->cop_line line_t