summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTony Cook <tony@develop-help.com>2015-11-19 10:04:25 +1100
committerTony Cook <tony@develop-help.com>2015-11-24 14:02:04 +1100
commit2efdfb1e6cf6ff62b97356abd74ba479aee48bc1 (patch)
tree04c31a5cf10184aad362ffc85fc735a3ddc1cfc0
parent1a7cb6482feeead144ca91eb5258ac811e6aa01e (diff)
downloadperl-2efdfb1e6cf6ff62b97356abd74ba479aee48bc1.tar.gz
[perl #126635] don't shortcut when SVf_IVisUV is set
Most integers are small, so in most cases it won't be set. The other option would be to always clear it, but that increases the amount of inline code for a rare case.
-rw-r--r--pp.h4
-rw-r--r--t/op/int.t14
2 files changed, 15 insertions, 3 deletions
diff --git a/pp.h b/pp.h
index 687b0ca665..60fe9ee1f8 100644
--- a/pp.h
+++ b/pp.h
@@ -377,7 +377,7 @@ Does not use C<TARG>. See also C<L</XPUSHu>>, C<L</mPUSHu>> and C<L</PUSHu>>.
STMT_START { \
IV TARGi_iv = i; \
if (LIKELY( \
- ((SvFLAGS(TARG) & (SVTYPEMASK|SVf_THINKFIRST)) == SVt_IV) \
+ ((SvFLAGS(TARG) & (SVTYPEMASK|SVf_THINKFIRST|SVf_IVisUV)) == SVt_IV) \
& (do_taint ? !TAINT_get : 1))) \
{ \
/* Cheap SvIOK_only(). \
@@ -399,7 +399,7 @@ Does not use C<TARG>. See also C<L</XPUSHu>>, C<L</mPUSHu>> and C<L</PUSHu>>.
STMT_START { \
UV TARGu_uv = u; \
if (LIKELY( \
- ((SvFLAGS(TARG) & (SVTYPEMASK|SVf_THINKFIRST)) == SVt_IV) \
+ ((SvFLAGS(TARG) & (SVTYPEMASK|SVf_THINKFIRST|SVf_IVisUV)) == SVt_IV) \
& (do_taint ? !TAINT_get : 1) \
& (TARGu_uv <= (UV)IV_MAX))) \
{ \
diff --git a/t/op/int.t b/t/op/int.t
index 9aad020a48..dda49080da 100644
--- a/t/op/int.t
+++ b/t/op/int.t
@@ -4,9 +4,10 @@ BEGIN {
chdir 't' if -d 't';
@INC = '../lib';
require './test.pl';
+ require Config;
}
-plan 15;
+plan 17;
# compile time evaluation
@@ -71,3 +72,14 @@ cmp_ok($y, '==', 4745162525730, 'compile time division, result of about 42 bits'
$y = 279964589018079;
$y = int($y/59);
cmp_ok($y, '==', 4745162525730, 'run time divison, result of about 42 bits');
+
+SKIP:
+{ # see #126635
+ my $large;
+ $large = eval "0xffff_ffff" if $Config::Config{ivsize} == 4;
+ $large = eval "0xffff_ffff_ffff_ffff" if $Config::Config{ivsize} == 8;
+ $large or skip "Unusual ivsize", 1;
+ for my $x ($large, -1) {
+ cmp_ok($x, "==", int($x), "check $x == int($x)");
+ }
+}