X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=Upper.xs;h=1b3dc213d3982ffe98687fd76a744c85a2e23787;hb=7dd03ea1e86b8d76c2186af04c542883f215f458;hp=114161a4879cd4ddfe7f13162360f09ecd0ce89e;hpb=70148496e0d2fce5974ae1a869f06b22bd7c119d;p=perl%2Fmodules%2FScope-Upper.git diff --git a/Upper.xs b/Upper.xs index 114161a..1b3dc21 100644 --- a/Upper.xs +++ b/Upper.xs @@ -653,9 +653,9 @@ static void su_save_helem(pTHX_ HV *hv, SV *keysv, SV *val) { return; } - if (preeminent) + if (preeminent) { save_helem(hv, keysv, svp); - else { + } else { STRLEN keylen; const char * const key = SvPV_const(keysv, keylen); SAVEDELETE(hv, savepvn(key, keylen), @@ -754,7 +754,7 @@ static void su_call(pTHX_ SV *cb) { dSP; - XSH_D(su_debug_log("@@@ call scope_ix=%2d save_ix=%2d\n", + XSH_D(xsh_debug_log("@@@ call scope_ix=%2d save_ix=%2d\n", PL_scopestack_ix, PL_savestack_ix)); ENTER; @@ -926,8 +926,8 @@ static void su_localize(pTHX_ void *ud_) { XSH_D({ SV *z = newSV(0); SvUPGRADE(z, t); - su_debug_log("%p: === localize a %s\n",ud, sv_reftype(z, 0)); - su_debug_log("%p: depth=%2d scope_ix=%2d save_ix=%2d\n", + xsh_debug_log("%p: === localize a %s\n",ud, sv_reftype(z, 0)); + xsh_debug_log("%p: depth=%2d scope_ix=%2d save_ix=%2d\n", ud, SU_UD_DEPTH(ud), PL_scopestack_ix, PL_savestack_ix); SvREFCNT_dec(z); }); @@ -938,15 +938,17 @@ static void su_localize(pTHX_ void *ud_) { if (elem) { su_save_aelem(GvAV(gv), elem, val); return; - } else + } else { save_ary(gv); + } break; case SVt_PVHV: if (elem) { su_save_helem(GvHV(gv), elem, val); return; - } else + } else { save_hash(gv); + } break; case SVt_PVGV: save_gp(gv, 1); /* hide previous entry in symtab */ @@ -1076,11 +1078,12 @@ static const int su_cxt_enter_count[] = { /* push at least 'size' slots worth of padding onto the savestack */ static void su_ss_push_padding(pTHX_ void *ud, I32 size) { +#define su_ss_push_padding(U, S) su_ss_push_padding(aTHX_ (U), (S)) if (size <= 0) return; if (size < SU_SAVE_ALLOC_SIZE + 1) /* minimum possible SAVEt_ALLOC */ size = SU_SAVE_ALLOC_SIZE + 1; - XSH_D(su_debug_log( + XSH_D(xsh_debug_log( "%p: push %2d padding at save_ix=%d\n", ud, size, PL_savestack_ix)); save_alloc((size - SU_SAVE_ALLOC_SIZE)*sizeof(*PL_savestack), 0); @@ -1092,12 +1095,13 @@ static void su_pop(pTHX_ void *ud); * first indicates that this is the first push of a destructor */ static void su_ss_push_destructor(pTHX_ void *ud, I32 depth, bool first) { +#define su_ss_push_destructor(U, D, F) su_ss_push_destructor(aTHX_ (U), (D), (F)) su_ud_origin_elem *origin = SU_UD_ORIGIN(ud); assert(first || origin[depth+1].orig_ix == PL_savestack_ix); - su_ss_push_padding(aTHX_ ud, + su_ss_push_padding(ud, (origin[depth].orig_ix + origin[depth].offset) - PL_savestack_ix); - XSH_D(su_debug_log( + XSH_D(xsh_debug_log( "%p: push destructor at save_ix=%d depth=%d scope_ix=%d\n", ud, PL_savestack_ix, depth, PL_scopestack_ix)); SAVEDESTRUCTOR_X(su_pop, ud); @@ -1115,17 +1119,17 @@ static void su_pop(pTHX_ void *ud) { depth = SU_UD_DEPTH(ud); origin = SU_UD_ORIGIN(ud); - XSH_D(su_debug_log( "%p: ### su_pop: depth=%d\n", ud, depth)); + XSH_D(xsh_debug_log( "%p: ### su_pop: depth=%d\n", ud, depth)); depth--; mark = PL_savestack_ix; base = origin[depth].orig_ix; - XSH_D(su_debug_log("%p: residual savestack frame is %d(+%d)..%d\n", + XSH_D(xsh_debug_log("%p: residual savestack frame is %d(+%d)..%d\n", ud, base, origin[depth].offset, mark)); if (base < mark) { - XSH_D(su_debug_log("%p: clear leftovers at %d..%d\n", ud, base, mark)); + XSH_D(xsh_debug_log("%p: clear leftovers at %d..%d\n", ud, base, mark)); leave_scope(base); } assert(PL_savestack_ix == base); @@ -1133,12 +1137,12 @@ static void su_pop(pTHX_ void *ud) { SU_UD_DEPTH(ud) = depth; if (depth > 0) { - su_ss_push_destructor(aTHX_ ud, depth-1, 0); + su_ss_push_destructor(ud, depth-1, 0); } else { I32 offset = origin[0].offset; /* grab value before origin is freed */ switch (SU_UD_TYPE(ud)) { case SU_UD_TYPE_REAP: { - XSH_D(su_debug_log("%p: === reap\n%p: depth=%d scope_ix=%d save_ix=%d\n", + XSH_D(xsh_debug_log("%p: === reap\n%p: depth=%d scope_ix=%d save_ix=%d\n", ud, ud, SU_UD_DEPTH(ud), PL_scopestack_ix, PL_savestack_ix)); SAVEDESTRUCTOR_X(su_call, SU_UD_REAP_CB(ud)); SU_UD_FREE(ud); @@ -1157,12 +1161,12 @@ static void su_pop(pTHX_ void *ud) { if (PL_savestack_ix < base + offset) { I32 gap = (base + offset) - PL_savestack_ix; assert(gap >= SU_SAVE_ALLOC_SIZE + 1); - su_ss_push_padding(aTHX_ ud, gap); + su_ss_push_padding(ud, gap); } assert(PL_savestack_ix == base + offset); } - XSH_D(su_debug_log("%p: end pop: ss_ix=%d\n", ud, PL_savestack_ix)); + XSH_D(xsh_debug_log("%p: end pop: ss_ix=%d\n", ud, PL_savestack_ix)); } /* --- Initialize the stack and the action userdata ------------------------ */ @@ -1174,13 +1178,13 @@ static void su_init(pTHX_ void *ud, I32 cxix, I32 size) { I32 cur_cx_ix; I32 cur_scope_ix; - XSH_D(su_debug_log("%p: ### su_init(cxix=%d, size=%d)\n", ud, cxix, size)); + XSH_D(xsh_debug_log("%p: ### su_init(cxix=%d, size=%d)\n", ud, cxix, size)); depth = PL_scopestack_ix - cxstack[cxix].blk_oldscopesp; #if SU_HAS_NEW_CXT depth += (cxstack_ix - cxix); /* each context frame holds 1 scope */ #endif - XSH_D(su_debug_log( + XSH_D(xsh_debug_log( "%p: going down by depth=%d with scope_ix=%d save_ix=%d\n", ud, depth, PL_scopestack_ix, PL_savestack_ix)); @@ -1230,7 +1234,7 @@ static void su_init(pTHX_ void *ud, I32 cxix, I32 size) { cur_cx_ix = cxix; cur_scope_ix = cxstack[cxix].blk_oldscopesp; #if SU_HAS_NEW_CXT - XSH_D(su_debug_log("%p: cx=%-2d %-11s\n", + XSH_D(xsh_debug_log("%p: cx=%-2d %-11s\n", ud, cur_cx_ix, SU_CXNAME(cxstack+cur_cx_ix))); cur_cx_ix++; #endif @@ -1253,23 +1257,23 @@ static void su_init(pTHX_ void *ud, I32 cxix, I32 size) { XSH_D({ if (cur_cx_ix <= cxstack_ix) { if (cur_scope_ix == cxstack[cur_cx_ix].blk_oldscopesp) { - su_debug_log( + xsh_debug_log( "%p: cx=%-2d %s\n%p: ------------------\n", ud, cur_cx_ix, SU_CXNAME(cxstack+cur_cx_ix), ud); cur_cx_ix++; } else if (cur_scope_ix + su_cxt_enter_count[CxTYPE(cxstack+cur_cx_ix)] == cxstack[cur_cx_ix].blk_oldscopesp) - su_debug_log("%p: ------------------\n", ud); + xsh_debug_log("%p: ------------------\n", ud); } }); ixp = &PL_scopestack[cur_scope_ix++]; #endif - if (i == 0) + if (i == 0) { offset = size; - else { + } else { /* we have three constraints to satisfy: * 1) Each adjusted offset must be at least SU_SAVE_DESTRUCTOR_SIZE * above its unadjusted boundary, so that there is space to inject a @@ -1300,17 +1304,17 @@ static void su_init(pTHX_ void *ud, I32 cxix, I32 size) { #if SU_HAS_NEW_CXT XSH_D({ if (ixp == &PL_scopestack[cur_scope_ix-1]) - su_debug_log( + xsh_debug_log( "%p: ENTER origin[%d] scope[%d] savestack=%d+%d\n", ud, i, cur_scope_ix, origin[i].orig_ix, origin[i].offset); else - su_debug_log( + xsh_debug_log( "%p: cx=%-2d %-11s origin[%d] scope[%d] savestack=%d+%d\n", ud, cur_cx_ix-1, SU_CXNAME(cxstack+cur_cx_ix-1), i, cur_scope_ix, origin[i].orig_ix, origin[i].offset); }); #else - XSH_D(su_debug_log( + XSH_D(xsh_debug_log( "%p: ENTER origin[%d] scope[%d] savestack=%d+%d\n", ud, i, cur_scope_ix, origin[i].orig_ix, origin[i].offset)); #endif @@ -1322,7 +1326,7 @@ static void su_init(pTHX_ void *ud, I32 cxix, I32 size) { SU_UD_DEPTH(ud) = depth; SU_UD_ORIGIN(ud) = origin; - su_ss_push_destructor(aTHX_ ud, depth-1, 1); + su_ss_push_destructor(ud, depth-1, 1); } /* --- Unwind stack -------------------------------------------------------- */ @@ -1354,7 +1358,7 @@ static void su_unwind(pTHX_ void *ud_) { XSH_D({ I32 gimme = GIMME_V; - su_debug_log("%p: cx=%d gimme=%s items=%d sp=%d oldmark=%d mark=%d\n", + xsh_debug_log("%p: cx=%d gimme=%s items=%d sp=%d oldmark=%d mark=%d\n", &XSH_CXT, cxix, gimme == G_VOID ? "void" : gimme == G_ARRAY ? "list" : "scalar", items, PL_stack_sp - PL_stack_base, *PL_markstack_ptr, mark); @@ -1392,8 +1396,6 @@ static void su_yield(pTHX_ void *ud_) { U8 flags = 0; OP *next; - PERL_UNUSED_VAR(ud_); - cx = cxstack + cxix; switch (CxTYPE(cx)) { case CXt_BLOCK: { @@ -1716,7 +1718,7 @@ static void su_uplevel_restore_new(pTHX_ void *sus_) { for (i = 0; i < sud->gap; i++) { PERL_CONTEXT *cx = cxstack + sud->cxix + i; - XSH_D(su_debug_log("su_uplevel_restore: i=%d cxix=%d type %s => %s\n", + XSH_D(xsh_debug_log("su_uplevel_restore: i=%d cxix=%d type %s => %s\n", i, cx-cxstack, SU_CX_TYPENAME(CxTYPE(cx)), SU_CX_TYPENAME(saved_cxtypes[i] & CXTYPEMASK))); cx->cx_type = saved_cxtypes[i]; @@ -2020,6 +2022,7 @@ static int su_uplevel_runops_hook_entersub(pTHX) { } static I32 su_uplevel_new(pTHX_ CV *callback, I32 cxix, I32 args) { +#define su_uplevel_new(CB, CX, A) su_uplevel_new(aTHX_ (CB), (CX), (A)) su_uplevel_ud *sud; U8 *saved_cxtypes; I32 i, ret; @@ -2059,7 +2062,7 @@ static I32 su_uplevel_new(pTHX_ CV *callback, I32 cxix, I32 args) { for (i = 0; i < sud->gap; i++) { PERL_CONTEXT *cx = cxstack + cxix + i; saved_cxtypes[i] = cx->cx_type; /* save type and flags */ - XSH_D(su_debug_log("su_uplevel: i=%d cxix=%d type %-11s => %s\n", + XSH_D(xsh_debug_log("su_uplevel: i=%d cxix=%d type %-11s => %s\n", i, cx-cxstack, SU_CX_TYPENAME(CxTYPE(cx)), SU_CX_TYPENAME(CXt_NULL))); cx->cx_type = (CXt_NULL | CXp_SU_UPLEVEL_NULLED); } @@ -2089,6 +2092,7 @@ static I32 su_uplevel_new(pTHX_ CV *callback, I32 cxix, I32 args) { #else static I32 su_uplevel_old(pTHX_ CV *callback, I32 cxix, I32 args) { +#define su_uplevel_old(CB, CX, A) su_uplevel_old(aTHX_ (CB), (CX), (A)) su_uplevel_ud *sud; const PERL_CONTEXT *cx = cxstack + cxix; PERL_SI *si; @@ -2453,7 +2457,7 @@ static I32 su_context_real2logical(pTHX_ I32 cxix) { if (cx->cx_type == (CXt_NULL | CXp_SU_UPLEVEL_NULLED)) gaps++; } - XSH_D(su_debug_log("su_context_real2logical: %d => %d\n", cxix, cxix - gaps)); + XSH_D(xsh_debug_log("su_context_real2logical: %d => %d\n", cxix, cxix - gaps)); return cxix - gaps; } @@ -2473,7 +2477,7 @@ static I32 su_context_logical2real(pTHX_ I32 cxix) { if (seen >= cxix) break; } - XSH_D(su_debug_log("su_context_logical2real: %d => %d\n", cxix, i)); + XSH_D(xsh_debug_log("su_context_logical2real: %d => %d\n", cxix, i)); if (i > cxstack_ix) i = cxstack_ix; return i; @@ -3247,9 +3251,9 @@ PPCODE: } /* su_uplevel() takes care of extending the stack if needed. */ #if SU_HAS_NEW_CXT - ret = su_uplevel_new(aTHX_ (CV *) code, cxix, args); + ret = su_uplevel_new((CV *) code, cxix, args); #else - ret = su_uplevel_old(aTHX_ (CV *) code, cxix, args); + ret = su_uplevel_old((CV *) code, cxix, args); #endif XSRETURN(ret); default: