- Core:
. Fixed bug #72101 (crash on complex code). (Dmitry)
+ . Fixed bug #72100 (implode() inserts garbage into resulting string when
+ joins very big integer). (Mikhail Galanin)
. Fixed bug #72057 (PHP Hangs when using custom error handler and typehint).
(Nikita Nefedov)
. Fixed bug #72038 (Function calls with values to a by-ref parameter don't
ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(arr), tmp) {
if (Z_TYPE_P(tmp) == IS_LONG) {
- double val = Z_LVAL_P(tmp);
+ zend_long val = Z_LVAL_P(tmp);
+
*++strptr = NULL;
((zend_long *) (strings + numelems))[strptr - strings] = Z_LVAL_P(tmp);
- if (val < 0) {
- val = -10 * val;
+ if (val <= 0) {
+ len++;
}
- if (val < 10) {
+ while (val) {
+ val /= 10;
len++;
- } else {
- len += (int) log10(10 * (double) val);
}
} else {
*++strptr = zval_get_string(tmp);
--- /dev/null
+--TEST--
+Test implode() function, problems with big numbers
+--SKIPIF--
+<?php
+if (PHP_INT_SIZE != 8) die("skip this test is for 64bit platform only");
+?>
+--FILE--
+<?php
+var_dump( implode(" ", ["hello long", 999999999999999999, PHP_INT_MAX]));
+var_dump( implode(" ", ["hello negative long", -999999999999999999, PHP_INT_MIN] ) );
+var_dump( implode(" ", ["hello small long", -101, -100, -99, -90, -11, -10, -9, -1, 0, 1, 2, 9, 10, 11, 90, 99, 100, 101] ) );
+echo "Done\n";
+?>
+--EXPECT--
+string(49) "hello long 999999999999999999 9223372036854775807"
+string(60) "hello negative long -999999999999999999 -9223372036854775808"
+string(76) "hello small long -101 -100 -99 -90 -11 -10 -9 -1 0 1 2 9 10 11 90 99 100 101"
+Done