X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/68853529b82cedc7fc5774cbdb57734af389f541..8f78557a961555c7d3a0f903d990f4f78b07624a:/sv.c diff --git a/sv.c b/sv.c index 5e61449..40d99cb 100644 --- a/sv.c +++ b/sv.c @@ -4497,14 +4497,17 @@ Perl_sv_force_normal_flags(pTHX_ register SV *sv, U32 flags) if (SvREADONLY(sv)) { if (SvFAKE(sv)) { char *pvx = SvPVX(sv); + int is_utf8 = SvUTF8(sv); STRLEN len = SvCUR(sv); U32 hash = SvUVX(sv); SvFAKE_off(sv); SvREADONLY_off(sv); + SvPVX(sv) = 0; + SvLEN(sv) = 0; SvGROW(sv, len + 1); Move(pvx,SvPVX(sv),len,char); *SvEND(sv) = '\0'; - unsharepvn(pvx, SvUTF8(sv) ? -(I32)len : len, hash); + unsharepvn(pvx, is_utf8 ? -(I32)len : len, hash); } else if (IN_PERL_RUNTIME) Perl_croak(aTHX_ PL_no_modify); @@ -5732,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) @@ -5828,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; } @@ -6053,7 +6060,8 @@ Perl_sv_pos_b2u(pTHX_ register SV* sv, I32* offsetp) assert(mg); if (!mg->mg_ptr) { - Newz(0, cache, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN); + mg->mg_len = PERL_MAGIC_UTF8_CACHESIZE * 2; + Newz(0, cache, mg->mg_len, STRLEN); mg->mg_ptr = (char *) cache; } assert(cache);