diff options
author | Dave Mitchell <davem@fdisolutions.com> | 2002-12-12 23:42:35 +0000 |
---|---|---|
committer | Rafael Garcia-Suarez <rgarciasuarez@gmail.com> | 2002-12-16 22:01:14 +0000 |
commit | d819b83ae9e817e78735176f8a6e23d7a0957169 (patch) | |
tree | 2f618bb121acc94dbd71bd942adfe5718ff072ed /pp_ctl.c | |
parent | 6a78b4db838997434df520d6d78be1e74fd2a70c (diff) | |
download | perl-d819b83ae9e817e78735176f8a6e23d7a0957169.tar.gz |
Re: [perl #19017] lexical "my" variables not visible in debugger "x" command
Date: Thu, 12 Dec 2002 23:42:35 +0000
Message-ID: <20021212234235.A29245@fdgroup.com>
and
Date: Sat, 14 Dec 2002 19:16:38 +0000
Message-ID: <20021214191638.A3992@fdgroup.com>
p4raw-id: //depot/perl@18307
Diffstat (limited to 'pp_ctl.c')
-rw-r--r-- | pp_ctl.c | 31 |
1 files changed, 25 insertions, 6 deletions
@@ -2615,7 +2615,7 @@ Perl_sv_compile_2op(pTHX_ SV *sv, OP** startop, char *code, PAD** padp) /* we get here either during compilation, or via pp_regcomp at runtime */ runtime = PL_op && (PL_op->op_type == OP_REGCOMP); if (runtime) - runcv = find_runcv(); + runcv = find_runcv(NULL); PL_op = &dummy; PL_op->op_type = OP_ENTEREVAL; @@ -2649,22 +2649,35 @@ Perl_sv_compile_2op(pTHX_ SV *sv, OP** startop, char *code, PAD** padp) =for apidoc find_runcv Locate the CV corresponding to the currently executing sub or eval. +If db_seqp is non_null, skip CVs that are in the DB package and populate +*db_seqp with the cop sequence number at the point that the DB:: code was +entered. (allows debuggers to eval in the scope of the breakpoint rather +than in in the scope of the debuger itself). =cut */ CV* -Perl_find_runcv(pTHX) +Perl_find_runcv(pTHX_ U32 *db_seqp) { I32 ix; PERL_SI *si; PERL_CONTEXT *cx; + if (db_seqp) + *db_seqp = PL_curcop->cop_seq; for (si = PL_curstackinfo; si; si = si->si_prev) { for (ix = si->si_cxix; ix >= 0; ix--) { cx = &(si->si_cxstack[ix]); - if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT) - return cx->blk_sub.cv; + if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT) { + CV *cv = cx->blk_sub.cv; + /* skip DB:: code */ + if (db_seqp && PL_debstash && CvSTASH(cv) == PL_debstash) { + *db_seqp = cx->blk_oldcop->cop_seq; + continue; + } + return cv; + } else if (CxTYPE(cx) == CXt_EVAL && !CxTRYBLOCK(cx)) return PL_compcv; } @@ -3222,6 +3235,7 @@ PP(pp_entereval) STRLEN len; OP *ret; CV* runcv; + U32 seq; if (!SvPV(sv,len)) RETPUSHUNDEF; @@ -3269,7 +3283,12 @@ PP(pp_entereval) PL_compiling.cop_io = newSVsv(PL_curcop->cop_io); SAVEFREESV(PL_compiling.cop_io); } - runcv = find_runcv(); + /* special case: an eval '' executed within the DB package gets lexically + * placed in the first non-DB CV rather than the current CV - this + * allows the debugger to execute code, find lexicals etc, in the + * scope of the code being debugged. Passing &seq gets find_runcv + * to do the dirty work for us */ + runcv = find_runcv(&seq); push_return(PL_op->op_next); PUSHBLOCK(cx, (CXt_EVAL|CXp_REAL), SP); @@ -3280,7 +3299,7 @@ PP(pp_entereval) if (PERLDB_LINE && PL_curstash != PL_debstash) save_lines(CopFILEAV(&PL_compiling), PL_linestr); PUTBACK; - ret = doeval(gimme, NULL, runcv, PL_curcop->cop_seq); + ret = doeval(gimme, NULL, runcv, seq); if (PERLDB_INTER && was != (I32)PL_sub_generation /* Some subs defined here. */ && ret != PL_op->op_next) { /* Successive compilation. */ strcpy(safestr, "_<(eval )"); /* Anything fake and short. */ |