]> granicus.if.org Git - php/commitdiff
extend the parameter parsing API by two functions
authorHarald Radi <phanto@php.net>
Sun, 2 Feb 2003 23:30:14 +0000 (23:30 +0000)
committerHarald Radi <phanto@php.net>
Sun, 2 Feb 2003 23:30:14 +0000 (23:30 +0000)
for parsing method parameters with automatic
detection if the function was called as such or as
a class method (with a valid this ptr).
if called as a function the first parameter has to be
the object it is operating on, if called as a method
this is used.

#not yet testet, only commiting so that georg can
#continue working on ext/mysqli

Zend/zend_API.c
Zend/zend_API.h

index d70915614d6e9c910a5cbce6c9a7d633c7f6e46f..c05e5a05d8e9b075c1a9da5ba48de661366b27f3 100644 (file)
@@ -563,6 +563,91 @@ ZEND_API int zend_parse_parameters(int num_args TSRMLS_DC, char *type_spec, ...)
        return retval;
 }
 
+ZEND_API int zend_parse_method_parameters(int num_args TSRMLS_DC, zval *this_ptr, char *type_spec, zend_class_entry *ce, zval **object, ...)
+{
+       void **arg_stack = EG(argument_stack).top_element;
+       va_list va;
+       int retval;
+
+       *object = this_ptr;
+
+       if (!*object) {
+               zval **parameter;
+
+               if (zend_get_parameters_ex(1, &parameter) != SUCCESS) {
+                       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);
+
+                       return FAILURE;
+               } else {
+                       if (!zend_check_class(*parameter, ce)) {
+                               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;
+                       } else {
+                               *object = *parameter;
+                       }
+
+                       EG(argument_stack).top_element++;
+               }
+       }
+       
+       va_start(va, type_spec);
+       retval = zend_parse_va_args(num_args, type_spec, &va, 0 TSRMLS_CC);
+       va_end(va);
+
+       EG(argument_stack).top_element = arg_stack;
+
+       return retval;
+}
+
+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, ...)
+{
+       void **arg_stack = EG(argument_stack).top_element;
+       va_list va;
+       int retval;
+       int quiet = flags & ZEND_PARSE_PARAMS_QUIET;
+
+       *object = this_ptr;
+
+       if (!*object) {
+               zval **parameter;
+
+               if (zend_get_parameters_ex(1, &parameter) != SUCCESS) {
+                       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);
+                       }
+
+                       return FAILURE;
+               } else {
+                       if (!zend_check_class(*parameter, ce)) {
+                               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;
+                       } else {
+                               *object = *parameter;
+                       }
+
+                       EG(argument_stack).top_element++;
+               }
+       }
+       
+       va_start(va, type_spec);
+       retval = zend_parse_va_args(num_args, type_spec, &va, flags TSRMLS_CC);
+       va_end(va);
+
+       EG(argument_stack).top_element = arg_stack;
+
+       return retval;
+}
+
 /* Argument parsing API -- andrei */
 
 
index ed82a37f383411aa14be64ee52b5fc7a7cb27a84..d870f82cfcdb1e1d6c13fab66a63f7ae446ef124 100644 (file)
@@ -123,6 +123,9 @@ ZEND_API int zend_parse_parameters(int num_args TSRMLS_DC, char *type_spec, ...)
 ZEND_API int zend_parse_parameters_ex(int flags, int num_args TSRMLS_DC, char *type_spec, ...);
 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_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, zend_class_entry *ce, void **object, ...);
+
 /* End of parameter parsing API -- andrei */
 
 int zend_register_functions(zend_class_entry *scope, zend_function_entry *functions, HashTable *function_table, int type TSRMLS_DC);