X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=Magic.xs;h=89df570ec4d896ae54599ad0408221dccbcb1a64;hb=201d2874479e003bb82662085516a07aa04391e2;hp=bfc75c9400048207f4e9ff5b59c980a14cc91b00;hpb=8d799ecef898c3eae133d58ce629b9b2340c0ac2;p=perl%2Fmodules%2FVariable-Magic.git diff --git a/Magic.xs b/Magic.xs index bfc75c9..89df570 100644 --- a/Magic.xs +++ b/Magic.xs @@ -45,10 +45,19 @@ #endif #ifndef dMY_CXT -# define MY_CXT vmg_globaldata # define dMY_CXT +# undef MY_CXT +# define MY_CXT vmg_globaldata +# undef START_MY_CXT # define START_MY_CXT STATIC my_cxt_t MY_CXT; +# undef MY_CXT_INIT # define MY_CXT_INIT +# undef MY_CXT_CLONE +# undef aMY_CXT +# undef pMY_CXT +# define VMG_THREADSAFE 0 +#else +# define VMG_THREADSAFE 1 #endif #ifndef PERL_MAGIC_ext @@ -129,6 +138,23 @@ typedef struct { START_MY_CXT +STATIC void vmg_cxt_init +#if defined(pMY_CXT) && defined(aMY_CXT) + (pTHX_ pMY_CXT) { +# define vmg_cxt_init() vmg_cxt_init(aTHX_ aMY_CXT) +#else + (pTHX) { + dMY_CXT; +# define vmg_cxt_init() vmg_cxt_init(aTHX) +#endif + MY_CXT.wizz = newHV(); +#ifdef USE_ITHREADS + HvSHAREKEYS_off(MY_CXT.wizz); +#endif + MY_CXT.count = 0; + return; +} + /* --- Signatures ---------------------------------------------------------- */ #define SIG_MIN ((U16) (1u << 8)) @@ -266,17 +292,18 @@ STATIC UV vmg_cast(pTHX_ SV *sv, SV *wiz, AV *args) { data = (w->cb_data) ? vmg_data_new(w->cb_data, sv, args) : NULL; mg = sv_magicext(sv, data, PERL_MAGIC_ext, w->vtbl, (const char *) wiz, HEf_SVKEY); mg->mg_private = w->sig; - mg->mg_flags = mg->mg_flags #if MGf_COPY - | MGf_COPY + if (w->cb_copy) + mg->mg_flags |= MGf_COPY; #endif /* MGf_COPY */ #if MGf_DUP - | MGf_DUP + if (w->cb_dup) + mg->mg_flags |= MGf_DUP; #endif /* MGf_DUP */ #if MGf_LOCAL - | MGf_LOCAL + if (w->cb_local) + mg->mg_flags |= MGf_LOCAL; #endif /* MGf_LOCAL */ - ; #if VMG_UVAR if (w->uvar && SvTYPE(sv) >= SVt_PVHV) { @@ -699,8 +726,7 @@ BOOT: { HV *stash; MY_CXT_INIT; - MY_CXT.wizz = newHV(); - MY_CXT.count = 0; + vmg_cxt_init(); stash = gv_stashpv(__PACKAGE__, 1); newCONSTSUB(stash, "SIG_MIN", newSVuv(SIG_MIN)); newCONSTSUB(stash, "SIG_MAX", newSVuv(SIG_MAX)); @@ -716,8 +742,18 @@ BOOT: newCONSTSUB(stash, "VMG_COMPAT_SCALAR_LENGTH_NOLEN", newSVuv(VMG_COMPAT_SCALAR_LENGTH_NOLEN)); newCONSTSUB(stash, "VMG_PERL_PATCHLEVEL", newSVuv(VMG_PERL_PATCHLEVEL)); + newCONSTSUB(stash, "VMG_THREADSAFE", newSVuv(VMG_THREADSAFE)); } +void +CLONE(...) +PROTOTYPE: DISABLE +CODE: +#ifdef MY_CXT_CLONE + MY_CXT_CLONE; + vmg_cxt_init(); +#endif + SV *_wizard(...) PROTOTYPE: DISABLE PREINIT: @@ -801,7 +837,7 @@ CODE: hv_store(MY_CXT.wizz, buf, sprintf(buf, "%u", sig), sv, 0); ++MY_CXT.count; - + RETVAL = newRV_noinc(sv); OUTPUT: RETVAL