]> granicus.if.org Git - php/commitdiff
Use correct ZPP mechanism in get_class_methods()
authorcodinghuang <2812240764@qq.com>
Wed, 1 Jul 2020 14:49:57 +0000 (22:49 +0800)
committerMáté Kocsis <kocsismate@woohoolabs.com>
Thu, 2 Jul 2020 09:40:05 +0000 (11:40 +0200)
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

Zend/zend_builtin_functions.c
Zend/zend_builtin_functions.stub.php
Zend/zend_builtin_functions_arginfo.h
ext/standard/tests/class_object/get_class_methods_basic_001.phpt
ext/standard/tests/class_object/get_class_methods_variation_001.phpt

index 881624d321a87d1903c3f7f0cfcbccdab52a8202..47c44c8fd6137292c30ca353ea3adcf0a6f3de04 100644 (file)
@@ -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();
index a79aced5fed7ecec842853e79a60088588a93937..18b64bfa0343dd5fc21421a510a476561f11ca66 100644 (file)
@@ -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 {}
 
index be297c299e2e36cb6f8e63280b8d3f0bfe1df9dd..1964c121c978e9edea496db099cfa5110873f169 100644 (file)
@@ -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)
index bfe78801ead42d389d3caa8f5586ea84bb2796c1..27993799d324ca84d1a53a22f2f57f505ae170ea 100644 (file)
@@ -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
index 523faf25e774308b7119ec1f007a04684c2aa6b3..7538b294038ea89b956fb3cfddd76374c0f4dce3 100644 (file)
@@ -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