MAGIC *mg;
HV *stash;
- if (!av)
- return 0;
+ if (!av) return 0;
if (SvCANEXISTDELETE(av))
return av_exists(av, key);
MAGIC *mg;
HV *stash;
- if (!hv)
- return 0;
+ if (!hv) return 0;
if (SvCANEXISTDELETE(hv) || mg_find((SV *) hv, PERL_MAGIC_env))
return hv_exists_ent(hv, keysv, 0);
save_gp((GV *) *svp, 0);
return;
}
- if (!preeminent) {
+ if (preeminent)
+ save_helem(hv, keysv, svp);
+ else {
STRLEN keylen;
const char * const key = SvPV_const(keysv, keylen);
SAVEDELETE(hv, savepvn(key, keylen),
SvUTF8(keysv) ? -(I32)keylen : (I32)keylen);
- } else {
- save_helem(hv, keysv, svp);
}
}
#define SU_UD_ORIGIN(U) (((su_ud_common *) (U))->origin)
#define SU_UD_HANDLER(U) (((su_ud_common *) (U))->handler)
-#define SU_UD_FREE(U) do { \
+#define SU_UD_FREE(U) STMT_START { \
if (SU_UD_ORIGIN(U)) Safefree(SU_UD_ORIGIN(U)); \
Safefree(U); \
-} while (0)
+} STMT_END
/* ... Reap ................................................................ */
I32 i, depth = 0, *origin;
I32 cur, last, step;
+ LEAVE;
+
+ if (level <= 0) {
+ SU_UD_HANDLER(ud)(aTHX_ ud);
+ goto done;
+ }
+
SU_D(PerlIO_printf(Perl_debug_log, "%p: ### init for level %d\n", ud, level));
for (i = 0; i < level; ++i) {
SU_UD_ORIGIN(ud) = origin;
SU_UD_DEPTH(ud) = depth;
+
+ SU_D(PerlIO_printf(Perl_debug_log, "%p: set original destructor at %d [%d]\n",
+ ud, PL_savestack_ix, depth));
+
+ SAVEDESTRUCTOR_X(su_pop, ud);
+
+done:
+ ENTER;
+
return depth;
}
SU_UD_ORIGIN(ud) = NULL;
SU_UD_HANDLER(ud) = su_reap;
ud->cb = newSVsv(hook);
- LEAVE;
- if (level) {
- I32 depth = su_init(level, ud, 3);
- SU_D(PerlIO_printf(Perl_debug_log, "%p: set original destructor at %d [%d]\n",
- ud, PL_savestack_ix, depth));
- SAVEDESTRUCTOR_X(su_pop, ud);
- } else
- su_reap(ud);
- ENTER;
+ su_init(level, ud, 3);
void
localize(SV *sv, SV *val, ...)
ud->sv = sv;
ud->val = newSVsv(val);
ud->elem = NULL;
- LEAVE;
- if (level) {
- I32 depth = su_init(level, ud, 3);
- SU_D(PerlIO_printf(Perl_debug_log, "%p: set original destructor at %d [%d]\n",
- ud, PL_savestack_ix, depth));
- SAVEDESTRUCTOR_X(su_pop, ud);
- } else
- su_localize(ud);
- ENTER;
+ su_init(level, ud, 3);
void
localize_elem(SV *sv, SV *elem, SV *val, ...)
ud->val = newSVsv(val);
SvREFCNT_inc(elem);
ud->elem = elem;
- LEAVE;
- if (level) {
- I32 depth = su_init(level, ud, 4);
- SU_D(PerlIO_printf(Perl_debug_log, "%p: set original destructor at %d [%d]\n",
- ud, PL_savestack_ix, depth));
- SAVEDESTRUCTOR_X(su_pop, ud);
- } else
- su_localize(ud);
- ENTER;
-
+ su_init(level, ud, 4);