X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=ext%2FB%2FB.xs;h=eca6f08870c718c0e8607c09125f275b76122f9b;hb=597c4554ca87aa4325a00c70a0fbb22acbfcfa07;hp=75fb33bf320954343a7b00efc3a5fc175497ebc1;hpb=da51bb9b4f7f527464b5e38aca8bcb956de1bbbc;p=p5sagit%2Fp5-mst-13.2.git diff --git a/ext/B/B.xs b/ext/B/B.xs index 75fb33b..eca6f08 100644 --- a/ext/B/B.xs +++ b/ext/B/B.xs @@ -26,7 +26,9 @@ static const char* const svclassnames[] = { #endif "B::IV", "B::NV", +#if PERL_VERSION <= 10 "B::RV", +#endif "B::PV", "B::PVIV", "B::PVNV", @@ -34,6 +36,9 @@ static const char* const svclassnames[] = { #if PERL_VERSION <= 8 "B::BM", #endif +#if PERL_VERSION >= 11 + "B::REGEXP", +#endif #if PERL_VERSION >= 9 "B::GV", #endif @@ -251,6 +256,7 @@ make_sv_object(pTHX_ SV *arg, SV *sv) return arg; } +#if PERL_VERSION >= 9 static SV * make_temp_object(pTHX_ SV *arg, SV *temp) { @@ -302,21 +308,18 @@ make_warnings_object(pTHX_ SV *arg, STRLEN *warnings) static SV * make_cop_io_object(pTHX_ SV *arg, COP *cop) { - if (CopHINTS_get(cop) & HINT_LEXICAL_IO) { - /* I feel you should be able to simply SvREFCNT_inc the return value - from this, but if you do (and restore the line - my $ioix = $cop->io->ix; - in B::COP::bsave in Bytecode.pm, then you get errors about - "attempt to free temp prematurely ... during global destruction. - The SV's flags are consistent with the error, but quite how the - temp escaped from the save stack is not clear. */ - SV *value = Perl_refcounted_he_fetch(aTHX_ cop->cop_hints_hash, - 0, "open", 4, 0, 0); + SV *const value = newSV(0); + + Perl_emulate_cop_io(aTHX_ cop, value); + + if(SvOK(value)) { return make_temp_object(aTHX_ arg, newSVsv(value)); } else { + SvREFCNT_dec(value); return make_sv_object(aTHX_ arg, NULL); } } +#endif static SV * make_mg_object(pTHX_ SV *arg, MAGIC *mg) @@ -460,6 +463,16 @@ cchar(pTHX_ SV *sv) return sstr; } +#if PERL_VERSION >= 9 +# define PMOP_pmreplstart(o) o->op_pmstashstartu.op_pmreplstart +# define PMOP_pmreplroot(o) o->op_pmreplrootu.op_pmreplroot +#else +# define PMOP_pmreplstart(o) o->op_pmreplstart +# define PMOP_pmreplroot(o) o->op_pmreplroot +# define PMOP_pmpermflags(o) o->op_pmpermflags +# define PMOP_pmdynflags(o) o->op_pmdynflags +#endif + static void walkoptree(pTHX_ SV *opsv, const char *method) { @@ -489,7 +502,7 @@ walkoptree(pTHX_ SV *opsv, const char *method) } } if (o && (cc_opclass(aTHX_ o) == OPc_PMOP) && o->op_type != OP_PUSHRE - && (kid = cPMOPo->op_pmreplroot)) + && (kid = PMOP_pmreplroot(cPMOPo))) { sv_setiv(newSVrv(opsv, cc_opclassname(aTHX_ kid)), PTR2IV(kid)); walkoptree(aTHX_ opsv, method); @@ -515,7 +528,7 @@ oplist(pTHX_ OP *o, SV **SP) XPUSHs(opsv); switch (o->op_type) { case OP_SUBST: - SP = oplist(aTHX_ cPMOPo->op_pmreplstart, SP); + SP = oplist(aTHX_ PMOP_pmreplstart(cPMOPo), SP); continue; case OP_SORT: if (o->op_flags & OPf_STACKED && o->op_flags & OPf_SPECIAL) { @@ -557,6 +570,9 @@ typedef SV *B__IV; typedef SV *B__PV; typedef SV *B__NV; typedef SV *B__PVMG; +#if PERL_VERSION >= 11 +typedef SV *B__REGEXP; +#endif typedef SV *B__PVLV; typedef SV *B__BM; typedef SV *B__RV; @@ -569,7 +585,9 @@ typedef IO *B__IO; typedef MAGIC *B__MAGIC; typedef HE *B__HE; +#if PERL_VERSION >= 9 typedef struct refcounted_he *B__RHE; +#endif MODULE = B PACKAGE = B PREFIX = B_ @@ -588,7 +606,7 @@ BOOT: specialsv_list[5] = (SV *) pWARN_NONE; specialsv_list[6] = (SV *) pWARN_STD; #if PERL_VERSION <= 8 -# define CVf_ASSERTION 0 +# define OPpPAD_STATE 0 #endif #include "defsubs.h" } @@ -597,7 +615,11 @@ BOOT: #define B_init_av() PL_initav #define B_inc_gv() PL_incgv #define B_check_av() PL_checkav_save -#define B_unitcheck_av() PL_unitcheckav_save +#if PERL_VERSION > 8 +# define B_unitcheck_av() PL_unitcheckav_save +#else +# define B_unitcheck_av() NULL +#endif #define B_begin_av() PL_beginav_save #define B_end_av() PL_endav #define B_main_root() PL_main_root @@ -622,9 +644,13 @@ B_init_av() B::AV B_check_av() +#if PERL_VERSION >= 9 + B::AV B_unitcheck_av() +#endif + B::AV B_begin_av() @@ -828,7 +854,6 @@ threadsv_names() #define OP_type(o) o->op_type #if PERL_VERSION >= 9 # define OP_opt(o) o->op_opt -# define OP_static(o) o->op_static #else # define OP_seq(o) o->op_seq #endif @@ -891,14 +916,10 @@ OP_type(o) #if PERL_VERSION >= 9 -U8 +U16 OP_opt(o) B::OP o -U8 -OP_static(o) - B::OP o - #else U16 @@ -917,7 +938,7 @@ OP_private(o) #if PERL_VERSION >= 9 -U8 +U16 OP_spare(o) B::OP o @@ -968,22 +989,20 @@ LISTOP_children(o) OUTPUT: RETVAL -#define PMOP_pmreplroot(o) o->op_pmreplroot -#define PMOP_pmreplstart(o) o->op_pmreplstart #define PMOP_pmnext(o) o->op_pmnext #define PMOP_pmregexp(o) PM_GETRE(o) #ifdef USE_ITHREADS #define PMOP_pmoffset(o) o->op_pmoffset -#define PMOP_pmstashpv(o) o->op_pmstashpv +#define PMOP_pmstashpv(o) PmopSTASHPV(o); #else -#define PMOP_pmstash(o) o->op_pmstash +#define PMOP_pmstash(o) PmopSTASH(o); #endif #define PMOP_pmflags(o) o->op_pmflags -#define PMOP_pmpermflags(o) o->op_pmpermflags -#define PMOP_pmdynflags(o) o->op_pmdynflags MODULE = B PACKAGE = B::PMOP PREFIX = PMOP_ +#if PERL_VERSION <= 8 + void PMOP_pmreplroot(o) B::PMOP o @@ -993,26 +1012,55 @@ PMOP_pmreplroot(o) root = o->op_pmreplroot; /* OP_PUSHRE stores an SV* instead of an OP* in op_pmreplroot */ if (o->op_type == OP_PUSHRE) { -#ifdef USE_ITHREADS +# ifdef USE_ITHREADS sv_setiv(ST(0), INT2PTR(PADOFFSET,root) ); -#else +# else sv_setiv(newSVrv(ST(0), root ? svclassnames[SvTYPE((SV*)root)] : "B::SV"), PTR2IV(root)); -#endif +# endif } else { sv_setiv(newSVrv(ST(0), cc_opclassname(aTHX_ root)), PTR2IV(root)); } +#else + +void +PMOP_pmreplroot(o) + B::PMOP o + CODE: + ST(0) = sv_newmortal(); + if (o->op_type == OP_PUSHRE) { +# ifdef USE_ITHREADS + sv_setiv(ST(0), o->op_pmreplrootu.op_pmtargetoff); +# else + GV *const target = o->op_pmreplrootu.op_pmtargetgv; + sv_setiv(newSVrv(ST(0), target ? + svclassnames[SvTYPE((SV*)target)] : "B::SV"), + PTR2IV(target)); +# endif + } + else { + OP *const root = o->op_pmreplrootu.op_pmreplroot; + sv_setiv(newSVrv(ST(0), cc_opclassname(aTHX_ root)), + PTR2IV(root)); + } + +#endif + B::OP PMOP_pmreplstart(o) B::PMOP o +#if PERL_VERSION < 9 + B::PMOP PMOP_pmnext(o) B::PMOP o +#endif + #ifdef USE_ITHREADS IV @@ -1035,6 +1083,8 @@ U32 PMOP_pmflags(o) B::PMOP o +#if PERL_VERSION < 9 + U32 PMOP_pmpermflags(o) B::PMOP o @@ -1043,6 +1093,8 @@ U8 PMOP_pmdynflags(o) B::PMOP o +#endif + void PMOP_precomp(o) B::PMOP o @@ -1051,7 +1103,21 @@ PMOP_precomp(o) ST(0) = sv_newmortal(); rx = PM_GETRE(o); if (rx) - sv_setpvn(ST(0), rx->precomp, rx->prelen); + sv_setpvn(ST(0), RX_PRECOMP(rx), RX_PRELEN(rx)); + +#if PERL_VERSION >= 9 + +void +PMOP_reflags(o) + B::PMOP o + REGEXP * rx = NO_INIT + CODE: + ST(0) = sv_newmortal(); + rx = PM_GETRE(o); + if (rx) + sv_setuv(ST(0), RX_EXTFLAGS(rx)); + +#endif #define SVOP_sv(o) cSVOPo->op_sv #define SVOP_gv(o) ((GV*)cSVOPo->op_sv) @@ -1070,7 +1136,7 @@ SVOP_gv(o) #define PADOP_sv(o) (o->op_padix ? PAD_SVl(o->op_padix) : Nullsv) #define PADOP_gv(o) ((o->op_padix \ && SvTYPE(PAD_SVl(o->op_padix)) == SVt_PVGV) \ - ? (GV*)PAD_SVl(o->op_padix) : Nullgv) + ? (GV*)PAD_SVl(o->op_padix) : (GV *)NULL) MODULE = B PACKAGE = B::PADOP PREFIX = PADOP_ @@ -1129,7 +1195,7 @@ B::OP LOOP_lastop(o) B::LOOP o -#define COP_label(o) o->cop_label +#define COP_label(o) CopLABEL(o) #define COP_stashpv(o) CopSTASHPV(o) #define COP_stash(o) CopSTASH(o) #define COP_file(o) CopFILE(o) @@ -1138,13 +1204,27 @@ LOOP_lastop(o) #define COP_arybase(o) CopARYBASE_get(o) #define COP_line(o) CopLINE(o) #define COP_hints(o) CopHINTS_get(o) +#if PERL_VERSION < 9 +# define COP_warnings(o) o->cop_warnings +# define COP_io(o) o->cop_io +#endif MODULE = B PACKAGE = B::COP PREFIX = COP_ +#if PERL_VERSION >= 11 + +const char * +COP_label(o) + B::COP o + +#else + char * COP_label(o) B::COP o +#endif + char * COP_stashpv(o) B::COP o @@ -1174,6 +1254,8 @@ U32 COP_line(o) B::COP o +#if PERL_VERSION >= 9 + void COP_warnings(o) B::COP o @@ -1188,10 +1270,6 @@ COP_io(o) ST(0) = make_cop_io_object(aTHX_ sv_newmortal(), o); XSRETURN(1); -U32 -COP_hints(o) - B::COP o - B::RHE COP_hints_hash(o) B::COP o @@ -1200,6 +1278,22 @@ COP_hints_hash(o) OUTPUT: RETVAL +#else + +B::SV +COP_warnings(o) + B::COP o + +B::SV +COP_io(o) + B::COP o + +#endif + +U32 +COP_hints(o) + B::COP o + MODULE = B PACKAGE = B::SV U32 @@ -1284,6 +1378,24 @@ packiv(sv) ST(0) = sv_2mortal(newSVpvn((char *)&w, 4)); } + +#if PERL_VERSION >= 11 + +B::SV +RV(sv) + B::IV sv + CODE: + if( SvROK(sv) ) { + RETVAL = SvRV(sv); + } + else { + croak( "argument is not SvROK" ); + } + OUTPUT: + RETVAL + +#endif + MODULE = B PACKAGE = B::NV PREFIX = Sv NV @@ -1310,12 +1422,16 @@ U32 PARENT_FAKELEX_FLAGS(sv) B::NV sv +#if PERL_VERSION < 11 + MODULE = B PACKAGE = B::RV PREFIX = Sv B::SV SvRV(sv) B::RV sv +#endif + MODULE = B PACKAGE = B::PV PREFIX = Sv char* @@ -1394,6 +1510,29 @@ B::HV SvSTASH(sv) B::PVMG sv +MODULE = B PACKAGE = B::REGEXP + +#if PERL_VERSION >= 11 + +IV +REGEX(sv) + B::REGEXP sv + CODE: + /* FIXME - can we code this method more efficiently? */ + RETVAL = PTR2IV(sv); + OUTPUT: + RETVAL + +SV* +precomp(sv) + B::REGEXP sv + CODE: + RETVAL = newSVpvn( RX_PRECOMP(sv), RX_PRELEN(sv) ); + OUTPUT: + RETVAL + +#endif + #define MgMOREMAGIC(mg) mg->mg_moremagic #define MgPRIVATE(mg) mg->mg_private #define MgTYPE(mg) mg->mg_type @@ -1454,7 +1593,7 @@ precomp(mg) REGEXP* rx = (REGEXP*)mg->mg_obj; RETVAL = Nullsv; if( rx ) - RETVAL = newSVpvn( rx->precomp, rx->prelen ); + RETVAL = newSVpvn( RX_PRECOMP(rx), RX_PRELEN(rx) ); } else { croak( "precomp is only meaningful on r-magic" ); @@ -1538,6 +1677,18 @@ is_empty(gv) OUTPUT: RETVAL +bool +isGV_with_GP(gv) + B::GV gv + CODE: +#if PERL_VERSION >= 9 + RETVAL = isGV_with_GP(gv) ? TRUE : FALSE; +#else + RETVAL = TRUE; /* In 5.8 and earlier they all are. */ +#endif + OUTPUT: + RETVAL + void* GvGP(gv) B::GV gv @@ -1646,10 +1797,14 @@ B::GV IoBOTTOM_GV(io) B::IO io +#if PERL_VERSION <= 8 + short IoSUBPROCESS(io) B::IO io +#endif + bool IsSTD(io,name) B::IO io @@ -1860,7 +2015,7 @@ HvARRAY(hv) (void)hv_iterinit(hv); EXTEND(sp, HvKEYS(hv) * 2); while ((sv = hv_iternextsv(hv, &key, &len))) { - PUSHs(newSVpvn(key, len)); + mPUSHp(key, len); PUSHs(make_sv_object(aTHX_ sv_newmortal(), sv)); } } @@ -1881,6 +2036,8 @@ HeSVKEY_force(he) MODULE = B PACKAGE = B::RHE PREFIX = RHE_ +#if PERL_VERSION >= 9 + SV* RHE_HASH(h) B::RHE h @@ -1888,3 +2045,5 @@ RHE_HASH(h) RETVAL = newRV( (SV*)Perl_refcounted_he_chain_2hv(aTHX_ h) ); OUTPUT: RETVAL + +#endif