com php-src: Fix STR_OR_OBJ_OF_TYPE stringable hand ling: Zend/tests/str_or_obj_of_class_zpp.phpt Zend/zend_API.h

From: Date: Wed, 29 Jul 2020 09:29:49 +0000
Subject: com php-src: Fix STR_OR_OBJ_OF_TYPE stringable hand ling: Zend/tests/str_or_obj_of_class_zpp.phpt Zend/zend_API.h
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-112423@lists.php.net to get a copy of this message
Commit: 993be4b9bf34b2d1a7c288599b0e011aa9f33906 Author: Nikita Popov <nikita.ppv@gmail.com> Wed, 29 Jul 2020 11:29:24 +0200 Parents: 213494f55d7e4f8508ea6f0892d9ad8172783ee3 Branches: master Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=993be4b9bf34b2d1a7c288599b0e011aa9f33906 Log: Fix STR_OR_OBJ_OF_TYPE stringable handling Changed paths: M Zend/tests/str_or_obj_of_class_zpp.phpt M Zend/zend_API.h Diff: diff --git a/Zend/tests/str_or_obj_of_class_zpp.phpt b/Zend/tests/str_or_obj_of_class_zpp.phpt index b8c38ba060..3f32ea9a8a 100644 --- a/Zend/tests/str_or_obj_of_class_zpp.phpt +++ b/Zend/tests/str_or_obj_of_class_zpp.phpt @@ -8,11 +8,17 @@ if (!extension_loaded('zend-test')) die('skip zend-test extension not loaded'); <?php class Foo {} +class ToString { + public function __toString() { + return "ToString"; + } +} var_dump(zend_string_or_stdclass("string")); var_dump(zend_string_or_stdclass(1)); var_dump(zend_string_or_stdclass(null)); var_dump(zend_string_or_stdclass(new stdClass())); +var_dump(zend_string_or_stdclass(new ToString())); try { zend_string_or_stdclass([]); @@ -30,6 +36,7 @@ var_dump(zend_string_or_stdclass_or_null("string")); var_dump(zend_string_or_stdclass_or_null(1)); var_dump(zend_string_or_stdclass_or_null(null)); var_dump(zend_string_or_stdclass_or_null(new stdClass())); +var_dump(zend_string_or_stdclass_or_null(new ToString())); try { zend_string_or_stdclass_or_null([]); @@ -50,6 +57,7 @@ string(1) "1" string(0) "" object(stdClass)#1 (0) { } +string(8) "ToString" zend_string_or_stdclass(): Argument #1 ($param) must be of type stdClass|string, array given zend_string_or_stdclass(): Argument #1 ($param) must be of type stdClass|string, Foo given string(6) "string" @@ -57,5 +65,6 @@ string(1) "1" NULL object(stdClass)#1 (0) { } +string(8) "ToString" zend_string_or_stdclass_or_null(): Argument #1 ($param) must be of type stdClass|string|null, array given zend_string_or_stdclass_or_null(): Argument #1 ($param) must be of type stdClass|string|null, Foo given diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 46b7f26190..7733d18584 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -2014,24 +2014,15 @@ static zend_always_inline int zend_parse_arg_str_or_obj( zval *arg, zend_string **destination_string, zend_object **destination_object, zend_class_entry *base_ce, int allow_null ) { if (EXPECTED(Z_TYPE_P(arg) == IS_OBJECT)) { - if (base_ce && UNEXPECTED(!instanceof_function(Z_OBJCE_P(arg), base_ce))) { - return 0; + if (!base_ce || EXPECTED(instanceof_function(Z_OBJCE_P(arg), base_ce))) { + *destination_string = NULL; + *destination_object = Z_OBJ_P(arg); + return 1; } - - *destination_string = NULL; - *destination_object = Z_OBJ_P(arg); - } else if (EXPECTED(Z_TYPE_P(arg) == IS_STRING)) { - *destination_string = Z_STR_P(arg); - *destination_object = NULL; - } else if (allow_null && EXPECTED(Z_TYPE_P(arg) == IS_NULL)) { - *destination_string = NULL; - *destination_object = NULL; - } else { - *destination_object = NULL; - return zend_parse_arg_str_slow(arg, destination_string); } - return 1; + *destination_object = NULL; + return zend_parse_arg_str(arg, destination_string, allow_null); } END_EXTERN_C()

« previous php.cvs (#112423) next »