X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2FLexical-Types.git;a=blobdiff_plain;f=Types.xs;h=38652141345a6d762c1f27d432b39824ddd8fc6a;hp=ff9e398f6242d625c40706a095161c8b37cb354e;hb=333c198120153b0cfe076fcb54e100dcf0eb9fb4;hpb=158a53a77c240a1fed59318ecacb5bb20eb11f1d diff --git a/Types.xs b/Types.xs index ff9e398..3865214 100644 --- a/Types.xs +++ b/Types.xs @@ -648,6 +648,60 @@ STATIC OP *lt_ck_padsv(pTHX_ OP *o) { STATIC U32 lt_initialized = 0; +STATIC void lt_teardown(pTHX_ void *root) { + dMY_CXT; + + if (!lt_initialized) + return; + +#if LT_MULTIPLICITY + if (aTHX != root) + return; +#endif + +#if LT_THREADSAFE + ptable_hints_free(MY_CXT.tbl); +#endif + SvREFCNT_dec(MY_CXT.default_meth); + + PL_check[OP_PADANY] = MEMBER_TO_FPTR(lt_old_ck_padany); + lt_old_ck_padany = 0; + PL_check[OP_PADSV] = MEMBER_TO_FPTR(lt_old_ck_padsv); + lt_old_ck_padsv = 0; + + lt_initialized = 0; +} + +STATIC lt_setup(pTHX) { +#define lt_setup() lt_setup(aTHX) + if (lt_initialized) + return; + + MY_CXT_INIT; +#if LT_THREADSAFE + MY_CXT.tbl = ptable_new(); + MY_CXT.owner = aTHX; +#endif + MY_CXT.pp_padsv_saved = 0; + MY_CXT.default_meth = newSVpvn("TYPEDSCALAR", 11); + SvREADONLY_on(MY_CXT.default_meth); + + lt_old_ck_padany = PL_check[OP_PADANY]; + PL_check[OP_PADANY] = MEMBER_TO_FPTR(lt_ck_padany); + lt_old_ck_padsv = PL_check[OP_PADSV]; + PL_check[OP_PADSV] = MEMBER_TO_FPTR(lt_ck_padsv); + +#if LT_MULTIPLICITY + call_atexit(lt_teardown, aTHX); +#else + call_atexit(lt_teardown, NULL); +#endif + + lt_initialized = 1; +} + +STATIC U32 lt_booted = 0; + /* --- XS ------------------------------------------------------------------ */ MODULE = Lexical::Types PACKAGE = Lexical::Types @@ -656,18 +710,9 @@ PROTOTYPES: ENABLE BOOT: { - if (!lt_initialized++) { + if (!lt_booted++) { HV *stash; - MY_CXT_INIT; -#if LT_THREADSAFE - MY_CXT.tbl = ptable_new(); - MY_CXT.owner = aTHX; -#endif - MY_CXT.pp_padsv_saved = 0; - MY_CXT.default_meth = newSVpvn("TYPEDSCALAR", 11); - SvREADONLY_on(MY_CXT.default_meth); - lt_op_map = ptable_new(); #ifdef USE_ITHREADS MUTEX_INIT(<_op_map_mutex); @@ -675,14 +720,11 @@ BOOT: PERL_HASH(lt_hash, __PACKAGE__, __PACKAGE_LEN__); - lt_old_ck_padany = PL_check[OP_PADANY]; - PL_check[OP_PADANY] = MEMBER_TO_FPTR(lt_ck_padany); - lt_old_ck_padsv = PL_check[OP_PADSV]; - PL_check[OP_PADSV] = MEMBER_TO_FPTR(lt_ck_padsv); - stash = gv_stashpvn(__PACKAGE__, __PACKAGE_LEN__, 1); newCONSTSUB(stash, "LT_THREADSAFE", newSVuv(LT_THREADSAFE)); } + + lt_setup(); } #if LT_THREADSAFE