hi Nikita, There is no consensus on that change, pls revert that merge. It could be in master in the meantime but I would not apply it there as well.
Cheers, On Wed, Jun 27, 2012 at 12:28 PM, Nikita Popov <ni...@php.net> wrote: > Commit: d372b33c9b941be9a795bf3705bd22dc5f6092c3 > Author: Nikita Popov <ni...@php.net> Wed, 27 Jun 2012 12:28:55 > +0200 > Parents: 9a86784859067eaca44cad7f8b4aea00e3ffe6b2 > 4662151ea7d7b6920d115cf2a2d6e9d4232727a3 > Branches: PHP-5.4 master > > Link: > http://git.php.net/?p=php-src.git;a=commitdiff;h=d372b33c9b941be9a795bf3705bd22dc5f6092c3 > > Log: > Merge branch 'PHP-5.3' into PHP-5.4 > > * PHP-5.3: > Improve JSON error handling > > Conflicts: > ext/json/tests/bug54058.phpt > ext/json/tests/bug61537.phpt > > Bugs: > https://bugs.php.net/54058 > https://bugs.php.net/61537 > > Changed paths: > MM ext/json/json.c > MA ext/json/tests/bug43941.phpt > MA ext/json/tests/bug53946.phpt > MA ext/json/tests/bug61978.phpt > MM main/php_version.h > > > Diff: > diff --cc ext/json/json.c > index bc30251,5e0351f..5ea3070 > --- a/ext/json/json.c > +++ b/ext/json/json.c > @@@ -52,10 -49,10 +52,11 @@@ ZEND_BEGIN_ARG_INFO_EX(arginfo_json_dec > ZEND_ARG_INFO(0, json) > ZEND_ARG_INFO(0, assoc) > ZEND_ARG_INFO(0, depth) > + ZEND_ARG_INFO(0, options) > ZEND_END_ARG_INFO() > > - ZEND_BEGIN_ARG_INFO(arginfo_json_last_error, 0) > + ZEND_BEGIN_ARG_INFO_EX(arginfo_json_last_error, 0, 0, 0) > + ZEND_ARG_INFO(0, as_string) > ZEND_END_ARG_INFO() > /* }}} */ > > @@@ -393,9 -323,8 +392,8 @@@ static void json_escape_string(smart_st > if (utf16) { > efree(utf16); > } > - if (len < 0) { > + if (ulen < 0) { > JSON_G(error_code) = PHP_JSON_ERROR_UTF8; > - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid > UTF-8 sequence in argument"); > smart_str_appendl(buf, "null", 4); > } else { > smart_str_appendl(buf, "\"\"", 2); > @@@ -506,57 -428,7 +504,56 @@@ > } > > smart_str_appendc(buf, '"'); > - efree(utf16); > + if (utf16) { > + efree(utf16); > + } > +} > +/* }}} */ > + > + > +static void json_encode_serializable_object(smart_str *buf, zval *val, int > options TSRMLS_DC) /* {{{ */ > +{ > + zend_class_entry *ce = Z_OBJCE_P(val); > + zval *retval = NULL, fname; > + HashTable* myht; > + > + if (Z_TYPE_P(val) == IS_ARRAY) { > + myht = HASH_OF(val); > + } else { > + myht = Z_OBJPROP_P(val); > + } > + > + if (myht && myht->nApplyCount > 1) { > + JSON_G(error_code) = PHP_JSON_ERROR_RECURSION; > - php_error_docref(NULL TSRMLS_CC, E_WARNING, "recursion > detected"); > + smart_str_appendl(buf, "null", 4); > + return; > + } > + > + ZVAL_STRING(&fname, "jsonSerialize", 0); > + > + if (FAILURE == call_user_function_ex(EG(function_table), &val, > &fname, &retval, 0, NULL, 1, NULL TSRMLS_CC) || !retval) { > + zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Failed calling > %s::jsonSerialize()", ce->name); > + smart_str_appendl(buf, "null", sizeof("null") - 1); > + return; > + } > + > + if (EG(exception)) { > + /* Error already raised */ > + zval_ptr_dtor(&retval); > + smart_str_appendl(buf, "null", sizeof("null") - 1); > + return; > + } > + > + if ((Z_TYPE_P(retval) == IS_OBJECT) && > + (Z_OBJ_HANDLE_P(retval) == Z_OBJ_HANDLE_P(val))) { > + /* Handle the case where jsonSerialize does: return $this; by > going straight to encode array */ > + json_encode_array(buf, &retval, options TSRMLS_CC); > + } else { > + /* All other types, encode as normal */ > + php_json_encode(buf, retval, options TSRMLS_CC); > + } > + > + zval_ptr_dtor(&retval); > } > /* }}} */ > > diff --cc ext/json/tests/bug43941.phpt > index fb59b71,0000000..48bd7ad > mode 100644,000000..100644 > --- a/ext/json/tests/bug43941.phpt > +++ b/ext/json/tests/bug43941.phpt > @@@ -1,28 -1,0 +1,20 @@@ > +--TEST-- > +Bug #43941 (json_encode() invalid UTF-8) > +--SKIPIF-- > +<?php if (!extension_loaded("json")) print "skip"; ?> > +--FILE-- > +<?php > + > +var_dump(json_encode("abc")); > +var_dump(json_encode("ab\xE0")); > +var_dump(json_encode("ab\xE0", JSON_PARTIAL_OUTPUT_ON_ERROR)); > +var_dump(json_encode(array("ab\xE0", "ab\xE0c", "abc"), > JSON_PARTIAL_OUTPUT_ON_ERROR)); > + > +echo "Done\n"; > +?> > +--EXPECTF-- > +string(5) ""abc"" > - > - Warning: json_encode(): Invalid UTF-8 sequence in argument in %s on line %d > +bool(false) > - > - Warning: json_encode(): Invalid UTF-8 sequence in argument in %s on line %d > +string(4) "null" > - > - Warning: json_encode(): Invalid UTF-8 sequence in argument in %s on line %d > - > - Warning: json_encode(): Invalid UTF-8 sequence in argument in %s on line %d > +string(17) "[null,null,"abc"]" > +Done > diff --cc ext/json/tests/bug53946.phpt > index 079906f,0000000..111438d > mode 100644,000000..100644 > --- a/ext/json/tests/bug53946.phpt > +++ b/ext/json/tests/bug53946.phpt > @@@ -1,20 -1,0 +1,16 @@@ > +--TEST-- > +bug #53946 (json_encode() with JSON_UNESCAPED_UNICODE) > +--SKIPIF-- > +<?php if (!extension_loaded("json")) print "skip"; ?> > +--FILE-- > +<?php > +var_dump(json_encode("latin 1234 -/ russian мама мыла раму specialchars > \x02 \x08 \n U+1D11E >𝄞<")); > +var_dump(json_encode("latin 1234 -/ russian мама мыла раму specialchars > \x02 \x08 \n U+1D11E >𝄞<", JSON_UNESCAPED_UNICODE)); > +var_dump(json_encode("ab\xE0")); > +var_dump(json_encode("ab\xE0", JSON_UNESCAPED_UNICODE)); > +?> > +--EXPECTF-- > +string(156) ""latin 1234 -\/ russian \u043c\u0430\u043c\u0430 > \u043c\u044b\u043b\u0430 \u0440\u0430\u043c\u0443 specialchars \u0002 \b > \n U+1D11E >\ud834\udd1e<"" > +string(100) ""latin 1234 -\/ russian мама мыла раму specialchars \u0002 > \b \n U+1D11E >𝄞<"" > - > - Warning: json_encode(): Invalid UTF-8 sequence in argument in %s on line %d > +bool(false) > - > - Warning: json_encode(): Invalid UTF-8 sequence in argument in %s on line %d > +bool(false) > diff --cc ext/json/tests/bug61978.phpt > index 4c863c6,0000000..c34b03f > mode 100644,000000..100644 > --- a/ext/json/tests/bug61978.phpt > +++ b/ext/json/tests/bug61978.phpt > @@@ -1,47 -1,0 +1,43 @@@ > +--TEST-- > +Bug #61978 (Object recursion not detected for classes that implement > JsonSerializable) > +--SKIPIF-- > +<?php if (!extension_loaded("json")) print "skip"; ?> > +--FILE-- > +<?php > + > +class JsonTest1 { > + public $test; > + public $me; > + public function __construct() { > + $this->test = '123'; > + $this->me = $this; > + } > +} > + > +class JsonTest2 implements JsonSerializable { > + public $test; > + public function __construct() { > + $this->test = '123'; > + } > + public function jsonSerialize() { > + return array( > + 'test' => $this->test, > + 'me' => $this > + ); > + } > +} > + > + > +$obj1 = new JsonTest1(); > +var_dump(json_encode($obj1, JSON_PARTIAL_OUTPUT_ON_ERROR)); > + > - echo "\n==\n"; > ++echo "==\n"; > + > +$obj2 = new JsonTest2(); > +var_dump(json_encode($obj2, JSON_PARTIAL_OUTPUT_ON_ERROR)); > + > +?> > +--EXPECTF-- > - Warning: json_encode(): recursion detected in %s on line %d > +string(44) "{"test":"123","me":{"test":"123","me":null}}" > - > +== > - > - Warning: json_encode(): recursion detected in %s on line %d > +string(44) "{"test":"123","me":{"test":"123","me":null}}" > diff --cc main/php_version.h > index 6b49f40,2f65dbd..4b7709c > --- a/main/php_version.h > +++ b/main/php_version.h > @@@ -1,8 -1,8 +1,8 @@@ > /* automatically generated by configure */ > /* edit configure.in to change version number */ > #define PHP_MAJOR_VERSION 5 > -#define PHP_MINOR_VERSION 3 > -#define PHP_RELEASE_VERSION 15 > +#define PHP_MINOR_VERSION 4 > +#define PHP_RELEASE_VERSION 5 > #define PHP_EXTRA_VERSION "-dev" > -#define PHP_VERSION "5.3.15-dev" > -#define PHP_VERSION_ID 50315 > +#define PHP_VERSION "5.4.5-dev" > - #define PHP_VERSION_ID 50404 > ++#define PHP_VERSION_ID 50405 > > > -- > PHP CVS Mailing List (http://www.php.net/) > To unsubscribe, visit: http://www.php.net/unsub.php > -- Pierre @pierrejoye | http://blog.thepimp.net | http://www.libgd.org -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php