@@ -2976,81 +2976,83 @@ ZEND_METHOD(ReflectionUnionType, getTypes)
2976
2976
/* {{{ Constructor. Throws an Exception in case the given method does not exist */
2977
2977
ZEND_METHOD (ReflectionMethod , __construct )
2978
2978
{
2979
- zval * classname ;
2980
- zval * object , * orig_obj ;
2981
- reflection_object * intern ;
2979
+ zend_object * arg1_obj ;
2980
+ zend_string * arg1_str ;
2981
+ zend_string * arg2_str = NULL ;
2982
+
2983
+ zend_object * orig_obj = NULL ;
2984
+ zend_class_entry * ce = NULL ;
2985
+ zend_string * class_name = NULL ;
2986
+ char * method_name ;
2987
+ size_t method_name_len ;
2982
2988
char * lcname ;
2983
- zend_class_entry * ce ;
2989
+
2990
+ zval * object ;
2991
+ reflection_object * intern ;
2984
2992
zend_function * mptr ;
2985
- char * name_str , * tmp ;
2986
- size_t name_len , tmp_len ;
2987
- zval ztmp ;
2988
2993
2989
- if (zend_parse_parameters_ex (ZEND_PARSE_PARAMS_QUIET , ZEND_NUM_ARGS (), "zs" , & classname , & name_str , & name_len ) == FAILURE ) {
2990
- if (zend_parse_parameters (ZEND_NUM_ARGS (), "s" , & name_str , & name_len ) == FAILURE ) {
2994
+ ZEND_PARSE_PARAMETERS_START (1 , 2 )
2995
+ Z_PARAM_STR_OR_OBJ (arg1_str , arg1_obj )
2996
+ Z_PARAM_OPTIONAL
2997
+ Z_PARAM_STR_OR_NULL (arg2_str )
2998
+ ZEND_PARSE_PARAMETERS_END ();
2999
+
3000
+ if (arg1_obj ) {
3001
+ if (!arg2_str ) {
3002
+ zend_argument_value_error (2 , "cannot be null when argument #1 ($objectOrMethod) is an object" );
2991
3003
RETURN_THROWS ();
2992
3004
}
2993
3005
2994
- if ((tmp = strstr (name_str , "::" )) == NULL ) {
3006
+ orig_obj = arg1_obj ;
3007
+ ce = arg1_obj -> ce ;
3008
+ method_name = ZSTR_VAL (arg2_str );
3009
+ method_name_len = ZSTR_LEN (arg2_str );
3010
+ } else if (arg2_str ) {
3011
+ class_name = zend_string_copy (arg1_str );
3012
+ method_name = ZSTR_VAL (arg2_str );
3013
+ method_name_len = ZSTR_LEN (arg2_str );
3014
+ } else {
3015
+ char * tmp ;
3016
+ size_t tmp_len ;
3017
+ char * name = ZSTR_VAL (arg1_str );
3018
+
3019
+ if ((tmp = strstr (name , "::" )) == NULL ) {
2995
3020
zend_argument_error (reflection_exception_ptr , 1 , "must be a valid method name" );
2996
3021
RETURN_THROWS ();
2997
3022
}
2998
- classname = & ztmp ;
2999
- tmp_len = tmp - name_str ;
3000
- ZVAL_STRINGL (classname , name_str , tmp_len );
3001
- name_len = name_len - (tmp_len + 2 );
3002
- name_str = tmp + 2 ;
3003
- orig_obj = NULL ;
3004
- } else if (Z_TYPE_P (classname ) == IS_OBJECT ) {
3005
- orig_obj = classname ;
3006
- } else {
3007
- orig_obj = NULL ;
3008
- }
3023
+ tmp_len = tmp - name ;
3009
3024
3010
- object = ZEND_THIS ;
3011
- intern = Z_REFLECTION_P (object );
3012
-
3013
- switch (Z_TYPE_P (classname )) {
3014
- case IS_STRING :
3015
- if ((ce = zend_lookup_class (Z_STR_P (classname ))) == NULL ) {
3016
- if (!EG (exception )) {
3017
- zend_throw_exception_ex (reflection_exception_ptr , 0 ,
3018
- "Class \"%s\" does not exist" , Z_STRVAL_P (classname ));
3019
- }
3020
- if (classname == & ztmp ) {
3021
- zval_ptr_dtor_str (& ztmp );
3022
- }
3023
- RETURN_THROWS ();
3024
- }
3025
- break ;
3026
-
3027
- case IS_OBJECT :
3028
- ce = Z_OBJCE_P (classname );
3029
- break ;
3025
+ class_name = zend_string_init (name , tmp_len , 0 );
3026
+ method_name = tmp + 2 ;
3027
+ method_name_len = ZSTR_LEN (arg1_str ) - tmp_len - 2 ;
3028
+ }
3030
3029
3031
- default :
3032
- if (classname == & ztmp ) {
3033
- zval_ptr_dtor_str (& ztmp );
3030
+ if (class_name ) {
3031
+ if ((ce = zend_lookup_class (class_name )) == NULL ) {
3032
+ if (!EG (exception )) {
3033
+ zend_throw_exception_ex (reflection_exception_ptr , 0 , "Class \"%s\" does not exist" , ZSTR_VAL (class_name ));
3034
3034
}
3035
- zend_argument_error ( reflection_exception_ptr , 1 , "must be of type object|string, %s given" , zend_zval_type_name ( classname ) );
3035
+ zend_string_release ( class_name );
3036
3036
RETURN_THROWS ();
3037
- }
3037
+ }
3038
3038
3039
- if (classname == & ztmp ) {
3040
- zval_ptr_dtor_str (& ztmp );
3039
+ zend_string_release (class_name );
3041
3040
}
3042
3041
3043
- lcname = zend_str_tolower_dup (name_str , name_len );
3042
+ object = ZEND_THIS ;
3043
+ intern = Z_REFLECTION_P (object );
3044
+
3045
+ lcname = zend_str_tolower_dup (method_name , method_name_len );
3044
3046
3045
- if (ce == zend_ce_closure && orig_obj && (name_len == sizeof (ZEND_INVOKE_FUNC_NAME )- 1 )
3047
+ if (ce == zend_ce_closure && orig_obj && (method_name_len == sizeof (ZEND_INVOKE_FUNC_NAME )- 1 )
3046
3048
&& memcmp (lcname , ZEND_INVOKE_FUNC_NAME , sizeof (ZEND_INVOKE_FUNC_NAME )- 1 ) == 0
3047
- && (mptr = zend_get_closure_invoke_method (Z_OBJ_P ( orig_obj ) )) != NULL )
3049
+ && (mptr = zend_get_closure_invoke_method (orig_obj )) != NULL )
3048
3050
{
3049
3051
/* do nothing, mptr already set */
3050
- } else if ((mptr = zend_hash_str_find_ptr (& ce -> function_table , lcname , name_len )) == NULL ) {
3052
+ } else if ((mptr = zend_hash_str_find_ptr (& ce -> function_table , lcname , method_name_len )) == NULL ) {
3051
3053
efree (lcname );
3052
3054
zend_throw_exception_ex (reflection_exception_ptr , 0 ,
3053
- "Method %s::%s() does not exist" , ZSTR_VAL (ce -> name ), name_str );
3055
+ "Method %s::%s() does not exist" , ZSTR_VAL (ce -> name ), method_name );
3054
3056
RETURN_THROWS ();
3055
3057
}
3056
3058
efree (lcname );
0 commit comments