if (hv_delete(MY_CXT.wizards, buf, sprintf(buf, "%u", w->sig), 0) != wiz)
return 0;
}
- SvFLAGS(wiz) |= SVf_BREAK;
- FREETMPS;
+
+ /* Unmortalize the wizard to avoid it being freed in weird places. */
+ if (SvTEMP(wiz) && !SvREFCNT(wiz)) {
+ const I32 myfloor = PL_tmps_floor;
+ I32 i;
+ for (i = PL_tmps_ix; i > myfloor; --i) {
+ if (PL_tmps_stack[i] == wiz)
+ PL_tmps_stack[i] = NULL;
+ }
+ }
if (w->cb_data) SvREFCNT_dec(SvRV(w->cb_data));
if (w->cb_get) SvREFCNT_dec(SvRV(w->cb_get));
SV *getsig(SV *wiz)
PROTOTYPE: $
+PREINIT:
+ U16 sig;
CODE:
- if (!SvROK(wiz))
- croak(vmg_invalid_wiz);
- RETVAL = newSVuv(SV2MGWIZ(SvRV(wiz))->sig);
+ sig = vmg_wizard_sig(wiz);
+ RETVAL = newSVuv(sig);
OUTPUT:
RETVAL