Fixed bug #72069 (Behavior \JsonSerializable different from json_encode)

This commit is contained in:
Xinchen Hui 2016-04-22 21:41:44 -07:00
parent 9eb7c8cd3b
commit 589d0e0f18
4 changed files with 38 additions and 1 deletions

4
NEWS
View File

@ -11,6 +11,10 @@ PHP NEWS
(Nikita)
. Fixed bug #72059 (?? is not allowed on constant expressions). (Bob, Marcio)
- JSON:
. Fixed bug #72069 (Behavior \JsonSerializable different from json_encode).
(Laruence)
- OCI8:
. Fixed bug #71600 (oci_fetch_all segfaults when selecting more than eight
columns). (Tian Yang)

View File

@ -253,7 +253,7 @@ static PHP_FUNCTION(json_decode)
return;
}
JSON_G(error_code) = 0;
JSON_G(error_code) = PHP_JSON_ERROR_NONE;
if (!str_len) {
JSON_G(error_code) = PHP_JSON_ERROR_SYNTAX;

View File

@ -448,6 +448,7 @@ static void php_json_encode_serializable_object(smart_str *buf, zval *val, int o
zend_class_entry *ce = Z_OBJCE_P(val);
zval retval, fname;
HashTable* myht;
int origin_error_code;
if (Z_TYPE_P(val) == IS_ARRAY) {
myht = Z_ARRVAL_P(val);
@ -461,8 +462,10 @@ static void php_json_encode_serializable_object(smart_str *buf, zval *val, int o
return;
}
ZVAL_STRING(&fname, "jsonSerialize");
origin_error_code = JSON_G(error_code);
if (FAILURE == call_user_function_ex(EG(function_table), val, &fname, &retval, 0, NULL, 1, NULL) || Z_TYPE(retval) == IS_UNDEF) {
zend_throw_exception_ex(NULL, 0, "Failed calling %s::jsonSerialize()", ZSTR_VAL(ce->name));
smart_str_appendl(buf, "null", sizeof("null") - 1);
@ -470,6 +473,7 @@ static void php_json_encode_serializable_object(smart_str *buf, zval *val, int o
return;
}
JSON_G(error_code) = origin_error_code;
if (EG(exception)) {
/* Error already raised */
zval_ptr_dtor(&retval);

View File

@ -0,0 +1,29 @@
--TEST--
Bug #72069 (Behavior \JsonSerializable different from json_encode)
--SKIPIF--
<?php if (!extension_loaded("json")) print "skip"; ?>
--FILE--
<?php
$result = json_encode(['end' => json_decode(null, true)]);
var_dump($result);
class A implements \JsonSerializable
{
function jsonSerialize()
{
return ['end' => json_decode(null, true)];
}
}
$a = new A();
$toJsonData = $a->jsonSerialize();
$result = json_encode($a);
var_dump($result);
$result = json_encode($toJsonData);
var_dump($result);
?>
--EXPECT--
string(12) "{"end":null}"
string(12) "{"end":null}"
string(12) "{"end":null}"