From: Marcus Boerger Date: Tue, 2 Mar 2004 16:17:58 +0000 (+0000) Subject: Fix zend_parse_method_parameters_ex() and make it consistant with X-Git-Tag: RELEASE_0_2_0~78 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8d45fece4209741d865c7b3e9a3e7e70da3f81bd;p=php Fix zend_parse_method_parameters_ex() and make it consistant with zend_parse_method_parameters(). # Obviously its only place of use is in pdo just right now. --- diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 7e0f6f840d..1cf81d06b6 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -603,52 +603,41 @@ ZEND_API int zend_parse_method_parameters(int num_args TSRMLS_DC, zval *this_ptr } -ZEND_API int zend_parse_method_parameters_ex(int flags, int num_args TSRMLS_DC, zval *this_ptr, char *type_spec, zend_class_entry *ce, void **object, ...) +ZEND_API int zend_parse_method_parameters_ex(int flags, int num_args TSRMLS_DC, zval *this_ptr, char *type_spec, ...) { - void **arg_stack = EG(argument_stack).top_element; va_list va; int retval; + char *p = type_spec; + zval **object; + zend_class_entry *ce; int quiet = flags & ZEND_PARSE_PARAMS_QUIET; - *object = this_ptr; - - if (!*object) { - zval **parameter; + if (!this_ptr) { + va_start(va, type_spec); + retval = zend_parse_va_args(num_args, type_spec, &va, 0 TSRMLS_CC); + va_end(va); + } else { + p++; + va_start(va, type_spec); - if (zend_get_parameters_ex(1, ¶meter) != SUCCESS) { + object = va_arg(va, zval **); + ce = va_arg(va, zend_class_entry *); + *object = this_ptr; + if (ce && !instanceof_function(Z_OBJCE_P(this_ptr), ce TSRMLS_CC)) { if (!quiet) { - zend_error(E_WARNING, "%s() expects an object of class %s as first parameter, none was given", - get_active_function_name(TSRMLS_C), ce->name); + zend_error(E_CORE_ERROR, "%s::%s() must be derived from %s::%s", + ce->name, get_active_function_name(TSRMLS_C), Z_OBJCE_P(this_ptr)->name, get_active_function_name(TSRMLS_C)); } - return FAILURE; - } else { - if (Z_TYPE_PP(parameter) == IS_OBJECT && - instanceof_function(Z_OBJCE_PP(parameter), ce TSRMLS_CC)) { - *object = *parameter; - } else { - if (!quiet) { - zend_error(E_WARNING, "%s() expects parameter 1 to be %s, %s given", - get_active_function_name(TSRMLS_C), ce->name, - zend_zval_type_name(*parameter)); - } - - return FAILURE; - } - - EG(argument_stack).top_element++; } - } - - va_start(va, object); - retval = zend_parse_va_args(num_args, type_spec, &va, flags TSRMLS_CC); - va_end(va); - - EG(argument_stack).top_element = arg_stack; + retval = zend_parse_va_args(num_args, p, &va, flags TSRMLS_CC); + va_end(va); + } return retval; } + /* Argument parsing API -- andrei */ diff --git a/Zend/zend_API.h b/Zend/zend_API.h index d3b0c76f2b..9a1e85095a 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -159,7 +159,7 @@ ZEND_API int zend_parse_parameters_ex(int flags, int num_args TSRMLS_DC, char *t ZEND_API char *zend_zval_type_name(zval *arg); ZEND_API int zend_parse_method_parameters(int num_args TSRMLS_DC, zval *this_ptr, char *type_spec, ...); -ZEND_API int zend_parse_method_parameters_ex(int flags, int num_args TSRMLS_DC, zval *this_ptr, char *type_spec, zend_class_entry *ce, void **object, ...); +ZEND_API int zend_parse_method_parameters_ex(int flags, int num_args TSRMLS_DC, zval *this_ptr, char *type_spec, ...); /* End of parameter parsing API -- andrei */