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: | Nikita Popov | 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()