summaryrefslogtreecommitdiff
path: root/Zend/zend_API.c
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2004-03-02 16:17:58 +0000
committerMarcus Boerger <helly@php.net>2004-03-02 16:17:58 +0000
commit8d45fece4209741d865c7b3e9a3e7e70da3f81bd (patch)
tree4b58466b781aa80f921379e2de4501596121c6b5 /Zend/zend_API.c
parent17790a036960d8b92e4acac430052a15bcffa51e (diff)
downloadphp-git-8d45fece4209741d865c7b3e9a3e7e70da3f81bd.tar.gz
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.
Diffstat (limited to 'Zend/zend_API.c')
-rw-r--r--Zend/zend_API.c53
1 files changed, 21 insertions, 32 deletions
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, &parameter) != 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 */