Skip to content

Commit 5ea28fe

Browse files
huanghantaokocsismate
authored andcommitted
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
1 parent 4500309 commit 5ea28fe

File tree

5 files changed

+44
-47
lines changed

5 files changed

+44
-47
lines changed

Zend/zend_builtin_functions.c

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -917,25 +917,14 @@ static int same_name(zend_string *key, zend_string *name) /* {{{ */
917917
Returns an array of method names for class or class instance. */
918918
ZEND_FUNCTION(get_class_methods)
919919
{
920-
zval *klass;
921920
zval method_name;
922921
zend_class_entry *ce = NULL;
923922
zend_class_entry *scope;
924923
zend_function *mptr;
925924

926-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "z", &klass) == FAILURE) {
927-
RETURN_THROWS();
928-
}
929-
930-
if (Z_TYPE_P(klass) == IS_OBJECT) {
931-
ce = Z_OBJCE_P(klass);
932-
} else if (Z_TYPE_P(klass) == IS_STRING) {
933-
ce = zend_lookup_class(Z_STR_P(klass));
934-
}
935-
936-
if (!ce) {
937-
RETURN_NULL();
938-
}
925+
ZEND_PARSE_PARAMETERS_START(1, 1)
926+
Z_PARAM_CLASS_NAME_OR_OBJ(ce)
927+
ZEND_PARSE_PARAMETERS_END();
939928

940929
array_init(return_value);
941930
scope = zend_get_executed_scope();

Zend/zend_builtin_functions.stub.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ function get_object_vars(object $obj): array {}
4242

4343
function get_mangled_object_vars(object $obj): array {}
4444

45-
function get_class_methods($class): ?array {}
45+
function get_class_methods(string|object $class): array {}
4646

4747
function method_exists($object_or_class, string $method): bool {}
4848

Zend/zend_builtin_functions_arginfo.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash: 3ce3eab15ec8df2006633735f53f12cff142260c */
2+
* Stub hash: f81f2b4cf552c4ee8406b91c437797feb1164be0 */
33

44
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_version, 0, 0, IS_STRING, 0)
55
ZEND_END_ARG_INFO()
@@ -79,8 +79,8 @@ ZEND_END_ARG_INFO()
7979

8080
#define arginfo_get_mangled_object_vars arginfo_get_object_vars
8181

82-
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_get_class_methods, 0, 1, IS_ARRAY, 1)
83-
ZEND_ARG_INFO(0, class)
82+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_get_class_methods, 0, 1, IS_ARRAY, 0)
83+
ZEND_ARG_TYPE_MASK(0, class, MAY_BE_STRING|MAY_BE_OBJECT, NULL)
8484
ZEND_END_ARG_INFO()
8585

8686
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_method_exists, 0, 2, _IS_BOOL, 0)

ext/standard/tests/class_object/get_class_methods_basic_001.phpt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,11 @@ echo "Argument is name of class which has no methods:\n";
2525
var_dump( get_class_methods("D") );
2626

2727
echo "Argument is non existent class:\n";
28-
var_dump( get_class_methods("NonExistent") );
28+
try {
29+
var_dump( get_class_methods("NonExistent") );
30+
} catch (TypeError $exception) {
31+
echo $exception->getMessage() . "\n";
32+
}
2933

3034
echo "Done";
3135
?>
@@ -53,5 +57,5 @@ Argument is name of class which has no methods:
5357
array(0) {
5458
}
5559
Argument is non existent class:
56-
NULL
60+
get_class_methods(): Argument #1 ($class) must be a valid class name or object, string given
5761
Done

ext/standard/tests/class_object/get_class_methods_variation_001.phpt

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,11 @@ $values = array(
7070

7171
foreach($values as $value) {
7272
echo "\nArg value " . (is_object($value) ? get_class($value) : $value) . " \n";
73-
var_dump( get_class_methods($value) );
73+
try {
74+
var_dump( get_class_methods($value) );
75+
} catch (TypeError $exception) {
76+
echo $exception->getMessage() . "\n";
77+
}
7478
};
7579
echo "Done";
7680
?>
@@ -80,89 +84,89 @@ Error: 2 - Undefined variable $undefined_var
8084
Error: 2 - Undefined variable $unset_var
8185

8286
Arg value 0
83-
NULL
87+
get_class_methods(): Argument #1 ($class) must be a valid class name or object, int given
8488

8589
Arg value 1
86-
NULL
90+
get_class_methods(): Argument #1 ($class) must be a valid class name or object, int given
8791

8892
Arg value 12345
89-
NULL
93+
get_class_methods(): Argument #1 ($class) must be a valid class name or object, int given
9094

9195
Arg value -2345
92-
NULL
96+
get_class_methods(): Argument #1 ($class) must be a valid class name or object, int given
9397

9498
Arg value 10.5
95-
NULL
99+
get_class_methods(): Argument #1 ($class) must be a valid class name or object, float given
96100

97101
Arg value -10.5
98-
NULL
102+
get_class_methods(): Argument #1 ($class) must be a valid class name or object, float given
99103

100104
Arg value 101234567000
101-
NULL
105+
get_class_methods(): Argument #1 ($class) must be a valid class name or object, float given
102106

103107
Arg value 1.07654321E-9
104-
NULL
108+
get_class_methods(): Argument #1 ($class) must be a valid class name or object, float given
105109

106110
Arg value 0.5
107-
NULL
111+
get_class_methods(): Argument #1 ($class) must be a valid class name or object, float given
108112
Error: 2 - Array to string conversion
109113

110114
Arg value Array
111-
NULL
115+
get_class_methods(): Argument #1 ($class) must be a valid class name or object, array given
112116
Error: 2 - Array to string conversion
113117

114118
Arg value Array
115-
NULL
119+
get_class_methods(): Argument #1 ($class) must be a valid class name or object, array given
116120
Error: 2 - Array to string conversion
117121

118122
Arg value Array
119-
NULL
123+
get_class_methods(): Argument #1 ($class) must be a valid class name or object, array given
120124
Error: 2 - Array to string conversion
121125

122126
Arg value Array
123-
NULL
127+
get_class_methods(): Argument #1 ($class) must be a valid class name or object, array given
124128
Error: 2 - Array to string conversion
125129

126130
Arg value Array
127-
NULL
131+
get_class_methods(): Argument #1 ($class) must be a valid class name or object, array given
128132

129133
Arg value
130-
NULL
134+
get_class_methods(): Argument #1 ($class) must be a valid class name or object, null given
131135

132136
Arg value
133-
NULL
137+
get_class_methods(): Argument #1 ($class) must be a valid class name or object, null given
134138

135139
Arg value 1
136-
NULL
140+
get_class_methods(): Argument #1 ($class) must be a valid class name or object, bool given
137141

138142
Arg value
139-
NULL
143+
get_class_methods(): Argument #1 ($class) must be a valid class name or object, bool given
140144

141145
Arg value 1
142-
NULL
146+
get_class_methods(): Argument #1 ($class) must be a valid class name or object, bool given
143147

144148
Arg value
145-
NULL
149+
get_class_methods(): Argument #1 ($class) must be a valid class name or object, bool given
146150

147151
Arg value
148-
NULL
152+
get_class_methods(): Argument #1 ($class) must be a valid class name or object, string given
149153

150154
Arg value
151-
NULL
155+
get_class_methods(): Argument #1 ($class) must be a valid class name or object, string given
152156

153157
Arg value string
154-
NULL
158+
get_class_methods(): Argument #1 ($class) must be a valid class name or object, string given
155159

156160
Arg value string
157-
NULL
161+
get_class_methods(): Argument #1 ($class) must be a valid class name or object, string given
158162

159163
Arg value stdClass
160164
array(0) {
161165
}
162166

163167
Arg value
164-
NULL
168+
get_class_methods(): Argument #1 ($class) must be a valid class name or object, null given
165169

166170
Arg value
167-
NULL
171+
get_class_methods(): Argument #1 ($class) must be a valid class name or object, null given
168172
Done

0 commit comments

Comments
 (0)