@@ -2007,61 +2007,63 @@ ZEND_API zend_module_entry* zend_register_internal_module(zend_module_entry *mod
2007
2007
}
2008
2008
/* }}} */
2009
2009
2010
+ static void zend_check_magic_method_args (
2011
+ uint32_t num_args , const char * name ,
2012
+ const zend_class_entry * ce , const zend_function * fptr , int error_type )
2013
+ {
2014
+ if (fptr -> common .num_args != num_args ) {
2015
+ if (num_args == 0 ) {
2016
+ zend_error (error_type , "Method %s::%s() cannot take arguments" ,
2017
+ ZSTR_VAL (ce -> name ), name );
2018
+ } else if (num_args == 1 ) {
2019
+ zend_error (error_type , "Method %s::%s() must take exactly 1 argument" ,
2020
+ ZSTR_VAL (ce -> name ), name );
2021
+ } else {
2022
+ zend_error (error_type , "Method %s::%s() must take exactly %" PRIu32 " arguments" ,
2023
+ ZSTR_VAL (ce -> name ), name , num_args );
2024
+ }
2025
+ return ;
2026
+ }
2027
+ for (uint32_t i = 0 ; i < num_args ; i ++ ) {
2028
+ if (QUICK_ARG_SHOULD_BE_SENT_BY_REF (fptr , i + 1 )) {
2029
+ zend_error (error_type , "Method %s::%s() cannot take arguments by reference" ,
2030
+ ZSTR_VAL (ce -> name ), name );
2031
+ return ;
2032
+ }
2033
+ }
2034
+ }
2035
+
2010
2036
ZEND_API void zend_check_magic_method_implementation (const zend_class_entry * ce , const zend_function * fptr , zend_string * lcname , int error_type ) /* {{{ */
2011
2037
{
2012
2038
if (ZSTR_VAL (fptr -> common .function_name )[0 ] != '_'
2013
2039
|| ZSTR_VAL (fptr -> common .function_name )[1 ] != '_' ) {
2014
2040
return ;
2015
2041
}
2016
2042
2017
- if (zend_string_equals_literal (lcname , ZEND_DESTRUCTOR_FUNC_NAME ) && fptr -> common . num_args != 0 ) {
2018
- zend_error ( error_type , "Destructor %s::%s() cannot take arguments " , ZSTR_VAL ( ce -> name ), ZEND_DESTRUCTOR_FUNC_NAME );
2019
- } else if (zend_string_equals_literal (lcname , ZEND_CLONE_FUNC_NAME ) && fptr -> common . num_args != 0 ) {
2020
- zend_error ( error_type , "Method %s::%s() cannot accept any arguments " , ZSTR_VAL ( ce -> name ), ZEND_CLONE_FUNC_NAME );
2043
+ if (zend_string_equals_literal (lcname , ZEND_DESTRUCTOR_FUNC_NAME )) {
2044
+ zend_check_magic_method_args ( 0 , "__destruct " , ce , fptr , error_type );
2045
+ } else if (zend_string_equals_literal (lcname , ZEND_CLONE_FUNC_NAME )) {
2046
+ zend_check_magic_method_args ( 0 , "__clone " , ce , fptr , error_type );
2021
2047
} else if (zend_string_equals_literal (lcname , ZEND_GET_FUNC_NAME )) {
2022
- if (fptr -> common .num_args != 1 ) {
2023
- zend_error (error_type , "Method %s::%s() must take exactly 1 argument" , ZSTR_VAL (ce -> name ), ZEND_GET_FUNC_NAME );
2024
- } else if (QUICK_ARG_SHOULD_BE_SENT_BY_REF (fptr , 1 )) {
2025
- zend_error (error_type , "Method %s::%s() cannot take arguments by reference" , ZSTR_VAL (ce -> name ), ZEND_GET_FUNC_NAME );
2026
- }
2048
+ zend_check_magic_method_args (1 , "__get" , ce , fptr , error_type );
2027
2049
} else if (zend_string_equals_literal (lcname , ZEND_SET_FUNC_NAME )) {
2028
- if (fptr -> common .num_args != 2 ) {
2029
- zend_error (error_type , "Method %s::%s() must take exactly 2 arguments" , ZSTR_VAL (ce -> name ), ZEND_SET_FUNC_NAME );
2030
- } else if (QUICK_ARG_SHOULD_BE_SENT_BY_REF (fptr , 1 ) || QUICK_ARG_SHOULD_BE_SENT_BY_REF (fptr , 2 )) {
2031
- zend_error (error_type , "Method %s::%s() cannot take arguments by reference" , ZSTR_VAL (ce -> name ), ZEND_SET_FUNC_NAME );
2032
- }
2050
+ zend_check_magic_method_args (2 , "__set" , ce , fptr , error_type );
2033
2051
} else if (zend_string_equals_literal (lcname , ZEND_UNSET_FUNC_NAME )) {
2034
- if (fptr -> common .num_args != 1 ) {
2035
- zend_error (error_type , "Method %s::%s() must take exactly 1 argument" , ZSTR_VAL (ce -> name ), ZEND_UNSET_FUNC_NAME );
2036
- } else if (QUICK_ARG_SHOULD_BE_SENT_BY_REF (fptr , 1 )) {
2037
- zend_error (error_type , "Method %s::%s() cannot take arguments by reference" , ZSTR_VAL (ce -> name ), ZEND_UNSET_FUNC_NAME );
2038
- }
2052
+ zend_check_magic_method_args (1 , "__unset" , ce , fptr , error_type );
2039
2053
} else if (zend_string_equals_literal (lcname , ZEND_ISSET_FUNC_NAME )) {
2040
- if (fptr -> common .num_args != 1 ) {
2041
- zend_error (error_type , "Method %s::%s() must take exactly 1 argument" , ZSTR_VAL (ce -> name ), ZEND_ISSET_FUNC_NAME );
2042
- } else if (QUICK_ARG_SHOULD_BE_SENT_BY_REF (fptr , 1 )) {
2043
- zend_error (error_type , "Method %s::%s() cannot take arguments by reference" , ZSTR_VAL (ce -> name ), ZEND_ISSET_FUNC_NAME );
2044
- }
2054
+ zend_check_magic_method_args (1 , "__isset" , ce , fptr , error_type );
2045
2055
} else if (zend_string_equals_literal (lcname , ZEND_CALL_FUNC_NAME )) {
2046
- if (fptr -> common .num_args != 2 ) {
2047
- zend_error (error_type , "Method %s::%s() must take exactly 2 arguments" , ZSTR_VAL (ce -> name ), ZEND_CALL_FUNC_NAME );
2048
- } else if (QUICK_ARG_SHOULD_BE_SENT_BY_REF (fptr , 1 ) || QUICK_ARG_SHOULD_BE_SENT_BY_REF (fptr , 2 )) {
2049
- zend_error (error_type , "Method %s::%s() cannot take arguments by reference" , ZSTR_VAL (ce -> name ), ZEND_CALL_FUNC_NAME );
2050
- }
2056
+ zend_check_magic_method_args (2 , "__call" , ce , fptr , error_type );
2051
2057
} else if (zend_string_equals_literal (lcname , ZEND_CALLSTATIC_FUNC_NAME )) {
2052
- if (fptr -> common .num_args != 2 ) {
2053
- zend_error (error_type , "Method %s::__callStatic() must take exactly 2 arguments" , ZSTR_VAL (ce -> name ));
2054
- } else if (QUICK_ARG_SHOULD_BE_SENT_BY_REF (fptr , 1 ) || QUICK_ARG_SHOULD_BE_SENT_BY_REF (fptr , 2 )) {
2055
- zend_error (error_type , "Method %s::__callStatic() cannot take arguments by reference" , ZSTR_VAL (ce -> name ));
2056
- }
2057
- } else if (zend_string_equals_literal (lcname , ZEND_TOSTRING_FUNC_NAME ) && fptr -> common .num_args != 0 ) {
2058
- zend_error (error_type , "Method %s::__toString() cannot take arguments" , ZSTR_VAL (ce -> name ));
2059
- } else if (zend_string_equals_literal (lcname , ZEND_DEBUGINFO_FUNC_NAME ) && fptr -> common .num_args != 0 ) {
2060
- zend_error (error_type , "Method %s::__debugInfo() cannot take arguments" , ZSTR_VAL (ce -> name ));
2061
- } else if (zend_string_equals_literal (lcname , "__serialize" ) && fptr -> common .num_args != 0 ) {
2062
- zend_error (error_type , "Method %s::__serialize() cannot take arguments" , ZSTR_VAL (ce -> name ));
2063
- } else if (zend_string_equals_literal (lcname , "__unserialize" ) && fptr -> common .num_args != 1 ) {
2064
- zend_error (error_type , "Method %s::__unserialize() must take exactly 1 argument" , ZSTR_VAL (ce -> name ));
2058
+ zend_check_magic_method_args (2 , "__callStatic" , ce , fptr , error_type );
2059
+ } else if (zend_string_equals_literal (lcname , ZEND_TOSTRING_FUNC_NAME )) {
2060
+ zend_check_magic_method_args (0 , "__toString" , ce , fptr , error_type );
2061
+ } else if (zend_string_equals_literal (lcname , ZEND_DEBUGINFO_FUNC_NAME )) {
2062
+ zend_check_magic_method_args (0 , "__debugInfo" , ce , fptr , error_type );
2063
+ } else if (zend_string_equals_literal (lcname , "__serialize" )) {
2064
+ zend_check_magic_method_args (0 , "__serialize" , ce , fptr , error_type );
2065
+ } else if (zend_string_equals_literal (lcname , "__unserialize" )) {
2066
+ zend_check_magic_method_args (1 , "__unserialize" , ce , fptr , error_type );
2065
2067
}
2066
2068
}
2067
2069
/* }}} */
0 commit comments