X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=ext%2FOpcode%2FOpcode.xs;h=e2940598569e875737ee8cc2da19fd9aa7d73f88;hb=8c7314f9ab22287a19960f7531f5ca7120cc6843;hp=e191ec7c9c66ccbf149fd4aa8f0da8b4123d9238;hpb=72503137b2e9ea029110e27e896f6f1ccd8c0e8a;p=p5sagit%2Fp5-mst-13.2.git diff --git a/ext/Opcode/Opcode.xs b/ext/Opcode/Opcode.xs index e191ec7..e294059 100644 --- a/ext/Opcode/Opcode.xs +++ b/ext/Opcode/Opcode.xs @@ -233,6 +233,26 @@ BOOT: warn("opset_len %ld\n", (long)opset_len); op_names_init(aTHX); +void +_safe_pkg_prep(Package) + char * Package +PPCODE: + HV *hv; + ENTER; + + hv = gv_stashpv(Package, GV_ADDWARN); /* should exist already */ + + if (strNE(HvNAME(hv),"main")) { + Safefree(HvNAME(hv)); + HvNAME(hv) = savepv("main"); /* make it think it's in main:: */ + hv_store(hv,"_",1,(SV *)PL_defgv,0); /* connect _ to global */ + SvREFCNT_inc((SV *)PL_defgv); /* want to keep _ around! */ + } + LEAVE; + + + + void _safe_call_sv(Package, mask, codesv) @@ -253,6 +273,7 @@ PPCODE: save_hptr(&PL_defstash); /* save current default stash */ /* the assignment to global defstash changes our sense of 'main' */ PL_defstash = gv_stashpv(Package, GV_ADDWARN); /* should exist already */ + save_hptr(&PL_curstash); PL_curstash = PL_defstash; @@ -265,6 +286,7 @@ PPCODE: /* %INC must be clean for use/require in compartment */ save_hash(PL_incgv); + sv_free((SV*)GvHV(PL_incgv)); /* get rid of what save_hash gave us*/ GvHV(PL_incgv) = (HV*)SvREFCNT_inc(GvHV(gv_HVadd(gv_fetchpv("INC",TRUE,SVt_PVHV)))); PUSHMARK(SP);