X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=scope.c;h=548ebdc28a7822955269af6a1effbf3cd04eb596;hb=e262e9be635eb2f99e78e37e3729f3b9494cef78;hp=8d6ee701d091eb7f413ad589708a16bc310a85cb;hpb=e336de0d01f30cc4061b6d6a00d11df30fc67cd3;p=p5sagit%2Fp5-mst-13.2.git diff --git a/scope.c b/scope.c index 8d6ee70..548ebdc 100644 --- a/scope.c +++ b/scope.c @@ -57,7 +57,7 @@ new_stackinfo(I32 stitems, I32 cxitems) si->si_next = 0; si->si_cxmax = cxitems - 1; si->si_cxix = -1; - si->si_type = SI_UNDEF; + si->si_type = PERLSI_UNDEF; New(56, si->si_cxstack, cxitems, PERL_CONTEXT); return si; } @@ -152,7 +152,7 @@ free_tmps(void) } } -static SV * +STATIC SV * save_scalar_at(SV **sptr) { dTHR; @@ -222,6 +222,9 @@ save_gp(GV *gv, I32 empty) if (empty) { register GP *gp; + + if (GvCVu(gv)) + sub_generation++; /* taking a method out of circulation */ Newz(602, gp, 1, GP); GvGP(gv) = gp_ref(gp); GvSV(gv) = NEWSV(72,0); @@ -483,7 +486,11 @@ save_list(register SV **sarg, I32 maxsarg) } void +#ifdef PERL_OBJECT +save_destructor(DESTRUCTORFUNC f, void* p) +#else save_destructor(void (*f) (void *), void *p) +#endif { dTHR; SSCHECK(3); @@ -674,6 +681,8 @@ leave_scope(I32 base) SvLEN(gv) = (STRLEN)SSPOPIV; gp_free(gv); GvGP(gv) = (GP*)ptr; + if (GvCVu(gv)) + sub_generation++; /* putting a method back into circulation */ SvREFCNT_dec(gv); break; case SAVEt_FREESV: @@ -747,7 +756,7 @@ leave_scope(I32 base) break; case SAVEt_DESTRUCTOR: ptr = SSPOPPTR; - (*SSPOPDPTR)(ptr); + (CALLDESTRUCTOR)(ptr); break; case SAVEt_REGCONTEXT: i = SSPOPINT; @@ -797,17 +806,23 @@ leave_scope(I32 base) case SAVEt_OP: op = (OP*)SSPOPPTR; break; + case SAVEt_HINTS: + if (GvHV(hintgv)) { + SvREFCNT_dec((SV*)GvHV(hintgv)); + GvHV(hintgv) = NULL; + } + *(I32*)&hints = (I32)SSPOPINT; + break; default: croak("panic: leave_scope inconsistency"); } } } -#ifdef DEBUGGING - void cx_dump(PERL_CONTEXT *cx) { +#ifdef DEBUGGING dTHR; PerlIO_printf(Perl_debug_log, "CX %ld = %s\n", (long)(cx - cxstack), block_type[cx->cx_type]); if (cx->cx_type != CXt_SUBST) { @@ -896,5 +911,5 @@ cx_dump(PERL_CONTEXT *cx) (long)cx->sb_rxres); break; } +#endif /* DEBUGGING */ } -#endif