#if LT_THREADSAFE
tTHX owner;
#endif
+ SV *default_meth;
OP * (*pp_padsv_saved)(pTHX);
} my_cxt_t;
SvREFCNT_dec(stashes);
}
- return dupsv;
+ return SvREFCNT_inc(dupsv);
}
STATIC void lt_ptable_hints_clone(pTHX_ ptable_ent *ent, void *ud_) {
#endif
typedef struct {
-#if LT_MULTIPLICITY
+#ifdef MULTIPLICITY
STRLEN buf_size, orig_pkg_len, type_pkg_len, type_meth_len;
char *buf;
-#else /* LT_MULTIPLICITY */
+#else /* MULTIPLICITY */
SV *orig_pkg;
SV *type_pkg;
SV *type_meth;
-#endif /* !LT_MULTIPLICITY */
+#endif /* !MULTIPLICITY */
OP *(*pp_padsv)(pTHX);
} lt_op_info;
-STATIC void lt_map_store(pPTBLMS_ const OP *o, SV *orig_pkg, SV *type_pkg, SV *type_meth, OP *(*pp_padsv)(pTHX)) {
-#define lt_map_store(O, OP, TP, TM, PP) lt_map_store(aPTBLMS_ (O), (OP), (TP), (TM), (PP))
+STATIC void lt_map_store(pTHX_ const OP *o, SV *orig_pkg, SV *type_pkg, SV *type_meth, OP *(*pp_padsv)(pTHX)) {
+#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
if (!(oi = ptable_fetch(lt_op_map, o))) {
oi = PerlMemShared_malloc(sizeof *oi);
ptable_map_store(lt_op_map, o, oi);
-#if LT_MULTIPLICITY
+#ifdef MULTIPLICITY
oi->buf = NULL;
oi->buf_size = 0;
-#else /* LT_MULTIPLICITY */
+#else /* MULTIPLICITY */
} else {
SvREFCNT_dec(oi->orig_pkg);
SvREFCNT_dec(oi->type_pkg);
SvREFCNT_dec(oi->type_meth);
-#endif /* !LT_MULTIPLICITY */
+#endif /* !MULTIPLICITY */
}
-#if LT_MULTIPLICITY
+#ifdef MULTIPLICITY
{
STRLEN op_len = SvCUR(orig_pkg);
STRLEN tp_len = SvCUR(type_pkg);
oi->orig_pkg_len = op_len;
oi->type_pkg_len = tp_len;
oi->type_meth_len = tm_len;
+ SvREFCNT_dec(orig_pkg);
+ SvREFCNT_dec(type_pkg);
+ SvREFCNT_dec(type_meth);
}
-#else /* LT_MULTIPLICITY */
+#else /* MULTIPLICITY */
oi->orig_pkg = orig_pkg;
oi->type_pkg = type_pkg;
oi->type_meth = type_meth;
-#endif /* !LT_MULTIPLICITY */
+#endif /* !MULTIPLICITY */
oi->pp_padsv = pp_padsv;
ENTER;
SAVETMPS;
-#if LT_MULTIPLICITY
+#ifdef MULTIPLICITY
{
STRLEN op_len = oi.orig_pkg_len, tp_len = oi.type_pkg_len;
char *buf = oi.buf;
type_meth = sv_2mortal(newSVpvn(buf, oi.type_meth_len));
SvREADONLY_on(type_meth);
}
-#else /* LT_MULTIPLICITY */
+#else /* MULTIPLICITY */
orig_pkg = oi.orig_pkg;
type_pkg = oi.type_pkg;
type_meth = oi.type_meth;
-#endif /* !LT_MULTIPLICITY */
+#endif /* !MULTIPLICITY */
PUSHMARK(SP);
EXTEND(SP, 3);
* pp_padsv, but much less than if we would have set PL_ppaddr[OP_PADSV]
* globally. */
-STATIC SV *lt_default_meth = NULL;
-
STATIC OP *(*lt_old_ck_padany)(pTHX_ OP *) = 0;
STATIC OP *lt_ck_padany(pTHX_ OP *o) {
stash = PL_in_my_stash;
if (stash && (code = lt_hint())) {
SV *orig_pkg = newSVpvn(HvNAME_get(stash), HvNAMELEN_get(stash));
- SV *orig_meth = lt_default_meth;
+ SV *orig_meth = MY_CXT.default_meth;
SV *type_pkg = NULL;
SV *type_meth = NULL;
int items;
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);
#endif
- lt_default_meth = newSVpvn("TYPEDSCALAR", 11);
- SvREADONLY_on(lt_default_meth);
-
PERL_HASH(lt_hash, __PACKAGE__, __PACKAGE_LEN__);
lt_old_ck_padany = PL_check[OP_PADANY];
PREINIT:
ptable *t;
int *level;
+ SV *cloned_default_meth;
CODE:
{
my_cxt_t ud;
ud.tbl = t = ptable_new();
ud.owner = MY_CXT.owner;
ptable_walk(MY_CXT.tbl, lt_ptable_hints_clone, &ud);
+ cloned_default_meth = lt_clone(MY_CXT.default_meth, MY_CXT.owner);
}
{
MY_CXT_CLONE;
MY_CXT.tbl = t;
MY_CXT.owner = aTHX;
MY_CXT.pp_padsv_saved = 0;
+ MY_CXT.default_meth = cloned_default_meth;
}
{
level = PerlMemShared_malloc(sizeof *level);