From 589d0e0f187ff82f90110057f624c958f0d3ec86 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Fri, 22 Apr 2016 21:41:44 -0700 Subject: [PATCH] Fixed bug #72069 (Behavior \JsonSerializable different from json_encode) --- NEWS | 4 ++++ ext/json/json.c | 2 +- ext/json/json_encoder.c | 4 ++++ ext/json/tests/bug72069.phpt | 29 +++++++++++++++++++++++++++++ 4 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 ext/json/tests/bug72069.phpt diff --git a/NEWS b/NEWS index fc20ad4ac53..64a0743e963 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 81258cb7342..6571bf99f0e 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 6c2f3770349..ae9e086fc05 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 00000000000..0ff8c98621f --- /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}"