#define lt_tag(V) lt_tag(aTHX_ (V))
lt_hint_t *h;
SV *code = NULL;
-#if LT_THREADSAFE
- dMY_CXT;
-#endif
if (SvROK(value)) {
value = SvRV(value);
#endif /* !LT_HINT_STRUCT */
#if LT_THREADSAFE
- /* We only need for the key to be an unique tag for looking up the value later.
- * Allocated memory provides convenient unique identifiers, so that's why we
- * use the hint as the key itself. */
- ptable_hints_store(MY_CXT.tbl, h, h);
+ {
+ dMY_CXT;
+ /* We only need for the key to be an unique tag for looking up the value later
+ * Allocated memory provides convenient unique identifiers, so that's why we
+ * use the hint as the key itself. */
+ ptable_hints_store(MY_CXT.tbl, h, h);
+ }
#endif /* LT_THREADSAFE */
return newSViv(PTR2IV(h));
STATIC ptable *lt_op_map = NULL;
#ifdef USE_ITHREADS
+
STATIC perl_mutex lt_op_map_mutex;
-#endif
+
+#define LT_LOCK(M) MUTEX_LOCK(M)
+#define LT_UNLOCK(M) MUTEX_UNLOCK(M)
+
+#else /* USE_ITHREADS */
+
+#define LT_LOCK(M)
+#define LT_UNLOCK(M)
+
+#endif /* !USE_ITHREADS */
typedef struct {
#ifdef MULTIPLICITY
#define lt_map_store(O, OP, TP, TM, PP) lt_map_store(aTHX_ (O), (OP), (TP), (TM), (PP))
lt_op_info *oi;
-#ifdef USE_ITHREADS
- MUTEX_LOCK(<_op_map_mutex);
-#endif
+ LT_LOCK(<_op_map_mutex);
if (!(oi = ptable_fetch(lt_op_map, o))) {
oi = PerlMemShared_malloc(sizeof *oi);
oi->old_pp_padsv = old_pp_padsv;
-#ifdef USE_ITHREADS
- MUTEX_UNLOCK(<_op_map_mutex);
-#endif
+ LT_UNLOCK(<_op_map_mutex);
}
STATIC const lt_op_info *lt_map_fetch(const OP *o, lt_op_info *oi) {
const lt_op_info *val;
-#ifdef USE_ITHREADS
- MUTEX_LOCK(<_op_map_mutex);
-#endif
+ LT_LOCK(<_op_map_mutex);
val = ptable_fetch(lt_op_map, o);
if (val) {
val = oi;
}
-#ifdef USE_ITHREADS
- MUTEX_UNLOCK(<_op_map_mutex);
-#endif
+ LT_UNLOCK(<_op_map_mutex);
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
+ LT_LOCK(<_op_map_mutex);
ptable_map_delete(lt_op_map, o);
-#ifdef USE_ITHREADS
- MUTEX_UNLOCK(<_op_map_mutex);
-#endif
+ LT_UNLOCK(<_op_map_mutex);
}
/* --- Hooks --------------------------------------------------------------- */
LEAVE;
}
- return CALL_FPTR(oi.old_pp_padsv)(aTHX);
+ return oi.old_pp_padsv(aTHX);
}
- return CALL_FPTR(PL_op->op_ppaddr)(aTHX);
+ return PL_op->op_ppaddr(aTHX);
}
/* ... Our ck_pad{any,sv} .................................................. */
STATIC OP *lt_ck_padany(pTHX_ OP *o) {
HV *stash;
SV *code;
- dMY_CXT;
- o = CALL_FPTR(lt_old_ck_padany)(aTHX_ o);
+ o = lt_old_ck_padany(aTHX_ o);
stash = PL_in_my_stash;
if (stash && (code = lt_hint())) {
+ dMY_CXT;
SV *orig_pkg = newSVpvn(HvNAME_get(stash), HvNAMELEN_get(stash));
SV *orig_meth = MY_CXT.default_meth;
SV *type_pkg = NULL;
STATIC OP *(*lt_old_ck_padsv)(pTHX_ OP *) = 0;
STATIC OP *lt_ck_padsv(pTHX_ OP *o) {
- dMY_CXT;
-
lt_map_delete(o);
- return CALL_FPTR(lt_old_ck_padsv)(aTHX_ o);
+ return lt_old_ck_padsv(aTHX_ o);
}
/* ... Our peephole optimizer .............................................. */
switch (o->op_type) {
case OP_PADSV:
if (o->op_ppaddr != lt_pp_padsv && o->op_private & OPpLVAL_INTRO) {
-#ifdef USE_ITHREADS
- MUTEX_LOCK(<_op_map_mutex);
-#endif
+ LT_LOCK(<_op_map_mutex);
oi = ptable_fetch(lt_op_map, o);
if (oi) {
oi->old_pp_padsv = o->op_ppaddr;
o->op_ppaddr = lt_pp_padsv;
}
-#ifdef USE_ITHREADS
- MUTEX_UNLOCK(<_op_map_mutex);
-#endif
+ LT_UNLOCK(<_op_map_mutex);
}
break;
#if !LT_HAS_RPEEP
STATIC U32 lt_initialized = 0;
STATIC void lt_teardown(pTHX_ void *root) {
- dMY_CXT;
-
if (!lt_initialized)
return;
return;
#endif
+ {
+ dMY_CXT;
#if LT_THREADSAFE
- ptable_hints_free(MY_CXT.tbl);
+ ptable_hints_free(MY_CXT.tbl);
#endif
#if !LT_HAS_RPEEP
- ptable_seen_free(MY_CXT.seen);
+ ptable_seen_free(MY_CXT.seen);
#endif
- SvREFCNT_dec(MY_CXT.default_meth);
+ SvREFCNT_dec(MY_CXT.default_meth);
+ }
PL_check[OP_PADANY] = MEMBER_TO_FPTR(lt_old_ck_padany);
lt_old_ck_padany = 0;