@@ -150,6 +150,11 @@ static inline reflection_object *reflection_object_from_obj(zend_object *obj) {
150
150
151
151
static zend_object_handlers reflection_object_handlers ;
152
152
153
+ static inline zend_bool is_closure_invoke (zend_class_entry * ce , zend_string * lcname ) {
154
+ return ce == zend_ce_closure
155
+ && zend_string_equals_literal (lcname , ZEND_INVOKE_FUNC_NAME );
156
+ }
157
+
153
158
static zval * _default_load_name (zval * object ) /* {{{ */
154
159
{
155
160
return zend_hash_find_ex_ind (Z_OBJPROP_P (object ), ZSTR_KNOWN (ZEND_STR_NAME ), 1 );
@@ -474,8 +479,7 @@ static void _class_string(smart_str *str, zend_class_entry *ce, zval *obj, char
474
479
{
475
480
zend_function * closure ;
476
481
/* see if this is a closure */
477
- if (ce == zend_ce_closure && obj && (len == sizeof (ZEND_INVOKE_FUNC_NAME )- 1 )
478
- && memcmp (ZSTR_VAL (mptr -> common .function_name ), ZEND_INVOKE_FUNC_NAME , sizeof (ZEND_INVOKE_FUNC_NAME )- 1 ) == 0
482
+ if (obj && is_closure_invoke (ce , mptr -> common .function_name )
479
483
&& (closure = zend_get_closure_invoke_method (Z_OBJ_P (obj ))) != NULL )
480
484
{
481
485
mptr = closure ;
@@ -2268,30 +2272,26 @@ ZEND_METHOD(reflection_parameter, __construct)
2268
2272
2269
2273
/* First, find the function */
2270
2274
switch (Z_TYPE_P (reference )) {
2271
- case IS_STRING : {
2272
- size_t lcname_len ;
2273
- char * lcname ;
2274
-
2275
- lcname_len = Z_STRLEN_P (reference );
2276
- lcname = zend_str_tolower_dup (Z_STRVAL_P (reference ), lcname_len );
2277
- if ((fptr = zend_hash_str_find_ptr (EG (function_table ), lcname , lcname_len )) == NULL ) {
2278
- efree (lcname );
2275
+ case IS_STRING :
2276
+ {
2277
+ zend_string * lcname = zend_string_tolower (Z_STR_P (reference ));
2278
+ fptr = zend_hash_find_ptr (EG (function_table ), lcname );
2279
+ zend_string_release (lcname );
2280
+ if (!fptr ) {
2279
2281
zend_throw_exception_ex (reflection_exception_ptr , 0 ,
2280
2282
"Function %s() does not exist" , Z_STRVAL_P (reference ));
2281
2283
return ;
2282
2284
}
2283
- efree ( lcname ) ;
2285
+ ce = fptr -> common . scope ;
2284
2286
}
2285
- ce = fptr -> common .scope ;
2286
2287
break ;
2287
2288
2288
2289
case IS_ARRAY : {
2289
2290
zval * classref ;
2290
2291
zval * method ;
2291
- size_t lcname_len ;
2292
- char * lcname ;
2292
+ zend_string * lcname ;
2293
2293
2294
- if (((classref = zend_hash_index_find (Z_ARRVAL_P (reference ), 0 )) == NULL )
2294
+ if (((classref = zend_hash_index_find (Z_ARRVAL_P (reference ), 0 )) == NULL )
2295
2295
|| ((method = zend_hash_index_find (Z_ARRVAL_P (reference ), 1 )) == NULL ))
2296
2296
{
2297
2297
_DO_THROW ("Expected array($object, $method) or array($classname, $method)" );
@@ -2310,22 +2310,19 @@ ZEND_METHOD(reflection_parameter, __construct)
2310
2310
}
2311
2311
2312
2312
convert_to_string_ex (method );
2313
- lcname_len = Z_STRLEN_P (method );
2314
- lcname = zend_str_tolower_dup (Z_STRVAL_P (method ), lcname_len );
2315
- if (ce == zend_ce_closure && Z_TYPE_P (classref ) == IS_OBJECT
2316
- && (lcname_len == sizeof (ZEND_INVOKE_FUNC_NAME )- 1 )
2317
- && memcmp (lcname , ZEND_INVOKE_FUNC_NAME , sizeof (ZEND_INVOKE_FUNC_NAME )- 1 ) == 0
2313
+ lcname = zend_string_tolower (Z_STR_P (method ));
2314
+ if (Z_TYPE_P (classref ) == IS_OBJECT && is_closure_invoke (ce , lcname )
2318
2315
&& (fptr = zend_get_closure_invoke_method (Z_OBJ_P (classref ))) != NULL )
2319
2316
{
2320
2317
/* nothing to do. don't set is_closure since is the invoke handler,
2321
2318
not the closure itself */
2322
- } else if ((fptr = zend_hash_str_find_ptr (& ce -> function_table , lcname , lcname_len )) == NULL ) {
2323
- efree (lcname );
2319
+ } else if ((fptr = zend_hash_find_ptr (& ce -> function_table , lcname )) == NULL ) {
2320
+ zend_string_release (lcname );
2324
2321
zend_throw_exception_ex (reflection_exception_ptr , 0 ,
2325
2322
"Method %s::%s() does not exist" , ZSTR_VAL (ce -> name ), Z_STRVAL_P (method ));
2326
2323
return ;
2327
2324
}
2328
- efree (lcname );
2325
+ zend_string_release (lcname );
2329
2326
}
2330
2327
break ;
2331
2328
@@ -2336,7 +2333,7 @@ ZEND_METHOD(reflection_parameter, __construct)
2336
2333
fptr = (zend_function * )zend_get_closure_method_def (reference );
2337
2334
Z_ADDREF_P (reference );
2338
2335
is_closure = 1 ;
2339
- } else if ((fptr = zend_hash_str_find_ptr (& ce -> function_table , ZEND_INVOKE_FUNC_NAME , sizeof ( ZEND_INVOKE_FUNC_NAME ))) == NULL ) {
2336
+ } else if ((fptr = zend_hash_find_ptr (& ce -> function_table , ZSTR_KNOWN ( ZEND_STR_MAGIC_INVOKE ))) == NULL ) {
2340
2337
zend_throw_exception_ex (reflection_exception_ptr , 0 ,
2341
2338
"Method %s::%s() does not exist" , ZSTR_VAL (ce -> name ), ZEND_INVOKE_FUNC_NAME );
2342
2339
return ;
@@ -4070,24 +4067,16 @@ ZEND_METHOD(reflection_class, hasMethod)
4070
4067
{
4071
4068
reflection_object * intern ;
4072
4069
zend_class_entry * ce ;
4073
- char * name , * lc_name ;
4074
- size_t name_len ;
4070
+ zend_string * name , * lc_name ;
4075
4071
4076
- if (zend_parse_parameters (ZEND_NUM_ARGS (), "s " , & name , & name_len ) == FAILURE ) {
4072
+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "S " , & name ) == FAILURE ) {
4077
4073
return ;
4078
4074
}
4079
4075
4080
4076
GET_REFLECTION_OBJECT_PTR (ce );
4081
- lc_name = zend_str_tolower_dup (name , name_len );
4082
- if ((ce == zend_ce_closure && (name_len == sizeof (ZEND_INVOKE_FUNC_NAME )- 1 )
4083
- && memcmp (lc_name , ZEND_INVOKE_FUNC_NAME , sizeof (ZEND_INVOKE_FUNC_NAME )- 1 ) == 0 )
4084
- || zend_hash_str_exists (& ce -> function_table , lc_name , name_len )) {
4085
- efree (lc_name );
4086
- RETURN_TRUE ;
4087
- } else {
4088
- efree (lc_name );
4089
- RETURN_FALSE ;
4090
- }
4077
+ lc_name = zend_string_tolower (name );
4078
+ RETVAL_BOOL (zend_hash_exists (& ce -> function_table , lc_name ) || is_closure_invoke (ce , lc_name ));
4079
+ zend_string_release (lc_name );
4091
4080
}
4092
4081
/* }}} */
4093
4082
@@ -4099,52 +4088,43 @@ ZEND_METHOD(reflection_class, getMethod)
4099
4088
zend_class_entry * ce ;
4100
4089
zend_function * mptr ;
4101
4090
zval obj_tmp ;
4102
- char * name , * lc_name ;
4103
- size_t name_len ;
4091
+ zend_string * name , * lc_name ;
4104
4092
4105
- if (zend_parse_parameters (ZEND_NUM_ARGS (), "s " , & name , & name_len ) == FAILURE ) {
4093
+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "S " , & name ) == FAILURE ) {
4106
4094
return ;
4107
4095
}
4108
4096
4109
4097
GET_REFLECTION_OBJECT_PTR (ce );
4110
- lc_name = zend_str_tolower_dup (name , name_len );
4111
- if (ce == zend_ce_closure && !Z_ISUNDEF (intern -> obj ) && (name_len == sizeof (ZEND_INVOKE_FUNC_NAME )- 1 )
4112
- && memcmp (lc_name , ZEND_INVOKE_FUNC_NAME , sizeof (ZEND_INVOKE_FUNC_NAME )- 1 ) == 0
4098
+ lc_name = zend_string_tolower (name );
4099
+ if (!Z_ISUNDEF (intern -> obj ) && is_closure_invoke (ce , lc_name )
4113
4100
&& (mptr = zend_get_closure_invoke_method (Z_OBJ (intern -> obj ))) != NULL )
4114
4101
{
4115
4102
/* don't assign closure_object since we only reflect the invoke handler
4116
4103
method and not the closure definition itself */
4117
4104
reflection_method_factory (ce , mptr , NULL , return_value );
4118
- efree (lc_name );
4119
- } else if (ce == zend_ce_closure && Z_ISUNDEF (intern -> obj ) && (name_len == sizeof (ZEND_INVOKE_FUNC_NAME )- 1 )
4120
- && memcmp (lc_name , ZEND_INVOKE_FUNC_NAME , sizeof (ZEND_INVOKE_FUNC_NAME )- 1 ) == 0
4105
+ } else if (Z_ISUNDEF (intern -> obj ) && is_closure_invoke (ce , lc_name )
4121
4106
&& object_init_ex (& obj_tmp , ce ) == SUCCESS && (mptr = zend_get_closure_invoke_method (Z_OBJ (obj_tmp ))) != NULL ) {
4122
4107
/* don't assign closure_object since we only reflect the invoke handler
4123
4108
method and not the closure definition itself */
4124
4109
reflection_method_factory (ce , mptr , NULL , return_value );
4125
4110
zval_ptr_dtor (& obj_tmp );
4126
- efree (lc_name );
4127
- } else if ((mptr = zend_hash_str_find_ptr (& ce -> function_table , lc_name , name_len )) != NULL ) {
4111
+ } else if ((mptr = zend_hash_find_ptr (& ce -> function_table , lc_name )) != NULL ) {
4128
4112
reflection_method_factory (ce , mptr , NULL , return_value );
4129
- efree (lc_name );
4130
4113
} else {
4131
- efree (lc_name );
4132
4114
zend_throw_exception_ex (reflection_exception_ptr , 0 ,
4133
- "Method %s does not exist" , name );
4134
- return ;
4115
+ "Method %s does not exist" , ZSTR_VAL (name ));
4135
4116
}
4117
+ zend_string_release (lc_name );
4136
4118
}
4137
4119
/* }}} */
4138
4120
4139
4121
/* {{{ _addmethod */
4140
4122
static void _addmethod (zend_function * mptr , zend_class_entry * ce , zval * retval , zend_long filter , zval * obj )
4141
4123
{
4142
4124
zval method ;
4143
- size_t len = ZSTR_LEN (mptr -> common .function_name );
4144
4125
zend_function * closure ;
4145
4126
if (mptr -> common .fn_flags & filter ) {
4146
- if (ce == zend_ce_closure && obj && (len == sizeof (ZEND_INVOKE_FUNC_NAME )- 1 )
4147
- && memcmp (ZSTR_VAL (mptr -> common .function_name ), ZEND_INVOKE_FUNC_NAME , sizeof (ZEND_INVOKE_FUNC_NAME )- 1 ) == 0
4127
+ if (obj && is_closure_invoke (ce , mptr -> common .function_name )
4148
4128
&& (closure = zend_get_closure_invoke_method (Z_OBJ_P (obj ))) != NULL )
4149
4129
{
4150
4130
mptr = closure ;
0 commit comments