]> granicus.if.org Git - php/commitdiff
Fixed bug #72069 (Behavior \JsonSerializable different from json_encode)
authorXinchen Hui <laruence@gmail.com>
Sat, 23 Apr 2016 04:41:44 +0000 (21:41 -0700)
committerXinchen Hui <laruence@gmail.com>
Sat, 23 Apr 2016 04:41:44 +0000 (21:41 -0700)
NEWS
ext/json/json.c
ext/json/json_encoder.c
ext/json/tests/bug72069.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index fc20ad4ac538517d069e1334c9a7cf612577e30d..64a0743e9635103c08f5f32f80112c84b383bc44 100644 (file)
--- 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)
index 81258cb73425c38496fa36e1b917d6487f698d55..6571bf99f0e65aeffdbcb2bf4dc52278e4580f27 100644 (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;
index 6c2f377034923b58039ae535e40ca4d161faab13..ae9e086fc05b54fe5755bc2705fa0644d8e34bc7 100644 (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);
diff --git a/ext/json/tests/bug72069.phpt b/ext/json/tests/bug72069.phpt
new file mode 100644 (file)
index 0000000..0ff8c98
--- /dev/null
@@ -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}"