diff options
-rw-r--r-- | ext/json/json.c | 2 | ||||
-rw-r--r-- | ext/json/json_encoder.c | 4 | ||||
-rw-r--r-- | ext/json/tests/bug72069.phpt | 29 |
3 files changed, 34 insertions, 1 deletions
diff --git a/ext/json/json.c b/ext/json/json.c index bd7c0b0c1b..d3c6111d4d 100644 --- a/ext/json/json.c +++ b/ext/json/json.c @@ -254,7 +254,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 8da5abd088..62df102847 100644 --- a/ext/json/json_encoder.c +++ b/ext/json/json_encoder.c @@ -457,6 +457,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); @@ -470,8 +471,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); @@ -479,6 +482,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-- +<?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}" |