From: Xinchen Hui Date: Sat, 23 Apr 2016 04:41:44 +0000 (-0700) Subject: Fixed bug #72069 (Behavior \JsonSerializable different from json_encode) X-Git-Tag: php-7.0.7RC1~79 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=589d0e0f187ff82f90110057f624c958f0d3ec86;p=php Fixed bug #72069 (Behavior \JsonSerializable different from json_encode) --- diff --git a/NEWS b/NEWS index fc20ad4ac5..64a0743e96 100644 --- a/NEWS +++ b/NEWS @@ -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) diff --git a/ext/json/json.c b/ext/json/json.c index 81258cb734..6571bf99f0 100644 --- a/ext/json/json.c +++ b/ext/json/json.c @@ -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; diff --git a/ext/json/json_encoder.c b/ext/json/json_encoder.c index 6c2f377034..ae9e086fc0 100644 --- a/ext/json/json_encoder.c +++ b/ext/json/json_encoder.c @@ -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); diff --git a/ext/json/tests/bug72069.phpt b/ext/json/tests/bug72069.phpt new file mode 100644 index 0000000000..0ff8c98621 --- /dev/null +++ b/ext/json/tests/bug72069.phpt @@ -0,0 +1,29 @@ +--TEST-- +Bug #72069 (Behavior \JsonSerializable different from json_encode) +--SKIPIF-- + +--FILE-- + 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}"