X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=ext%2FByteLoader%2Fbytecode.h;h=70a7238347540d9fc1c35fff793d05eabdb1af8a;hb=13330d4dbde017a5cb6fe72e1a42ab42c9e98501;hp=a9de88fbd9d78ff6586f3e560cd57d84c7f892fa;hpb=a243a48e99fa6345b1c8b09f3d98952fb43ec4a5;p=p5sagit%2Fp5-mst-13.2.git diff --git a/ext/ByteLoader/bytecode.h b/ext/ByteLoader/bytecode.h index a9de88f..70a7238 100644 --- a/ext/ByteLoader/bytecode.h +++ b/ext/ByteLoader/bytecode.h @@ -20,6 +20,10 @@ typedef char *pvindex; BGET_FREAD(&arg, sizeof(U32), 1) #define BGET_UV(arg) \ BGET_FREAD(&arg, sizeof(UV), 1) +#define BGET_PADOFFSET(arg) \ + BGET_FREAD(&arg, sizeof(PADOFFSET), 1) +#define BGET_long(arg) \ + BGET_FREAD(&arg, sizeof(long), 1) #define BGET_I32(arg) BGET_U32(arg) #define BGET_IV(arg) BGET_UV(arg) @@ -27,14 +31,14 @@ typedef char *pvindex; #define BGET_PV(arg) STMT_START { \ BGET_U32(arg); \ if (arg) { \ - New(666, bstate->bs_pv.xpv_pv, arg, char); \ - bl_read(bstate->bs_fdata, (void*)bstate->bs_pv.xpv_pv, arg, 1);\ - bstate->bs_pv.xpv_len = arg; \ - bstate->bs_pv.xpv_cur = arg - 1; \ + New(666, bstate->bs_pv.pvx, arg, char); \ + bl_read(bstate->bs_fdata, bstate->bs_pv.pvx, arg, 1); \ + bstate->bs_pv.xpv.xpv_len = arg; \ + bstate->bs_pv.xpv.xpv_cur = arg - 1; \ } else { \ - bstate->bs_pv.xpv_pv = 0; \ - bstate->bs_pv.xpv_len = 0; \ - bstate->bs_pv.xpv_cur = 0; \ + bstate->bs_pv.pvx = 0; \ + bstate->bs_pv.xpv.xpv_len = 0; \ + bstate->bs_pv.xpv.xpv_cur = 0; \ } \ } STMT_END @@ -64,7 +68,7 @@ typedef char *pvindex; arg = (char *) ary; \ } while (0) -#define BGET_pvcontents(arg) arg = bstate->bs_pv.xpv_pv +#define BGET_pvcontents(arg) arg = bstate->bs_pv.pvx #define BGET_strconst(arg) STMT_START { \ for (arg = PL_tokenbuf; (*arg = BGET_FGETC()); arg++) /* nothing */; \ arg = PL_tokenbuf; \ @@ -118,23 +122,30 @@ typedef char *pvindex; } STMT_END #define BSET_sv_magic(sv, arg) sv_magic(sv, Nullsv, arg, 0, 0) -#define BSET_mg_name(mg, arg) mg->mg_ptr = arg; mg->mg_len = bstate->bs_pv.xpv_cur +#define BSET_mg_name(mg, arg) mg->mg_ptr = arg; mg->mg_len = bstate->bs_pv.xpv.xpv_cur #define BSET_mg_namex(mg, arg) \ (mg->mg_ptr = (char*)SvREFCNT_inc((SV*)arg), \ mg->mg_len = HEf_SVKEY) +#define BSET_xmg_stash(sv, arg) *(SV**)&(((XPVMG*)SvANY(sv))->xmg_stash) = (arg) #define BSET_sv_upgrade(sv, arg) (void)SvUPGRADE(sv, arg) +#define BSET_xrv(sv, arg) SvRV_set(sv, arg) #define BSET_xpv(sv) do { \ - SvPV_set(sv, bstate->bs_pv.xpv_pv); \ - SvCUR_set(sv, bstate->bs_pv.xpv_cur); \ - SvLEN_set(sv, bstate->bs_pv.xpv_len); \ + SvPV_set(sv, bstate->bs_pv.pvx); \ + SvCUR_set(sv, bstate->bs_pv.xpv.xpv_cur); \ + SvLEN_set(sv, bstate->bs_pv.xpv.xpv_len); \ } while (0) +#define BSET_xpv_cur(sv, arg) SvCUR_set(sv, arg) +#define BSET_xpv_len(sv, arg) SvLEN_set(sv, arg) +#define BSET_xiv(sv, arg) SvIV_set(sv, arg) +#define BSET_xnv(sv, arg) SvNV_set(sv, arg) + #define BSET_av_extend(sv, arg) av_extend((AV*)sv, arg) #define BSET_av_push(sv, arg) av_push((AV*)sv, arg) #define BSET_av_pushx(sv, arg) (AvARRAY(sv)[++AvFILLp(sv)] = arg) #define BSET_hv_store(sv, arg) \ - hv_store((HV*)sv, bstate->bs_pv.xpv_pv, bstate->bs_pv.xpv_cur, arg, 0) -#define BSET_pv_free(pv) Safefree(pv.xpv_pv) + hv_store((HV*)sv, bstate->bs_pv.pvx, bstate->bs_pv.xpv.xpv_cur, arg, 0) +#define BSET_pv_free(p) Safefree(p) #ifdef USE_ITHREADS @@ -144,7 +155,7 @@ typedef char *pvindex; STMT_START { \ SV* repointer; \ REGEXP* rx = arg ? \ - CALLREGCOMP(aTHX_ arg, arg + bstate->bs_pv.xpv_cur, cPMOPx(o)) : \ + CALLREGCOMP(aTHX_ arg, arg + bstate->bs_pv.xpv.xpv_cur, cPMOPx(o)) : \ Null(REGEXP*); \ if(av_len((AV*) PL_regex_pad[0]) > -1) { \ repointer = av_pop((AV*)PL_regex_pad[0]); \ @@ -163,7 +174,7 @@ typedef char *pvindex; #define BSET_pregcomp(o, arg) \ STMT_START { \ PM_SETRE(((PMOP*)o), (arg ? \ - CALLREGCOMP(aTHX_ arg, arg + bstate->bs_pv.xpv_cur, cPMOPx(o)): \ + CALLREGCOMP(aTHX_ arg, arg + bstate->bs_pv.xpv.xpv_cur, cPMOPx(o)): \ Null(REGEXP*))); \ } STMT_END @@ -171,23 +182,30 @@ typedef char *pvindex; #define BSET_newsv(sv, arg) \ - STMT_START { \ - sv = NEWSV(0,0); \ - SvUPGRADE(sv, (arg)); \ - } STMT_END + switch(arg) { \ + case SVt_PVAV: \ + sv = (SV*)newAV(); \ + break; \ + case SVt_PVHV: \ + sv = (SV*)newHV(); \ + break; \ + default: \ + sv = NEWSV(0,0); \ + SvUPGRADE(sv, (arg)); \ + } #define BSET_newsvx(sv, arg) STMT_START { \ BSET_newsv(sv, arg & SVTYPEMASK); \ SvFLAGS(sv) = arg; \ BSET_OBJ_STOREX(sv); \ } STMT_END -#define BSET_newop(o, arg) \ - ((o = (OP*)safemalloc(arg)), memzero((char*)o,arg)) + +#define BSET_newop(o, arg) NewOpSz(666, o, arg) #define BSET_newopx(o, arg) STMT_START { \ register int sz = arg & 0x7f; \ - register OP* new = (OP*) safemalloc(sz);\ - memzero(new, sz); \ - /* new->op_next = o; XXX */ \ - o = new; \ + register OP* newop; \ + BSET_newop(newop, sz); \ + /* newop->op_next = o; XXX */ \ + o = newop; \ arg >>=7; \ BSET_op_type(o, arg); \ BSET_OBJ_STOREX(o); \ @@ -204,6 +222,8 @@ typedef char *pvindex; return 0; \ } STMT_END +#define BSET_op_pmstashpv(op, arg) PmopSTASHPV_set(op, arg) + /* * stolen from toke.c: better if that was a function. * in toke.c there are also #ifdefs for dosish systems and i/o layers @@ -327,6 +347,8 @@ typedef char *pvindex; mg_set(*hv_store(GvHV(gv_fetchpv("SIG", TRUE, SVt_PVHV)), \ name, strlen(name), cv, 0)) +#define BSET_xhv_name(hv, name) Perl_hv_name_set(aTHX_ (HV*)hv, name, strlen(name), 0) + /* NOTE: the bytecode header only sanity-checks the bytecode. If a script cares about * what version of Perl it's being called under, it should do a 'use 5.006_001' or * equivalent. However, since the header includes checks requiring an exact match in