Skip to content

Commit fac58cd

Browse files
committed
Fix test + int losing precision with float fix
1 parent 5e46a0d commit fac58cd

File tree

3 files changed

+88
-60
lines changed

3 files changed

+88
-60
lines changed

ext/standard/array.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -1249,7 +1249,7 @@ PHP_FUNCTION(min)
12491249
min_lval = Z_LVAL(args[i]);
12501250
min = &args[i];
12511251
}
1252-
} else if (Z_TYPE(args[i]) == IS_DOUBLE) {
1252+
} else if (Z_TYPE(args[i]) == IS_DOUBLE && ((zend_long)(double) min_lval == min_lval)) {
12531253
min_dval = (double) min_lval;
12541254
goto double_compare;
12551255
} else {
@@ -1268,7 +1268,7 @@ PHP_FUNCTION(min)
12681268
min_dval = Z_DVAL(args[i]);
12691269
min = &args[i];
12701270
}
1271-
} else if (Z_TYPE(args[i]) == IS_LONG) {
1271+
} else if (Z_TYPE(args[i]) == IS_LONG && ((zend_long)(double) Z_LVAL(args[i]) == Z_LVAL(args[i]))) {
12721272
if (min_dval > (double)Z_LVAL(args[i])) {
12731273
min_dval = (double)Z_LVAL(args[i]);
12741274
min = &args[i];
@@ -1336,7 +1336,7 @@ PHP_FUNCTION(max)
13361336
max_lval = Z_LVAL(args[i]);
13371337
max = &args[i];
13381338
}
1339-
} else if (Z_TYPE(args[i]) == IS_DOUBLE) {
1339+
} else if (Z_TYPE(args[i]) == IS_DOUBLE && ((zend_long)(double) max_lval == max_lval)) {
13401340
max_dval = (double) max_lval;
13411341
goto double_compare;
13421342
} else {
@@ -1355,7 +1355,7 @@ PHP_FUNCTION(max)
13551355
max_dval = Z_DVAL(args[i]);
13561356
max = &args[i];
13571357
}
1358-
} else if (Z_TYPE(args[i]) == IS_LONG) {
1358+
} else if (Z_TYPE(args[i]) == IS_LONG && ((zend_long)(double) Z_LVAL(args[i]) == Z_LVAL(args[i]))) {
13591359
if (max_dval < (double)Z_LVAL(args[i])) {
13601360
max_dval = (double)Z_LVAL(args[i]);
13611361
max = &args[i];
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,63 @@
11
--TEST--
22
Check max() optimisation for int and float types
3+
--SKIPIF--
4+
<?php if (PHP_INT_SIZE != 8) die("skip this test is for 64bit platform only"); ?>
35
--FILE--
46
<?php
57

68
echo "Start as int optimisation:\n";
7-
var_dump(max([
9+
var_dump(max(
810
10, 5, 3, 2
9-
]));
10-
var_dump(max([
11+
));
12+
var_dump(max(
1113
2, 3, 5, 10
12-
]));
13-
var_dump(max([
14+
));
15+
var_dump(max(
1416
10, 5, 3.5, 2
15-
]));
16-
var_dump(max([
17+
));
18+
var_dump(max(
1719
2, 3.5, 5, 10
18-
]));
19-
var_dump(max([
20+
));
21+
var_dump(max(
2022
10, 5, "3", 2
21-
]));
22-
var_dump(max([
23+
));
24+
var_dump(max(
2325
2, "3", 5, 10
24-
]));
25-
var_dump(max([
26+
));
27+
var_dump(max(
2628
2, 3, "15", 10
27-
]));
29+
));
30+
echo "Check that int not representable as float works:\n";
31+
var_dump(max(
32+
PHP_INT_MIN+1, PHP_INT_MIN, PHP_INT_MIN*2)
33+
);
2834

2935
echo "Start as float optimisation:\n";
30-
var_dump(max([
36+
var_dump(max(
3137
10.5, 5.5, 3.5, 2.5
32-
]));
33-
var_dump(max([
38+
));
39+
var_dump(max(
3440
2.5, 3.5, 5.5, 10.5
35-
]));
36-
var_dump(max([
41+
));
42+
var_dump(max(
3743
10.5, 5.5, 3, 2.5
38-
]));
39-
var_dump(max([
44+
));
45+
var_dump(max(
4046
2.5, 3, 5.5, 10.5
41-
]));
42-
var_dump(max([
47+
));
48+
var_dump(max(
4349
10.5, 5.5, "3.5", 2.5
44-
]));
45-
var_dump(max([
50+
));
51+
var_dump(max(
4652
2.5, "3.5", 5.5, 10.5
47-
]));
48-
var_dump(max([
53+
));
54+
var_dump(max(
4955
2.5, 3.5, "15.5", 10.5
50-
]));
56+
));
57+
echo "Check that int not representable as float works:\n";
58+
var_dump(max(
59+
PHP_INT_MIN*2, PHP_INT_MIN, PHP_INT_MIN+1)
60+
);
5161

5262
?>
5363
--EXPECT--
@@ -59,6 +69,8 @@ int(10)
5969
int(10)
6070
int(10)
6171
string(2) "15"
72+
Check that int not representable as float works:
73+
int(-9223372036854775807)
6274
Start as float optimisation:
6375
float(10.5)
6476
float(10.5)
@@ -67,3 +79,5 @@ float(10.5)
6779
float(10.5)
6880
float(10.5)
6981
string(4) "15.5"
82+
Check that int not representable as float works:
83+
int(-9223372036854775807)
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,63 @@
11
--TEST--
22
Check min() optimisation for int and float types
3+
--SKIPIF--
4+
<?php if (PHP_INT_SIZE != 8) die("skip this test is for 64bit platform only"); ?>
35
--FILE--
46
<?php
57

68
echo "Start as int optimisation:\n";
7-
var_dump(min([
9+
var_dump(min(
810
10, 5, 3, 2
9-
]));
10-
var_dump(min([
11+
));
12+
var_dump(min(
1113
2, 3, 5, 10
12-
]));
13-
var_dump(min([
14+
));
15+
var_dump(min(
1416
10, 5, 3.5, 2
15-
]));
16-
var_dump(min([
17+
));
18+
var_dump(min(
1719
2, 3.5, 5, 10
18-
]));
19-
var_dump(min([
20+
));
21+
var_dump(min(
2022
10, 5, "3", 2
21-
]));
22-
var_dump(min([
23+
));
24+
var_dump(min(
2325
2, "3", 5, 10
24-
]));
25-
var_dump(min([
26+
));
27+
var_dump(min(
2628
2, 3, "1", 10
27-
]));
29+
));
30+
echo "Check that int not representable as float works:\n";
31+
var_dump(min(
32+
PHP_INT_MAX-1, PHP_INT_MAX, PHP_INT_MAX*2)
33+
);
2834

2935
echo "Start as float optimisation:\n";
30-
var_dump(min([
36+
var_dump(min(
3137
10.5, 5.5, 3.5, 2.5
32-
]));
33-
var_dump(min([
38+
));
39+
var_dump(min(
3440
2.5, 3.5, 5.5, 10.5
35-
]));
36-
var_dump(min([
41+
));
42+
var_dump(min(
3743
10.5, 5.5, 3, 2.5
38-
]));
39-
var_dump(min([
44+
));
45+
var_dump(min(
4046
2.5, 3, 5.5, 10.5
41-
]));
42-
var_dump(min([
47+
));
48+
var_dump(min(
4349
10.5, 5.5, "3.5", 2.5
44-
]));
45-
var_dump(min([
50+
));
51+
var_dump(min(
4652
2.5, "3.5", 5.5, 10.5
47-
]));
48-
var_dump(min([
53+
));
54+
var_dump(min(
4955
2.5, 3.5, "1.5", 10.5
50-
]));
56+
));
57+
echo "Check that int not representable as float works:\n";
58+
var_dump(min(
59+
PHP_INT_MAX*2, PHP_INT_MAX, PHP_INT_MAX-1)
60+
);
5161

5262
?>
5363
--EXPECT--
@@ -59,6 +69,8 @@ int(2)
5969
int(2)
6070
int(2)
6171
string(1) "1"
72+
Check that int not representable as float works:
73+
int(9223372036854775806)
6274
Start as float optimisation:
6375
float(2.5)
6476
float(2.5)
@@ -67,3 +79,5 @@ float(2.5)
6779
float(2.5)
6880
float(2.5)
6981
string(3) "1.5"
82+
Check that int not representable as float works:
83+
int(9223372036854775806)

0 commit comments

Comments
 (0)