X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=op.c;h=db97cb64cb936cdf4ebfae4cfdc7c106ba9fdfb9;hb=6bbcb22c3aeb67c92a6ca7dbdd7c51c54615d260;hp=55450e11a8e79727a468fb0f8eb5c1b9db59b00f;hpb=ff0cee690d2ef6ba882e59dd4baaa0c944adb7a2;p=p5sagit%2Fp5-mst-13.2.git diff --git a/op.c b/op.c index 55450e1..db97cb6 100644 --- a/op.c +++ b/op.c @@ -693,8 +693,6 @@ OP *op; case OP_AELEM: case OP_AELEMFAST: case OP_ASLICE: - case OP_VALUES: - case OP_KEYS: case OP_HELEM: case OP_HSLICE: case OP_UNPACK: @@ -817,6 +815,8 @@ OP *op; deprecate("implicit split to @_"); } break; + case OP_KEYS: + case OP_VALUES: case OP_DELETE: op->op_private |= OPpLEAVE_VOID; break; @@ -2949,11 +2949,11 @@ CV* outside; AvFLAGS(av) = AVf_REIFY; for (ix = AvFILL(protopad); ix > 0; ix--) { - SV* sv; - if (pname[ix] != &sv_undef) { - char *name = SvPVX(pname[ix]); /* XXX */ - if (SvFLAGS(pname[ix]) & SVf_FAKE) { /* lexical from outside? */ - I32 off = pad_findlex(name, ix, SvIVX(pname[ix]), + SV* namesv = pname[ix]; + if (namesv && namesv != &sv_undef) { + char *name = SvPVX(namesv); /* XXX */ + if (SvFLAGS(namesv) & SVf_FAKE) { /* lexical from outside? */ + I32 off = pad_findlex(name, ix, SvIVX(namesv), CvOUTSIDE(cv), cxstack_ix); if (!off) curpad[ix] = SvREFCNT_inc(ppad[ix]); @@ -2961,6 +2961,7 @@ CV* outside; croak("panic: cv_clone: %s", name); } else { /* our own lexical */ + SV* sv; if (*name == '&') { /* anon code -- we'll come back for it */ sv = SvREFCNT_inc(ppad[ix]); @@ -2977,7 +2978,7 @@ CV* outside; } } else { - sv = NEWSV(0,0); + SV* sv = NEWSV(0,0); SvPADTMP_on(sv); curpad[ix] = sv; } @@ -2986,9 +2987,11 @@ CV* outside; /* Now that vars are all in place, clone nested closures. */ for (ix = AvFILL(protopad); ix > 0; ix--) { - if (pname[ix] != &sv_undef - && !(SvFLAGS(pname[ix]) & SVf_FAKE) - && *SvPVX(pname[ix]) == '&' + SV* namesv = pname[ix]; + if (namesv + && namesv != &sv_undef + && !(SvFLAGS(namesv) & SVf_FAKE) + && *SvPVX(namesv) == '&' && CvCLONE(ppad[ix])) { CV *kid = cv_clone2((CV*)ppad[ix], cv); @@ -3075,6 +3078,11 @@ OP *block; SvPOK(cv) ? SvPV((SV*)cv,na) : "none", p ? p : "none"); } + if (!block) { + /* just a "sub foo;" when &foo is already defined */ + SAVEFREESV(compcv); + goto done; + } if (const_sv || dowarn) { line_t oldline = curcop->cop_line; curcop->cop_line = copline; @@ -3162,7 +3170,7 @@ OP *block; gv_efullname3(tmpstr, gv, Nullch); hv_store(GvHV(DBsub), SvPVX(tmpstr), SvCUR(tmpstr), sv, 0); if (!db_postponed) { - db_postponed = gv_fetchpv("DB::postponed", TRUE, SVt_PVHV); + db_postponed = gv_fetchpv("DB::postponed", GV_ADDMULTI, SVt_PVHV); } hv = GvHVn(db_postponed); if (HvFILL(hv) >= 0 && hv_exists(hv, SvPVX(tmpstr), SvCUR(tmpstr)) @@ -3206,6 +3214,7 @@ OP *block; } } + done: copline = NOLINE; LEAVE_SCOPE(floor); return cv;