com php-src: Short-circuit zend_parse_parameters_none( ) so that expensive zpp() call never happen s in non-exceptional case: Zend/zend_API.c Zend
/zend_API.h
| From: | Bob Weinand | Date: | Sun, 20 Sep 2015 00:43:22 +0000 |
| Subject: | com php-src: Short-circuit zend_parse_parameters_none( ) so that expensive zpp() call never happen s in non-exceptional case: Zend/zend_API.c Zend /zend_API.h |
||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-89081@lists.php.net to get a copy of this message | ||
Commit: 95dbe1d03e0b7609af65235928123527c917f6a8
Author: Bob Weinand <bobwei9@hotmail.com> Sun, 20 Sep 2015 02:43:22 +0200
Parents: 14af0f6dcb83dd8c33b771c34163357f934ec9b8
Branches: PHP-7.0
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=95dbe1d03e0b7609af65235928123527c917f6a8
Log:
Short-circuit zend_parse_parameters_none() so that expensive zpp() call never happens in
non-exceptional case
Changed paths:
M Zend/zend_API.c
M Zend/zend_API.h
Diff:
diff --git a/Zend/zend_API.c b/Zend/zend_API.c
index 8f288a7..e9a297f 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 e6f4266..6f6c391 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 */