X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=Types.xs;h=bcf5fa15c9ac6937ac4e74347ff1a0b1b64631e3;hb=6e9765def6efaf02330bf276fc8006e13769d035;hp=29e8d87ff13b163f9f318f6afb8363036e0d7b0e;hpb=4c2bd13c1fbd960115c9c623791811d5db1112f5;p=perl%2Fmodules%2FLexical-Types.git diff --git a/Types.xs b/Types.xs index 29e8d87..bcf5fa1 100644 --- a/Types.xs +++ b/Types.xs @@ -263,6 +263,19 @@ STATIC const lt_op_info *lt_map_fetch(const OP *o, lt_op_info *oi) { return val; } +STATIC void lt_map_delete(pTHX_ const OP *o) { +#define lt_map_delete(O) lt_map_delete(aTHX_ (O)) +#ifdef USE_ITHREADS + MUTEX_LOCK(<_op_map_mutex); +#endif + + ptable_map_store(lt_op_map, o, NULL); + +#ifdef USE_ITHREADS + MUTEX_UNLOCK(<_op_map_mutex); +#endif +} + /* --- Hooks --------------------------------------------------------------- */ /* ... Our pp_padsv ........................................................ */ @@ -420,9 +433,11 @@ STATIC OP *lt_ck_padany(pTHX_ OP *o) { lt_pp_padsv_save(); lt_map_store(o, orig_pkg, type_pkg, type_meth, lt_pp_padsv_saved); + } else { +skip: + lt_map_delete(o); } -skip: return o; } @@ -431,6 +446,8 @@ STATIC OP *(*lt_old_ck_padsv)(pTHX_ OP *) = 0; STATIC OP *lt_ck_padsv(pTHX_ OP *o) { lt_pp_padsv_restore(o); + lt_map_delete(o); + return CALL_FPTR(lt_old_ck_padsv)(aTHX_ o); }