From f95edc016b090bfe6494d5cffdd37315b7bb9d7c Mon Sep 17 00:00:00 2001 From: Zeev Suraski Date: Fri, 6 Aug 1999 15:24:10 +0000 Subject: Introduce call_user_func_ex() --- Zend/zend_API.h | 1 + Zend/zend_execute_API.c | 49 ++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 45 insertions(+), 5 deletions(-) (limited to 'Zend') diff --git a/Zend/zend_API.h b/Zend/zend_API.h index c8ba5e6715..2c0c69e831 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -112,6 +112,7 @@ ZEND_API int add_get_index_string(zval *arg, uint idx, char *str, void **dest, i ZEND_API int add_get_index_stringl(zval *arg, uint idx, char *str, uint length, void **dest, int duplicate); ZEND_API int call_user_function(HashTable *function_table, zval *object, zval *function_name, zval *retval, int param_count, zval *params[]); +ZEND_API int call_user_function_ex(HashTable *function_table, zval *object, zval *function_name, zval *retval, int param_count, zval **params[], int no_separation); ZEND_API int add_property_long(zval *arg, char *key, long l); diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 586249a345..267f566eb8 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -288,7 +288,23 @@ ZEND_API void zval_update_constant(zval *p) } } + int call_user_function(HashTable *function_table, zval *object, zval *function_name, zval *retval, int param_count, zval *params[]) +{ + zval ***params_array = (zval ***) emalloc(sizeof(zval **)*param_count); + int i; + int ex_retval; + + for (i=0; icommon.arg_types + && icommon.arg_types[0] + && function_state.function->common.arg_types[i+1]==BYREF_FORCE + && !PZVAL_IS_REF(*params[i])) { + if ((*params[i])->refcount>1) { + zval *new_zval; + + if (no_separation) { + return FAILURE; + } + new_zval = (zval *) emalloc(sizeof(zval)); + *new_zval = **params[i]; + new_zval->refcount = 1; + new_zval->EA.locks = 0; + (*params[i])->refcount--; + *params[i] = new_zval; + } + (*params[i])->refcount++; + (*params[i])->EA.is_ref = 1; + param = *params[i]; + } else if (*params[i] != &EG(uninitialized_zval)) { + (*params[i])->refcount++; + param = *params[i]; + } else { + param = (zval *) emalloc(sizeof(zval)); + *param = **(params[i]); + INIT_PZVAL(param); + } zend_ptr_stack_push(&EG(argument_stack), param); } -- cgit v1.2.1