- if (w->cb_data != NULL) { SvREFCNT_dec(SvRV(w->cb_data)); }
- if (w->cb_get != NULL) { SvREFCNT_dec(SvRV(w->cb_get)); }
- if (w->cb_set != NULL) { SvREFCNT_dec(SvRV(w->cb_set)); }
- if (w->cb_len != NULL) { SvREFCNT_dec(SvRV(w->cb_len)); }
- if (w->cb_clear != NULL) { SvREFCNT_dec(SvRV(w->cb_clear)); }
- if (w->cb_free != NULL) { SvREFCNT_dec(SvRV(w->cb_free)); }
-#if MGf_COPY
- if (w->cb_copy != NULL) { SvREFCNT_dec(SvRV(w->cb_copy)); }
-#endif /* MGf_COPY */
-#if 0 /* MGf_DUP */
- if (w->cb_dup != NULL) { SvREFCNT_dec(SvRV(w->cb_dup)); }
-#endif /* MGf_DUP */
-#if MGf_LOCAL
- if (w->cb_local != NULL) { SvREFCNT_dec(SvRV(w->cb_local)); }
-#endif /* MGf_LOCAL */
-#if VMG_UVAR
- if (w->cb_fetch != NULL) { SvREFCNT_dec(SvRV(w->cb_fetch)); }
- if (w->cb_store != NULL) { SvREFCNT_dec(SvRV(w->cb_store)); }
- if (w->cb_exists != NULL) { SvREFCNT_dec(SvRV(w->cb_exists)); }
- if (w->cb_delete != NULL) { SvREFCNT_dec(SvRV(w->cb_delete)); }
-#endif /* VMG_UVAR */
-
- Safefree(w->vtbl);
- Safefree(w);
-
- return 0;
-}
-
-STATIC MGVTBL vmg_wizard_vtbl = {
- NULL, /* get */
- NULL, /* set */
- NULL, /* len */
- NULL, /* clear */
- vmg_wizard_free, /* free */
-#if MGf_COPY
- NULL, /* copy */
-#endif /* MGf_COPY */
-#if MGf_DUP
- NULL, /* dup */
-#endif /* MGf_DUP */
-#if MGf_LOCAL
- NULL, /* local */
-#endif /* MGf_LOCAL */
-};
-
-STATIC U16 vmg_sv2sig(pTHX_ SV *sv) {
-#define vmg_sv2sig(S) vmg_sv2sig(aTHX_ (S))
- IV sig;
-
- if (SvIOK(sv)) {
- sig = SvIVX(sv);
- } else if (SvNOK(sv)) {
- sig = SvNVX(sv);
- } else if ((SvPOK(sv) && grok_number(SvPVX(sv), SvCUR(sv), NULL))) {
- sig = SvIV(sv);
- } else {
- croak(vmg_invalid_sig);
- }
-
- if (sig < SIG_MIN || sig > SIG_MAX)
- croak(vmg_invalid_sig);
-
- return sig;
-}
-
-STATIC U16 vmg_wizard_sig(pTHX_ SV *wiz) {
-#define vmg_wizard_sig(W) vmg_wizard_sig(aTHX_ (W))
- U16 sig;
-
- if (SvROK(wiz)) {
- sig = SV2MGWIZ(SvRV(wiz))->sig;
- } else if (SvOK(wiz)) {
- sig = vmg_sv2sig(wiz);
- } else {
- croak(vmg_invalid_wiz);
- }
-
- {
- dMY_CXT;
- 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 sig;
-}
-
-STATIC SV *vmg_wizard_wiz(pTHX_ SV *wiz) {
-#define vmg_wizard_wiz(W) vmg_wizard_wiz(aTHX_ (W))
- U16 sig;
-
- if (SvROK(wiz)) {
- wiz = SvRV(wiz);
-#if VMG_MULTIPLICITY
- if (SV2MGWIZ(wiz)->owner == aTHX)
- return wiz;
-#endif /* VMG_MULTIPLICITY */
- sig = SV2MGWIZ(wiz)->sig;
- } else if (SvOK(wiz)) {
- sig = vmg_sv2sig(wiz);
- } else {
- croak(vmg_invalid_wiz);
- }
-
- {
- dMY_CXT;
- char buf[8];
- SV **old = hv_fetch(MY_CXT.wizards, buf, sprintf(buf, "%u", sig), 0);
- if (!(old && SV2MGWIZ(*old)))
- croak(vmg_invalid_wiz);