summaryrefslogtreecommitdiff
path: root/sv.c
diff options
context:
space:
mode:
authorAdrian M. Enache <enache@rdslink.ro>2003-12-11 20:11:07 +0000
committerEnache Adrian <enache@rdslink.ro>2003-12-11 20:11:07 +0000
commit8f78557a961555c7d3a0f903d990f4f78b07624a (patch)
tree1bdcfdf6ccf0942c07c13402a5db302b278425ba /sv.c
parent8068f8fb8571bdb471f5f6ae0c96570a053c869b (diff)
downloadperl-8f78557a961555c7d3a0f903d990f4f78b07624a.tar.gz
fix bug #24605.
substr() wasn't working when used repeatedly on the same utf-8 string. p4raw-id: //depot/perl@21875
Diffstat (limited to 'sv.c')
-rw-r--r--sv.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/sv.c b/sv.c
index 6f53c587e4..40d99cbdbb 100644
--- a/sv.c
+++ b/sv.c
@@ -5735,10 +5735,8 @@ S_utf8_mg_pos_init(pTHX_ SV *sv, MAGIC **mgp, STRLEN **cachep, I32 i, I32 *offse
bool found = FALSE;
if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
- if (!*mgp) {
- sv_magic(sv, 0, PERL_MAGIC_utf8, 0, 0);
- *mgp = mg_find(sv, PERL_MAGIC_utf8);
- }
+ if (!*mgp)
+ *mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, &PL_vtbl_utf8, 0, 0);
assert(*mgp);
if ((*mgp)->mg_ptr)
@@ -5831,6 +5829,12 @@ S_utf8_mg_pos(pTHX_ SV *sv, MAGIC **mgp, STRLEN **cachep, I32 i, I32 *offsetp, I
/* Update the cache. */
(*cachep)[i] = (STRLEN)uoff;
(*cachep)[i+1] = p - start;
+
+ /* Drop the stale "length" cache */
+ if (i == 0) {
+ (*cachep)[2] = 0;
+ (*cachep)[3] = 0;
+ }
found = TRUE;
}