summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pp.c3
-rw-r--r--t/re/substr.t14
2 files changed, 14 insertions, 3 deletions
diff --git a/pp.c b/pp.c
index d2bb466c1c..d857c7e916 100644
--- a/pp.c
+++ b/pp.c
@@ -3540,7 +3540,8 @@ PP(pp_substr)
}
}
SPAGAIN;
- PUSHs(TARG); /* avoid SvSETMAGIC here */
+ SvSETMAGIC(TARG);
+ PUSHs(TARG);
RETURN;
bound_fail:
diff --git a/t/re/substr.t b/t/re/substr.t
index 4f34b2660c..a0cac6ab70 100644
--- a/t/re/substr.t
+++ b/t/re/substr.t
@@ -22,9 +22,9 @@ $SIG{__WARN__} = sub {
}
};
-require './test.pl';
+BEGIN { require './test.pl'; }
-plan(361);
+plan(362);
run_tests() unless caller;
@@ -735,3 +735,13 @@ $destroyed = 0;
$x = bless({}, 'Class');
}
is($destroyed, 1, 'Timely scalar destruction with lvalue substr');
+
+# [perl #77692] UTF8 cache not being reset when TARG is reused
+ok eval {
+ local ${^UTF8CACHE} = -1;
+ for my $i (0..1)
+ {
+ my $dummy = length(substr("\x{100}",0,$i));
+ }
+ 1
+}, 'UTF8 cache is reset when TARG is reused [perl #77692]';