]> granicus.if.org Git - php/commitdiff
Short-circuit zend_parse_parameters_none() so that expensive zpp() call never happens...
authorBob Weinand <bobwei9@hotmail.com>
Sun, 20 Sep 2015 00:43:22 +0000 (02:43 +0200)
committerBob Weinand <bobwei9@hotmail.com>
Sun, 20 Sep 2015 00:43:22 +0000 (02:43 +0200)
Zend/zend_API.c
Zend/zend_API.h

index 8f288a726b9c87c920b365a3d4db122327d13b2a..e9a297fd45148556e7d415e2a02922afdbec8176 100644 (file)
@@ -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 **);
index e6f4266c85cb1e4dd4c7ecd7407843bcf72690f8..6f6c391074f4a163e38cb73630e36f86140ebb5b 100644 (file)
@@ -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 */