From: codinghuang <2812240764@qq.com> Date: Wed, 1 Jul 2020 14:49:57 +0000 (+0800) Subject: Use correct ZPP mechanism in get_class_methods() X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5ea28fe6c4e109a723adb408ebc9da8696096a4f;p=php Use correct ZPP mechanism in get_class_methods() From now on, instead of returning null, an exception is thrown when not a string or an object is passed to the function. Closes GH-5792 --- diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index 881624d321..47c44c8fd6 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -917,25 +917,14 @@ static int same_name(zend_string *key, zend_string *name) /* {{{ */ Returns an array of method names for class or class instance. */ ZEND_FUNCTION(get_class_methods) { - zval *klass; zval method_name; zend_class_entry *ce = NULL; zend_class_entry *scope; zend_function *mptr; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "z", &klass) == FAILURE) { - RETURN_THROWS(); - } - - if (Z_TYPE_P(klass) == IS_OBJECT) { - ce = Z_OBJCE_P(klass); - } else if (Z_TYPE_P(klass) == IS_STRING) { - ce = zend_lookup_class(Z_STR_P(klass)); - } - - if (!ce) { - RETURN_NULL(); - } + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_CLASS_NAME_OR_OBJ(ce) + ZEND_PARSE_PARAMETERS_END(); array_init(return_value); scope = zend_get_executed_scope(); diff --git a/Zend/zend_builtin_functions.stub.php b/Zend/zend_builtin_functions.stub.php index a79aced5fe..18b64bfa03 100644 --- a/Zend/zend_builtin_functions.stub.php +++ b/Zend/zend_builtin_functions.stub.php @@ -42,7 +42,7 @@ function get_object_vars(object $obj): array {} function get_mangled_object_vars(object $obj): array {} -function get_class_methods($class): ?array {} +function get_class_methods(string|object $class): array {} function method_exists($object_or_class, string $method): bool {} diff --git a/Zend/zend_builtin_functions_arginfo.h b/Zend/zend_builtin_functions_arginfo.h index be297c299e..1964c121c9 100644 --- a/Zend/zend_builtin_functions_arginfo.h +++ b/Zend/zend_builtin_functions_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 3ce3eab15ec8df2006633735f53f12cff142260c */ + * Stub hash: f81f2b4cf552c4ee8406b91c437797feb1164be0 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_version, 0, 0, IS_STRING, 0) ZEND_END_ARG_INFO() @@ -79,8 +79,8 @@ ZEND_END_ARG_INFO() #define arginfo_get_mangled_object_vars arginfo_get_object_vars -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_get_class_methods, 0, 1, IS_ARRAY, 1) - ZEND_ARG_INFO(0, class) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_get_class_methods, 0, 1, IS_ARRAY, 0) + ZEND_ARG_TYPE_MASK(0, class, MAY_BE_STRING|MAY_BE_OBJECT, NULL) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_method_exists, 0, 2, _IS_BOOL, 0) diff --git a/ext/standard/tests/class_object/get_class_methods_basic_001.phpt b/ext/standard/tests/class_object/get_class_methods_basic_001.phpt index bfe78801ea..27993799d3 100644 --- a/ext/standard/tests/class_object/get_class_methods_basic_001.phpt +++ b/ext/standard/tests/class_object/get_class_methods_basic_001.phpt @@ -25,7 +25,11 @@ echo "Argument is name of class which has no methods:\n"; var_dump( get_class_methods("D") ); echo "Argument is non existent class:\n"; -var_dump( get_class_methods("NonExistent") ); +try { + var_dump( get_class_methods("NonExistent") ); +} catch (TypeError $exception) { + echo $exception->getMessage() . "\n"; +} echo "Done"; ?> @@ -53,5 +57,5 @@ Argument is name of class which has no methods: array(0) { } Argument is non existent class: -NULL +get_class_methods(): Argument #1 ($class) must be a valid class name or object, string given Done diff --git a/ext/standard/tests/class_object/get_class_methods_variation_001.phpt b/ext/standard/tests/class_object/get_class_methods_variation_001.phpt index 523faf25e7..7538b29403 100644 --- a/ext/standard/tests/class_object/get_class_methods_variation_001.phpt +++ b/ext/standard/tests/class_object/get_class_methods_variation_001.phpt @@ -70,7 +70,11 @@ $values = array( foreach($values as $value) { echo "\nArg value " . (is_object($value) ? get_class($value) : $value) . " \n"; - var_dump( get_class_methods($value) ); + try { + var_dump( get_class_methods($value) ); + } catch (TypeError $exception) { + echo $exception->getMessage() . "\n"; + } }; echo "Done"; ?> @@ -80,89 +84,89 @@ Error: 2 - Undefined variable $undefined_var Error: 2 - Undefined variable $unset_var Arg value 0 -NULL +get_class_methods(): Argument #1 ($class) must be a valid class name or object, int given Arg value 1 -NULL +get_class_methods(): Argument #1 ($class) must be a valid class name or object, int given Arg value 12345 -NULL +get_class_methods(): Argument #1 ($class) must be a valid class name or object, int given Arg value -2345 -NULL +get_class_methods(): Argument #1 ($class) must be a valid class name or object, int given Arg value 10.5 -NULL +get_class_methods(): Argument #1 ($class) must be a valid class name or object, float given Arg value -10.5 -NULL +get_class_methods(): Argument #1 ($class) must be a valid class name or object, float given Arg value 101234567000 -NULL +get_class_methods(): Argument #1 ($class) must be a valid class name or object, float given Arg value 1.07654321E-9 -NULL +get_class_methods(): Argument #1 ($class) must be a valid class name or object, float given Arg value 0.5 -NULL +get_class_methods(): Argument #1 ($class) must be a valid class name or object, float given Error: 2 - Array to string conversion Arg value Array -NULL +get_class_methods(): Argument #1 ($class) must be a valid class name or object, array given Error: 2 - Array to string conversion Arg value Array -NULL +get_class_methods(): Argument #1 ($class) must be a valid class name or object, array given Error: 2 - Array to string conversion Arg value Array -NULL +get_class_methods(): Argument #1 ($class) must be a valid class name or object, array given Error: 2 - Array to string conversion Arg value Array -NULL +get_class_methods(): Argument #1 ($class) must be a valid class name or object, array given Error: 2 - Array to string conversion Arg value Array -NULL +get_class_methods(): Argument #1 ($class) must be a valid class name or object, array given Arg value -NULL +get_class_methods(): Argument #1 ($class) must be a valid class name or object, null given Arg value -NULL +get_class_methods(): Argument #1 ($class) must be a valid class name or object, null given Arg value 1 -NULL +get_class_methods(): Argument #1 ($class) must be a valid class name or object, bool given Arg value -NULL +get_class_methods(): Argument #1 ($class) must be a valid class name or object, bool given Arg value 1 -NULL +get_class_methods(): Argument #1 ($class) must be a valid class name or object, bool given Arg value -NULL +get_class_methods(): Argument #1 ($class) must be a valid class name or object, bool given Arg value -NULL +get_class_methods(): Argument #1 ($class) must be a valid class name or object, string given Arg value -NULL +get_class_methods(): Argument #1 ($class) must be a valid class name or object, string given Arg value string -NULL +get_class_methods(): Argument #1 ($class) must be a valid class name or object, string given Arg value string -NULL +get_class_methods(): Argument #1 ($class) must be a valid class name or object, string given Arg value stdClass array(0) { } Arg value -NULL +get_class_methods(): Argument #1 ($class) must be a valid class name or object, null given Arg value -NULL +get_class_methods(): Argument #1 ($class) must be a valid class name or object, null given Done