Skip to content

Commit

Permalink
Merge branch 'PHP-5.4' into PHP-5.5
Browse files Browse the repository at this point in the history
* PHP-5.4:
  Alter php_json_decode_ex() to respect JSON_BIGINT_AS_STRING for bare numbers.
  • Loading branch information
LawnGnome committed Dec 11, 2012
2 parents ec83534 + 2d1694d commit 8bb106d
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 3 deletions.
31 changes: 28 additions & 3 deletions ext/json/json.c
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -693,7 +693,7 @@ PHP_JSON_API void php_json_decode_ex(zval *return_value, char *str, int str_len,
else else
{ {
double d; double d;
int type; int type, overflow_info;
long p; long p;


RETVAL_NULL(); RETVAL_NULL();
Expand All @@ -709,11 +709,36 @@ PHP_JSON_API void php_json_decode_ex(zval *return_value, char *str, int str_len,
RETVAL_BOOL(0); RETVAL_BOOL(0);
} }


if ((type = is_numeric_string(str, str_len, &p, &d, 0)) != 0) { if ((type = is_numeric_string_ex(str, str_len, &p, &d, 0, &overflow_info)) != 0) {
if (type == IS_LONG) { if (type == IS_LONG) {
RETVAL_LONG(p); RETVAL_LONG(p);
} else if (type == IS_DOUBLE) { } else if (type == IS_DOUBLE) {
RETVAL_DOUBLE(d); if (options & PHP_JSON_BIGINT_AS_STRING && overflow_info) {
/* Within an object or array, a numeric literal is assumed
* to be an integer if and only if it's entirely made up of
* digits (exponent notation will result in the number
* being treated as a double). We'll match that behaviour
* here. */
int i;
zend_bool is_float = 0;

for (i = (str[0] == '-' ? 1 : 0); i < str_len; i++) {
/* Not using isdigit() because it's locale specific,
* but we expect JSON input to always be UTF-8. */
if (str[i] < '0' || str[i] > '9') {
is_float = 1;
break;
}
}

if (is_float) {
RETVAL_DOUBLE(d);
} else {
RETVAL_STRINGL(str, str_len, 1);
}
} else {
RETVAL_DOUBLE(d);
}
} }
} }


Expand Down
32 changes: 32 additions & 0 deletions ext/json/tests/bug63737.phpt
Original file line number Original file line Diff line number Diff line change
@@ -0,0 +1,32 @@
--TEST--
Bug #63737 (json_decode does not properly decode with options parameter)
--SKIPIF--
<?php if (!extension_loaded("json")) print "skip"; ?>
--FILE--
<?php
function decode($json) {
$x = json_decode($json);
var_dump($x);
$x = json_decode($json, false, 512, JSON_BIGINT_AS_STRING);
var_dump($x);
}

decode('123456789012345678901234567890');
decode('-123456789012345678901234567890');

// This shouldn't affect floats, but let's check that.
decode('123456789012345678901234567890.1');
decode('-123456789012345678901234567890.1');

echo "Done\n";
?>
--EXPECT--
float(1.2345678901235E+29)
string(30) "123456789012345678901234567890"
float(-1.2345678901235E+29)
string(31) "-123456789012345678901234567890"
float(1.2345678901235E+29)
float(1.2345678901235E+29)
float(-1.2345678901235E+29)
float(-1.2345678901235E+29)
Done

0 comments on commit 8bb106d

Please sign in to comment.