sv.c:sv_pos_u2b: Don’t cache anything on magical SVs
authorFather Chrysostomos <sprout@cpan.org>
Fri, 28 Sep 2012 13:16:55 +0000 (06:16 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Mon, 1 Oct 2012 19:51:54 +0000 (12:51 -0700)
This should not change the behaviour.  It is just unnecessary to cache
positions on a magical string, as we then just have to invalidate the
cache in mg_get.  It will be more efficient just not to create the
cache to begin with.

This does not allow us to remove the cache invalidation in mg_get,
because the cache can sometimes be created while magic is being called
and SvMAGICAL is off.  It just avoids extra work in those cases that
are detectable.

sv.c

index ee0f755..041cfaf 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -6642,7 +6642,7 @@ S_sv_pos_u2b_cached(pTHX_ SV *const sv, MAGIC **const mgp, const U8 *const start
     if (!uoffset)
        return 0;
 
-    if (!SvREADONLY(sv)
+    if (!SvREADONLY(sv) && !SvGMAGICAL(sv)
        && PL_utf8cache
        && (*mgp || (SvTYPE(sv) >= SVt_PVMG &&
                     (*mgp = mg_find(sv, PERL_MAGIC_utf8))))) {
@@ -6725,7 +6725,7 @@ S_sv_pos_u2b_cached(pTHX_ SV *const sv, MAGIC **const mgp, const U8 *const start
        boffset = real_boffset;
     }
 
-    if (PL_utf8cache) {
+    if (PL_utf8cache && !SvGMAGICAL(sv)) {
        if (at_end)
            utf8_mg_len_cache_update(sv, mgp, uoffset);
        else