diff options
author | Perl 5 Porters <perl5-porters@africa.nicoh.com> | 1996-12-23 12:58:58 +1200 |
---|---|---|
committer | Chip Salzenberg <chip@atlantic.net> | 1996-12-23 12:58:58 +1200 |
commit | 71be2cbc73608e37e1a2ab7e459a02111137d1b0 (patch) | |
tree | 86679f00907a9abdfd1ff5104cec60d9a9fb0ef9 /pp_hot.c | |
parent | b133f4ec823b00faf9bd083e0eb8e7a53ba7bfca (diff) | |
download | perl-71be2cbc73608e37e1a2ab7e459a02111137d1b0.tar.gz |
[inseparable changes from patch from perl5.003_13 to perl5.003_14]
CORE LANGUAGE CHANGES
Subject: Eliminate support for {if,unless,while,until} BLOCK BLOCK
From: Chip Salzenberg <chip@atlantic.net>
Files: perly.c perly.c.diff perly.y toke.c
Subject: Taint $x after $x =~ s/pat/xyz/ if pat or xyz is tainted by locale
From: Chip Salzenberg <chip@atlantic.net>
Files: cop.h mg.c pp_ctl.c pp_hot.c
Subject: Complete support for modifying undefined array members in foreach
From: Chip Salzenberg <chip@atlantic.net>
Files: global.sym mg.c perl.h pp.c pp_hot.c proto.h sv.c
DOCUMENTATION
Subject: Update pod/Makefile; s/perli18n/perllocale/
From: Chip Salzenberg <chip@atlantic.net>
Files: ext/POSIX/POSIX.pod lib/I18N/Collate.pm pod/Makefile pod/perl.pod pod/perlmod.pod pod/perlnews.pod pod/roffitall
OTHER CORE CHANGES
Subject: Bug in debugger with import manipulations
Date: Mon, 23 Dec 1996 05:37:48 -0500 (EST)
From: Ilya Zakharevich <ilya@math.ohio-state.edu>
Files: pp_hot.c
Finally I traced why MakeMaker runs wrongly under debugger: debugger
function calling sequence was assuming that
GvCV(CvGV(cv)) == cv
for non-anonymous subs (ne END). MakeMaker managed to break it by
*A::B = \&C::D;
eval 'sub C::D {new one}';
After this CvGV(\&A::B) is *C::D, but &{*C::D} is the "new one".
Patch follows (note that in this case we do not sacrifice having a
subroutine name in debugger output ;-).
Enjoy,
p5p-msgid: <199612231037.FAA08617@monk.mps.ohio-state.edu>
Subject: Import and dynamic methods
Date: Mon, 23 Dec 1996 01:45:37 -0500 (EST)
From: Ilya Zakharevich <ilya@math.ohio-state.edu>
Files: gv.c hv.c sv.c
Here is the patch which corrects bad things which happens when you
import subroutines and otherwise manipulate the symbol tree.
I put forward the only chunk which may be controversal, since it may
have a minor performance penalty. It is independent of the others, so
it can be freely deleted.
The manipulations which correctly propagate to method calls:
a) Pruning globs: delete $B::{method}
b) Undefing subroutines: undef &B::method;
c) Importing: *B::method = \&mymethod;
Enjoy,
p5p-msgid: <199612230645.BAA08378@monk.mps.ohio-state.edu>
Subject: sv_gets patch
Date: Sun, 22 Dec 1996 03:24:04 -0500 (EST)
From: Ilya Zakharevich <ilya@math.ohio-state.edu>
Files: pp_hot.c
I sent this patch before as a part of
pos $str =
$str = /failing/g
patch. Now I separate it in the case it was tainted by environment:
Synopsis:
$a = <FH>;
does not work as expected if $a is magic (say, tied).
Enjoy,
p5p-msgid: <199612220824.DAA07235@monk.mps.ohio-state.edu>
Subject: pos $str patch
Date: Sun, 22 Dec 1996 03:31:21 -0500 (EST)
From: Ilya Zakharevich <ilya@math.ohio-state.edu>
Files: mg.c pp_hot.c t/op/pat.t
This patch was (mostly) posted already.
It fixes the bug:
pos $str
is reset to undef if
$str =~ /failing/g
fails.
Additionally, if fixes the hidded bit (=MGf_MINMATCH) surviving
setting
pos $str = ...
Enjoy,
p5p-msgid: <199612220831.DAA07247@monk.mps.ohio-state.edu>
PORTABILITY
Subject: Fix bugs in bincompat3 usage
From: Chip Salzenberg <chip@atlantic.net>
Files: perl.h perl_exp.SH
Subject: VMS patches to 5.003_13
Date: Mon, 23 Dec 1996 01:26:47 -0500 (EST)
From: Charles Bailey <bailey@HMIVAX.HUMGEN.UPENN.EDU>
Files: deb.c ext/POSIX/POSIX.xs gv.c lib/File/Copy.pm mg.c perl.c perl.h proto.h sv.c t/lib/filecopy.t taint.c toke.c util.c vms/Makefile vms/config.vms vms/descrip.mms vms/gen_shrfls.pl vms/genconfig.pl vms/genopt.com vms/perly_c.vms vms/perly_h.vms vms/test.com vms/vms.c vms/vms_yfix.pl
private-msgid: <01IDBYYFYPIS002ASE@hmivax.humgen.upenn.edu>
UTILITIES, LIBRARY, AND EXTENSIONS
Subject: Remove libnet
From: Chip Salzenberg <chip@atlantic.net>
Files: MANIFEST pod/perlmod.pod
Subject: Update IO->VERSION() to 1.1201 for CPAN's sake
From: Chip Salzenberg <chip@atlantic.net>
Files: ext/IO/lib/IO/Handle.pm lib/IO/Handle.pm
Subject: Remodel File::Copy.
From: Chip Salzenberg <chip@atlantic.net>
Files: lib/File/Copy.pm
Diffstat (limited to 'pp_hot.c')
-rw-r--r-- | pp_hot.c | 230 |
1 files changed, 111 insertions, 119 deletions
@@ -894,8 +894,6 @@ play_it_again: else mg->mg_flags &= ~MGf_MINMATCH; } - else - mg->mg_len = -1; } LEAVE_SCOPE(oldsave); RETPUSHYES; @@ -932,13 +930,6 @@ nope: ++BmUSEFUL(pm->op_pmshort); ret_no: - if (global) { - if (SvTYPE(TARG) >= SVt_PVMG && SvMAGIC(TARG)) { - MAGIC* mg = mg_find(TARG, 'g'); - if (mg) - mg->mg_len = -1; - } - } LEAVE_SCOPE(oldsave); if (gimme == G_ARRAY) RETURN; @@ -1157,6 +1148,7 @@ do_readline() SvTAINTED_on(sv); } IoLINES(io)++; + SvSETMAGIC(sv); XPUSHs(sv); if (type == OP_GLOB) { char *tmps; @@ -1314,11 +1306,9 @@ PP(pp_iter) cx = &cxstack[cxstack_ix]; if (cx->cx_type != CXt_LOOP) DIE("panic: pp_iter"); - av = cx->blk_loop.iterary; - if (av == curstack && cx->blk_loop.iterix >= cx->blk_oldsp) - RETPUSHNO; - if (cx->blk_loop.iterix >= AvFILL(av)) + av = cx->blk_loop.iterary; + if (cx->blk_loop.iterix >= (av == curstack ? cx->blk_oldsp : AvFILL(av))) RETPUSHNO; if (sv = AvARRAY(av)[++cx->blk_loop.iterix]) @@ -1327,6 +1317,10 @@ PP(pp_iter) sv = &sv_undef; if (av != curstack && SvIMMORTAL(sv)) { SV *lv = cx->blk_loop.iterlval; + if (lv && SvREFCNT(lv) > 1) { + SvREFCNT_dec(lv); + lv = Nullsv; + } if (lv) SvREFCNT_dec(LvTARG(lv)); else { @@ -1360,6 +1354,7 @@ PP(pp_subst) I32 maxiters; register I32 i; bool once; + bool rxtainted; char *orig; I32 safebase; register REGEXP *rx = pm->op_pmregexp; @@ -1427,116 +1422,105 @@ PP(pp_subst) pm->op_pmshort = Nullsv; /* opt is being useless */ } } + + /* only replace once? */ once = !(rpm->op_pmflags & PMf_GLOBAL); - if (rpm->op_pmflags & PMf_CONST) { /* known replacement string? */ - c = SvPV(dstr, clen); - if (clen <= rx->minlen) { - /* can do inplace substitution */ - if (pregexec(rx, s, strend, orig, 0, - SvSCREAM(TARG) ? TARG : Nullsv, safebase)) { - if (force_on_match) { - force_on_match = 0; - s = SvPV_force(TARG, len); - goto force_it; + + /* known replacement string? */ + c = (rpm->op_pmflags & PMf_CONST) ? SvPV(dstr, clen) : Nullch; + + /* can do inplace substitution? */ + if (c && clen <= rx->minlen) { + if (! pregexec(rx, s, strend, orig, 0, + SvSCREAM(TARG) ? TARG : Nullsv, safebase)) { + PUSHs(&sv_no); + LEAVE_SCOPE(oldsave); + RETURN; + } + if (force_on_match) { + force_on_match = 0; + s = SvPV_force(TARG, len); + goto force_it; + } + if (rx->subbase) /* oops, no we can't */ + goto long_way; + d = s; + curpm = pm; + SvSCREAM_off(TARG); /* disable possible screamer */ + if (once) { + rxtainted = rx->exec_tainted; + m = rx->startp[0]; + d = rx->endp[0]; + s = orig; + if (m - s > strend - d) { /* faster to shorten from end */ + if (clen) { + Copy(c, m, clen, char); + m += clen; } - if (rx->subbase) /* oops, no we can't */ - goto long_way; - d = s; - curpm = pm; - SvSCREAM_off(TARG); /* disable possible screamer */ - if (once) { - m = rx->startp[0]; - d = rx->endp[0]; - s = orig; - if (m - s > strend - d) { /* faster to shorten from end */ - if (clen) { - Copy(c, m, clen, char); - m += clen; - } - i = strend - d; - if (i > 0) { - Move(d, m, i, char); - m += i; - } - *m = '\0'; - SvCUR_set(TARG, m - s); - (void)SvPOK_only(TARG); - SvSETMAGIC(TARG); - PUSHs(&sv_yes); - LEAVE_SCOPE(oldsave); - RETURN; - } - /*SUPPRESS 560*/ - else if (i = m - s) { /* faster from front */ - d -= clen; - m = d; - sv_chop(TARG, d-i); - s += i; - while (i--) - *--d = *--s; - if (clen) - Copy(c, m, clen, char); - (void)SvPOK_only(TARG); - SvSETMAGIC(TARG); - PUSHs(&sv_yes); - LEAVE_SCOPE(oldsave); - RETURN; - } - else if (clen) { - d -= clen; - sv_chop(TARG, d); - Copy(c, d, clen, char); - (void)SvPOK_only(TARG); - SvSETMAGIC(TARG); - PUSHs(&sv_yes); - LEAVE_SCOPE(oldsave); - RETURN; - } - else { - sv_chop(TARG, d); - (void)SvPOK_only(TARG); - SvSETMAGIC(TARG); - PUSHs(&sv_yes); - LEAVE_SCOPE(oldsave); - RETURN; - } - /* NOTREACHED */ + i = strend - d; + if (i > 0) { + Move(d, m, i, char); + m += i; } - do { - if (iters++ > maxiters) - DIE("Substitution loop"); - m = rx->startp[0]; - /*SUPPRESS 560*/ - if (i = m - s) { - if (s != d) - Move(s, d, i, char); - d += i; - } - if (clen) { - Copy(c, d, clen, char); - d += clen; - } - s = rx->endp[0]; - } while (pregexec(rx, s, strend, orig, s == m, - Nullsv, TRUE)); /* (don't match same null twice) */ - if (s != d) { - i = strend - s; - SvCUR_set(TARG, d - SvPVX(TARG) + i); - Move(s, d, i+1, char); /* include the Null */ + *m = '\0'; + SvCUR_set(TARG, m - s); + } + /*SUPPRESS 560*/ + else if (i = m - s) { /* faster from front */ + d -= clen; + m = d; + sv_chop(TARG, d-i); + s += i; + while (i--) + *--d = *--s; + if (clen) + Copy(c, m, clen, char); + } + else if (clen) { + d -= clen; + sv_chop(TARG, d); + Copy(c, d, clen, char); + } + else { + sv_chop(TARG, d); + } + PUSHs(&sv_yes); + } + else { + rxtainted = 0; + do { + if (iters++ > maxiters) + DIE("Substitution loop"); + rxtainted |= rx->exec_tainted; + m = rx->startp[0]; + /*SUPPRESS 560*/ + if (i = m - s) { + if (s != d) + Move(s, d, i, char); + d += i; } - (void)SvPOK_only(TARG); - SvSETMAGIC(TARG); - PUSHs(sv_2mortal(newSViv((I32)iters))); - LEAVE_SCOPE(oldsave); - RETURN; + if (clen) { + Copy(c, d, clen, char); + d += clen; + } + s = rx->endp[0]; + } while (pregexec(rx, s, strend, orig, s == m, + Nullsv, TRUE)); /* don't match same null twice */ + if (s != d) { + i = strend - s; + SvCUR_set(TARG, d - SvPVX(TARG) + i); + Move(s, d, i+1, char); /* include the NUL */ } - PUSHs(&sv_no); - LEAVE_SCOPE(oldsave); - RETURN; + PUSHs(sv_2mortal(newSViv((I32)iters))); } + (void)SvPOK_only(TARG); + SvSETMAGIC(TARG); + if (rxtainted) + SvTAINTED_on(TARG); + LEAVE_SCOPE(oldsave); + RETURN; } - else - c = Nullch; + if (pregexec(rx, s, strend, orig, 0, SvSCREAM(TARG) ? TARG : Nullsv, safebase)) { long_way: @@ -1545,6 +1529,7 @@ PP(pp_subst) s = SvPV_force(TARG, len); goto force_it; } + rxtainted = rx->exec_tainted; dstr = NEWSV(25, sv_len(TARG)); sv_setpvn(dstr, m, s-m); curpm = pm; @@ -1556,6 +1541,7 @@ PP(pp_subst) do { if (iters++ > maxiters) DIE("Substitution loop"); + rxtainted |= rx->exec_tainted; if (rx->subbase && rx->subbase != orig) { m = s; s = orig; @@ -1583,6 +1569,8 @@ PP(pp_subst) (void)SvPOK_only(TARG); SvSETMAGIC(TARG); + if (rxtainted) + SvTAINTED_on(TARG); PUSHs(sv_2mortal(newSViv((I32)iters))); LEAVE_SCOPE(oldsave); RETURN; @@ -1762,12 +1750,16 @@ PP(pp_entersub) gimme = GIMME; if ((op->op_private & OPpENTERSUB_DB)) { + SV *oldsv = sv; sv = GvSV(DBsub); save_item(sv); gv = CvGV(cv); - if ( CvFLAGS(cv) & (CVf_ANON | CVf_CLONED) - || strEQ(GvNAME(gv), "END") ) { - /* GV is potentially non-unique */ + if ( (CvFLAGS(cv) & (CVf_ANON | CVf_CLONED)) + || strEQ(GvNAME(gv), "END") + || ((GvCV(gv) != cv) && /* Could be imported, and old sub redefined. */ + !( (SvTYPE(oldsv) == SVt_PVGV) && (GvCV((GV*)oldsv) == cv) + && (gv = (GV*)oldsv) ))) { /* Use GV from the stack as a fallback. */ + /* GV is potentially non-unique, or contain different CV. */ sv_setsv(sv, newRV((SV*)cv)); } else { |