diff options
author | Adrian M. Enache <enache@rdslink.ro> | 2003-12-11 20:11:07 +0000 |
---|---|---|
committer | Enache Adrian <enache@rdslink.ro> | 2003-12-11 20:11:07 +0000 |
commit | 8f78557a961555c7d3a0f903d990f4f78b07624a (patch) | |
tree | 1bdcfdf6ccf0942c07c13402a5db302b278425ba /sv.c | |
parent | 8068f8fb8571bdb471f5f6ae0c96570a053c869b (diff) | |
download | perl-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.c | 12 |
1 files changed, 8 insertions, 4 deletions
@@ -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; } |