X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=Magic.xs;h=814a6af19004a662f7e2906ebfaecf5d4af3c9cb;hb=077519905e1c99ca8cf60cca6825fddce7696dff;hp=e9d9debe0c20c2d17b671d64682ef46be9d52aac;hpb=da95f9db8211008bbb415d2de11e3616daf4017e;p=perl%2Fmodules%2FVariable-Magic.git diff --git a/Magic.xs b/Magic.xs index e9d9deb..814a6af 100644 --- a/Magic.xs +++ b/Magic.xs @@ -229,8 +229,10 @@ STATIC const char *const vmg_opclassnames[] = { }; STATIC opclass vmg_opclass(const OP *o) { +#if 0 if (!o) return OPc_NULL; +#endif if (o->op_type == 0) return (o->op_flags & OPf_KIDS) ? OPc_UNOP : OPc_BASEOP; @@ -335,8 +337,7 @@ STATIC U16 vmg_gensig(pTHX) { char buf[8]; dMY_CXT; - if (HvKEYS(MY_CXT.wizards) >= SIG_NBR) - croak(vmg_toomanysigs); + if (HvKEYS(MY_CXT.wizards) >= SIG_NBR) croak(vmg_toomanysigs); do { sig = SIG_NBR * Drand01() + SIG_MIN; @@ -1088,7 +1089,6 @@ STATIC U16 vmg_sv2sig(pTHX_ SV *sv) { 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)) { @@ -1101,7 +1101,9 @@ STATIC U16 vmg_wizard_sig(pTHX_ SV *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); } @@ -1110,8 +1112,6 @@ STATIC U16 vmg_wizard_sig(pTHX_ SV *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)) { @@ -1129,8 +1129,12 @@ STATIC SV *vmg_wizard_wiz(pTHX_ SV *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; } } @@ -1255,13 +1259,16 @@ CODE: 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); } @@ -1315,7 +1322,8 @@ CODE: 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); } @@ -1378,8 +1386,14 @@ OUTPUT: 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 @@ -1398,8 +1412,6 @@ PREINIT: SV *ret; CODE: wiz = vmg_wizard_wiz(wiz); - if (!wiz) - XSRETURN_UNDEF; if (items > 2) { I32 i; args = newAV();