summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJarkko Hietaniemi <jhi@iki.fi>2000-11-05 19:38:24 +0000
committerJarkko Hietaniemi <jhi@iki.fi>2000-11-05 19:38:24 +0000
commit084916e3fc0f2b4a3c1f5c34365624111b26973e (patch)
treee263a30417b781c6d5db92d1577035f7ef25cc4c
parent1cf6bcb82b487d8b46243d2e315539ffa9189b1f (diff)
downloadperl-084916e3fc0f2b4a3c1f5c34365624111b26973e.tar.gz
Fix for bug id 19990615.008, pos() unset during s///ge.
p4raw-id: //depot/perl@7562
-rw-r--r--pp_ctl.c15
-rwxr-xr-xt/op/pos.t9
2 files changed, 23 insertions, 1 deletions
diff --git a/pp_ctl.c b/pp_ctl.c
index 729a438f32..fce163fc3e 100644
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -211,6 +211,21 @@ PP(pp_substcont)
cx->sb_m = m = rx->startp[0] + orig;
sv_catpvn(dstr, s, m-s);
cx->sb_s = rx->endp[0] + orig;
+ { /* Update the pos() information. */
+ SV *sv = cx->sb_targ;
+ MAGIC *mg;
+ I32 i;
+ if (SvTYPE(sv) < SVt_PVMG)
+ SvUPGRADE(sv, SVt_PVMG);
+ if (!(mg = mg_find(sv, 'g'))) {
+ sv_magic(sv, Nullsv, 'g', Nullch, 0);
+ mg = mg_find(sv, 'g');
+ }
+ i = m - orig;
+ if (DO_UTF8(sv))
+ sv_pos_b2u(sv, &i);
+ mg->mg_len = i;
+ }
cx->sb_rxtainted |= RX_MATCH_TAINTED(rx);
rxres_save(&cx->sb_rxres, rx);
RETURNOP(pm->op_pmreplstart);
diff --git a/t/op/pos.t b/t/op/pos.t
index 46811b7bbc..f3bc23c84a 100755
--- a/t/op/pos.t
+++ b/t/op/pos.t
@@ -1,6 +1,6 @@
#!./perl
-print "1..3\n";
+print "1..4\n";
$x='banana';
$x=~/.a/g;
@@ -14,3 +14,10 @@ sub f { my $p=$_[0]; return $p }
$x=~/.a/g;
if (f(pos($x))==4) {print "ok 3\n"} else {print "not ok 3\n";}
+# Is pos() set inside //g? (bug id 19990615.008)
+$x = "test string?"; $x =~ s/\w/pos($x)/eg;
+print "not " unless $x eq "0123 5678910?";
+print "ok 4\n";
+
+
+