This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
SvTRUE(): inline ROK, outline NOK
authorDavid Mitchell <davem@iabyn.com>
Sat, 8 Jul 2017 10:23:18 +0000 (11:23 +0100)
committerDavid Mitchell <davem@iabyn.com>
Thu, 27 Jul 2017 10:30:22 +0000 (11:30 +0100)
SvTRUE (and its variants) are wrappers around sv_2bool(), which
attempt to test for the common cases without the overhead of a function
call.

This commit changes the definition of common:

SvROK() becomes common: it's very common to test whether a variable
is undef or a ref;
SvNOK becomes uncommon: these days perl prefers IV values over NV values
in SVs whenever possible, so testing the truth value of an NV is less
common.

sv.c
sv.h

diff --git a/sv.c b/sv.c
index c17cb92..777f49e 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -3366,6 +3366,10 @@ Perl_sv_2bool_flags(pTHX_ SV *sv, I32 flags)
     if (isREGEXP(sv))
        return
          RX_WRAPLEN(sv) > 1 || (RX_WRAPLEN(sv) && *RX_WRAPPED(sv) != '0');
+
+    if (SvNOK(sv) && !SvPOK(sv))
+        return SvNVX(sv) != 0.0;
+
     return SvTRUE_common(sv, isGV_with_GP(sv) ? 1 : 0);
 }
 
diff --git a/sv.h b/sv.h
index b80aba1..ad7046a 100644 (file)
--- a/sv.h
+++ b/sv.h
@@ -1774,9 +1774,11 @@ Like C<sv_utf8_upgrade>, but doesn't do magic on C<sv>.
        ? 0                                             \
     : SvPOK(sv)                                                \
        ? SvPVXtrue(sv)                                 \
-    : (SvFLAGS(sv) & (SVf_IOK|SVf_NOK))                        \
-       ? (   (SvIOK(sv) && SvIVX(sv) != 0)             \
-          || (SvNOK(sv) && SvNVX(sv) != 0.0))          \
+    : SvIOK(sv)                                                \
+        ? SvIVX(sv)                                     \
+    : (SvROK(sv) && !(   SvOBJECT(SvRV(sv))             \
+                      && HvAMAGIC(SvSTASH(SvRV(sv)))))  \
+        ? TRUE                                          \
     : (fallback))
 
 #if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)