STATIC U16 vmg_wizard_sig(pTHX_ SV *wiz) {
#define vmg_wizard_sig(W) vmg_wizard_sig(aTHX_ (W))
- char buf[8];
U16 sig;
if (SvROK(wiz)) {
{
dMY_CXT;
- if (!hv_exists(MY_CXT.wizards, buf, sprintf(buf, "%u", sig)))
+ char buf[8];
+ SV **old = hv_fetch(MY_CXT.wizards, buf, sprintf(buf, "%u", sig), 0);
+ if (!(old && SV2MGWIZ(*old)))
croak(vmg_invalid_wiz);
}
STATIC SV *vmg_wizard_wiz(pTHX_ SV *wiz) {
#define vmg_wizard_wiz(W) vmg_wizard_wiz(aTHX_ (W))
- char buf[8];
- SV **old;
U16 sig;
if (SvROK(wiz)) {
{
dMY_CXT;
- return (old = hv_fetch(MY_CXT.wizards, buf, sprintf(buf, "%u", sig), 0))
- ? *old : NULL;
+ char buf[8];
+ SV **old = hv_fetch(MY_CXT.wizards, buf, sprintf(buf, "%u", sig), 0);
+ if (!(old && SV2MGWIZ(*old)))
+ croak(vmg_invalid_wiz);
+
+ return *old;
}
}
STRLEN len;
char *sig = HePV(key, len);
SV *sv;
- const MGWIZ *w;
- MAGIC *mg;
- w = SV2MGWIZ(HeVAL(key));
- w = vmg_wizard_clone(w);
- sv = MGWIZ2SV(w);
- mg = sv_magicext(sv, NULL, PERL_MAGIC_ext, &vmg_wizard_vtbl, NULL, 0);
- mg->mg_private = SIG_WZO;
+ const MGWIZ *w = SV2MGWIZ(HeVAL(key));
+ if (w) {
+ MAGIC *mg;
+ w = vmg_wizard_clone(w);
+ sv = MGWIZ2SV(w);
+ mg = sv_magicext(sv, NULL, PERL_MAGIC_ext, &vmg_wizard_vtbl, NULL, 0);
+ mg->mg_private = SIG_WZO;
+ } else {
+ sv = MGWIZ2SV(NULL);
+ }
SvREADONLY_on(sv);
if (!hv_store(hv, sig, len, sv, HeHASH(key))) croak("%s during CLONE", vmg_globstorefail);
}
if (SvOK(svsig)) {
SV **old;
sig = vmg_sv2sig(svsig);
- if ((old = hv_fetch(MY_CXT.wizards, buf, sprintf(buf, "%u", sig), 0))) {
+ old = hv_fetch(MY_CXT.wizards, buf, sprintf(buf, "%u", sig), 0);
+ if (old && SV2MGWIZ(*old)) {
ST(0) = sv_2mortal(newRV_inc(*old));
XSRETURN(1);
}
SV *gensig()
PROTOTYPE:
+PREINIT:
+ U16 sig;
+ char buf[8];
CODE:
- RETVAL = newSVuv(vmg_gensig());
+ dMY_CXT;
+ sig = vmg_gensig();
+ if (!hv_store(MY_CXT.wizards, buf, sprintf(buf, "%u", sig), MGWIZ2SV(NULL), 0)) croak(vmg_globstorefail);
+ RETVAL = newSVuv(sig);
OUTPUT:
RETVAL
SV *ret;
CODE:
wiz = vmg_wizard_wiz(wiz);
- if (!wiz)
- XSRETURN_UNDEF;
if (items > 2) {
I32 i;
args = newAV();