From: Bob Weinand Date: Sun, 20 Sep 2015 00:43:22 +0000 (+0200) Subject: Short-circuit zend_parse_parameters_none() so that expensive zpp() call never happens... X-Git-Tag: php-7.1.0alpha2~40^2~48^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=95dbe1d03e0b7609af65235928123527c917f6a8;p=php Short-circuit zend_parse_parameters_none() so that expensive zpp() call never happens in non-exceptional case --- diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 8f288a726b..e9a297fd45 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -870,12 +870,11 @@ static int zend_parse_va_args(int num_args, const char *type_spec, va_list *va, max_num_args = -1; } - if (num_args < min_num_args || (num_args > max_num_args && max_num_args > 0)) { + if (num_args < min_num_args || (num_args > max_num_args && max_num_args >= 0)) { if (!(flags & ZEND_PARSE_PARAMS_QUIET)) { zend_function *active_function = EG(current_execute_data)->func; const char *class_name = active_function->common.scope ? ZSTR_VAL(active_function->common.scope->name) : ""; - zend_bool throw_exception = - ZEND_ARG_USES_STRICT_TYPES() || (flags & ZEND_PARSE_PARAMS_THROW); + zend_bool throw_exception = ZEND_ARG_USES_STRICT_TYPES() || (flags & ZEND_PARSE_PARAMS_THROW); zend_internal_type_error(throw_exception, "%s%s%s() expects %s %d parameter%s, %d given", class_name, class_name[0] ? "::" : "", @@ -938,27 +937,11 @@ static int zend_parse_va_args(int num_args, const char *type_spec, va_list *va, } /* }}} */ -#define RETURN_IF_ZERO_ARGS(num_args, type_spec, flags) do { \ - int __num_args = (num_args); \ - if (0 == (type_spec)[0] && 0 != __num_args && !(flags & ZEND_PARSE_PARAMS_QUIET)) { \ - const char *__space; \ - const char * __class_name = get_active_class_name(&__space); \ - zend_bool throw_exception = \ - ZEND_ARG_USES_STRICT_TYPES() || (flags & ZEND_PARSE_PARAMS_THROW); \ - zend_internal_type_error(throw_exception, \ - "%s%s%s() expects exactly 0 parameters, %d given", \ - __class_name, __space, get_active_function_name(), __num_args); \ - return FAILURE; \ - } \ -} while(0) - ZEND_API int zend_parse_parameters_ex(int flags, int num_args, const char *type_spec, ...) /* {{{ */ { va_list va; int retval; - RETURN_IF_ZERO_ARGS(num_args, type_spec, flags); - va_start(va, type_spec); retval = zend_parse_va_args(num_args, type_spec, &va, flags); va_end(va); @@ -973,8 +956,6 @@ ZEND_API int zend_parse_parameters(int num_args, const char *type_spec, ...) /* int retval; int flags = 0; - RETURN_IF_ZERO_ARGS(num_args, type_spec, flags); - va_start(va, type_spec); retval = zend_parse_va_args(num_args, type_spec, &va, flags); va_end(va); @@ -989,8 +970,6 @@ ZEND_API int zend_parse_parameters_throw(int num_args, const char *type_spec, .. int retval; int flags = ZEND_PARSE_PARAMS_THROW; - RETURN_IF_ZERO_ARGS(num_args, type_spec, flags); - va_start(va, type_spec); retval = zend_parse_va_args(num_args, type_spec, &va, flags); va_end(va); @@ -1015,14 +994,11 @@ ZEND_API int zend_parse_method_parameters(int num_args, zval *this_ptr, const ch zend_bool is_method = EG(current_execute_data)->func->common.scope != NULL; if (!is_method || !this_ptr || Z_TYPE_P(this_ptr) != IS_OBJECT) { - RETURN_IF_ZERO_ARGS(num_args, p, flags); - va_start(va, type_spec); retval = zend_parse_va_args(num_args, type_spec, &va, flags); va_end(va); } else { p++; - RETURN_IF_ZERO_ARGS(num_args, p, flags); va_start(va, type_spec); @@ -1051,15 +1027,11 @@ ZEND_API int zend_parse_method_parameters_ex(int flags, int num_args, zval *this zend_class_entry *ce; if (!this_ptr) { - RETURN_IF_ZERO_ARGS(num_args, p, flags); - va_start(va, type_spec); retval = zend_parse_va_args(num_args, type_spec, &va, flags); va_end(va); } else { p++; - RETURN_IF_ZERO_ARGS(num_args, p, flags); - va_start(va, type_spec); object = va_arg(va, zval **); diff --git a/Zend/zend_API.h b/Zend/zend_API.h index e6f4266c85..6f6c391074 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -252,12 +252,12 @@ ZEND_API int _zend_get_parameters_array_ex(int param_count, zval *argument_array /* internal function to efficiently copy parameters when executing __call() */ ZEND_API int zend_copy_parameters_array(int param_count, zval *argument_array); -#define zend_get_parameters_array(ht, param_count, argument_array) \ +#define zend_get_parameters_array(ht, param_count, argument_array) \ _zend_get_parameters_array_ex(param_count, argument_array) -#define zend_get_parameters_array_ex(param_count, argument_array) \ +#define zend_get_parameters_array_ex(param_count, argument_array) \ _zend_get_parameters_array_ex(param_count, argument_array) -#define zend_parse_parameters_none() \ - zend_parse_parameters(ZEND_NUM_ARGS(), "") +#define zend_parse_parameters_none() \ + (EXPECTED(ZEND_NUM_ARGS() == 0) ? SUCCESS : zend_parse_parameters(ZEND_NUM_ARGS(), "")) /* Parameter parsing API -- andrei */