summaryrefslogtreecommitdiff
path: root/pp_hot.c
diff options
context:
space:
mode:
authorPerl 5 Porters <perl5-porters@africa.nicoh.com>1996-12-23 12:58:58 +1200
committerChip Salzenberg <chip@atlantic.net>1996-12-23 12:58:58 +1200
commit71be2cbc73608e37e1a2ab7e459a02111137d1b0 (patch)
tree86679f00907a9abdfd1ff5104cec60d9a9fb0ef9 /pp_hot.c
parentb133f4ec823b00faf9bd083e0eb8e7a53ba7bfca (diff)
downloadperl-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.c230
1 files changed, 111 insertions, 119 deletions
diff --git a/pp_hot.c b/pp_hot.c
index fb28bfee83..ba49535d0c 100644
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -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 {