X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=Magic.xs;h=1e6a77c823a99a7ddcdf3e3ffeece4b86dd630f4;hb=10f8553bdaa6203542526b85e154d27aa48dc832;hp=3c4cd3347faa74ceab8869d267110c38e91823d5;hpb=8991ed7c69639359044bebf70ffaf8585b885252;p=perl%2Fmodules%2FVariable-Magic.git diff --git a/Magic.xs b/Magic.xs index 3c4cd33..1e6a77c 100644 --- a/Magic.xs +++ b/Magic.xs @@ -406,11 +406,6 @@ typedef struct { START_MY_CXT -/* --- Signatures ---------------------------------------------------------- */ - -#define SIG_WZO ((U16) (0x3891)) -#define SIG_WIZ ((U16) (0x3892)) - /* --- structure ---------------------------------------------- */ #if VMG_THREADSAFE @@ -644,7 +639,7 @@ STATIC SV *vmg_wizard_sv_new(pTHX_ const vmg_wizard *w) { if (w) { MAGIC *mg = sv_magicext(wiz, NULL, PERL_MAGIC_ext, &vmg_wizard_sv_vtbl, (const char *) w, 0); - mg->mg_private = SIG_WZO; + mg->mg_private = 0; #if VMG_THREADSAFE mg->mg_flags |= MGf_DUP; #endif @@ -775,9 +770,10 @@ STATIC void vmg_uvar_del(SV *sv, MAGIC *prevmagic, MAGIC *mg, MAGIC *moremagic) STATIC UV vmg_cast(pTHX_ SV *sv, const vmg_wizard *w, const SV *wiz, SV **args, I32 items) { #define vmg_cast(S, W, WIZ, A, I) vmg_cast(aTHX_ (S), (W), (WIZ), (A), (I)) - MAGIC *mg; - SV *data; - U32 oldgmg; + MAGIC *mg; + MGVTBL *t; + SV *data; + U32 oldgmg; if (vmg_find(sv, w)) return 1; @@ -785,19 +781,22 @@ STATIC UV vmg_cast(pTHX_ SV *sv, const vmg_wizard *w, const SV *wiz, SV **args, oldgmg = SvGMAGICAL(sv); data = (w->cb_data) ? vmg_data_new(w->cb_data, sv, args, items) : NULL; + + t = vmg_vtable_vtbl(w->vtable); + mg = sv_magicext(sv, data, PERL_MAGIC_ext, t, (const char *) wiz, HEf_SVKEY); + mg->mg_private = 0; + /* sv_magicext() calls mg_magical and increments data's refcount */ - mg = sv_magicext(sv, data, PERL_MAGIC_ext, vmg_vtable_vtbl(w->vtable), - (const char *) wiz, HEf_SVKEY); SvREFCNT_dec(data); - mg->mg_private = SIG_WIZ; - if (w->cb_copy) + + if (t->svt_copy) mg->mg_flags |= MGf_COPY; #if 0 - if (w->cb_dup) + if (t->svt_dup) mg->mg_flags |= MGf_DUP; #endif #if MGf_LOCAL - if (w->cb_local) + if (t->svt_local) mg->mg_flags |= MGf_LOCAL; #endif /* MGf_LOCAL */ @@ -1196,13 +1195,13 @@ STATIC int vmg_svt_free(pTHX_ SV *sv, MAGIC *mg) { return ret; } -STATIC int vmg_svt_copy(pTHX_ SV *sv, MAGIC *mg, SV *nsv, const char *key, -# if VMG_HAS_PERL_MAINT(5, 11, 0, 33256) || VMG_HAS_PERL(5, 12, 0) - I32 keylen -# else - int keylen -# endif - ) { +#if VMG_HAS_PERL_MAINT(5, 11, 0, 33256) || VMG_HAS_PERL(5, 12, 0) +# define VMG_SVT_COPY_KEYLEN_TYPE I32 +#else +# define VMG_SVT_COPY_KEYLEN_TYPE int +#endif + +STATIC int vmg_svt_copy(pTHX_ SV *sv, MAGIC *mg, SV *nsv, const char *key, VMG_SVT_COPY_KEYLEN_TYPE keylen) { const vmg_wizard *w = vmg_wizard_from_mg_nocheck(mg); SV *keysv; int ret;