This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
In Perl_sv_2[inu]v_flags(), use the non-caching code whenever SvVALID() is true
authorNicholas Clark <nick@ccl4.org>
Mon, 23 May 2011 17:14:45 +0000 (18:14 +0100)
committerNicholas Clark <nick@ccl4.org>
Sat, 11 Jun 2011 07:03:10 +0000 (09:03 +0200)
Previous the non-caching code was only used when SvVALID() was true on a PVGV.
However, PVLVs can also perform all the roles of a PVGV, so could conceivably
be acting as FBMs. As it's safe to test SvVALID() on any scalar SV, do so, as
the compiler can combine the flag test for SvVALID() with that for
SvGMAGICAL(), producing tighter object code.

sv.c

diff --git a/sv.c b/sv.c
index d75bfbe..530e3bb 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -2267,7 +2267,7 @@ Perl_sv_2iv_flags(pTHX_ register SV *const sv, const I32 flags)
     dVAR;
     if (!sv)
        return 0;
-    if (SvGMAGICAL(sv) || (SvTYPE(sv) == SVt_PVGV && SvVALID(sv))) {
+    if (SvGMAGICAL(sv) || SvVALID(sv)) {
        /* FBMs use the space for SvIVX and SvNVX for other purposes, and use
           the same flag bit as SVf_IVisUV, so must not let them cache IVs.
           In practice they are extremely unlikely to actually get anywhere
@@ -2356,7 +2356,7 @@ Perl_sv_2uv_flags(pTHX_ register SV *const sv, const I32 flags)
     dVAR;
     if (!sv)
        return 0;
-    if (SvGMAGICAL(sv) || (SvTYPE(sv) == SVt_PVGV && SvVALID(sv))) {
+    if (SvGMAGICAL(sv) || SvVALID(sv)) {
        /* FBMs use the space for SvIVX and SvNVX for other purposes, and use
           the same flag bit as SVf_IVisUV, so must not let them cache IVs.  */
        if (flags & SV_GMAGIC)
@@ -2436,7 +2436,7 @@ Perl_sv_2nv_flags(pTHX_ register SV *const sv, const I32 flags)
     dVAR;
     if (!sv)
        return 0.0;
-    if (SvGMAGICAL(sv) || (SvTYPE(sv) == SVt_PVGV && SvVALID(sv))) {
+    if (SvGMAGICAL(sv) || SvVALID(sv)) {
        /* FBMs use the space for SvIVX and SvNVX for other purposes, and use
           the same flag bit as SVf_IVisUV, so must not let them cache NVs.  */
        if (flags & SV_GMAGIC)