]> granicus.if.org Git - php/commitdiff
Switch to use zend_call_function() what shortens spl code
authorMarcus Boerger <helly@php.net>
Thu, 7 Aug 2003 22:19:50 +0000 (22:19 +0000)
committerMarcus Boerger <helly@php.net>
Thu, 7 Aug 2003 22:19:50 +0000 (22:19 +0000)
ext/spl/spl_array.c
ext/spl/spl_engine.c
ext/spl/spl_engine.h

index 57a38bc21464bed68749a791d377fee41bf5b34e..a51dc734e95ac05d68f7d4bc39ab6f601584ace8 100755 (executable)
@@ -66,7 +66,7 @@ int spl_fetch_dimension_address(znode *result, znode *op1, znode *op2, temp_vari
                zval *dim = spl_get_zval_ptr(op2, Ts, &EG(free_op2) TSRMLS_CC);
                zval *exists;
 
-               spl_begin_method_call_arg_ex1(obj, obj_ce, NULL, "exists", sizeof("exists")-1, &exists, dim TSRMLS_CC);
+               spl_begin_method_call_arg_ex1(obj, obj_ce, NULL, "exists", sizeof("exists")-1, &exists, dim);
                if (!i_zend_is_true(exists)) {
                        if (type == BP_VAR_R || type == BP_VAR_RW) {
                                SEPARATE_ZVAL(&dim);
@@ -85,7 +85,7 @@ int spl_fetch_dimension_address(znode *result, znode *op1, znode *op2, temp_vari
                }
                DELETE_RET_ZVAL(exists);
                if (type == BP_VAR_R || type == BP_VAR_IS) {
-                       spl_begin_method_call_arg_ex1(obj, obj_ce, NULL, "get", sizeof("get")-1, retval, dim TSRMLS_CC);
+                       spl_begin_method_call_arg_ex1(obj, obj_ce, NULL, "get", sizeof("get")-1, retval, dim);
                }
                FREE_OP(Ts, op2, EG(free_op2));
                return 0;
@@ -210,7 +210,7 @@ ZEND_EXECUTE_HOOK_FUNCTION(ZEND_ASSIGN_DIM)
                        value->refcount = 0;
                }
 
-               spl_begin_method_call_arg_ex2(obj, obj_ce, NULL, "set", sizeof("set")-1, &retval, index, value TSRMLS_CC);
+               spl_begin_method_call_arg_ex2(obj, obj_ce, NULL, "set", sizeof("set")-1, &retval, index, value);
 
                if (index == &tmp) {
                        zval_dtor(index);
@@ -284,7 +284,7 @@ ZEND_EXECUTE_HOOK_FUNCTION(ZEND_UNSET_DIM_OBJ)
                                break;
                }
 
-               spl_begin_method_call_arg_ex1(obj, obj_ce, NULL, "del", sizeof("del")-1, &retval, index TSRMLS_CC);
+               spl_begin_method_call_arg_ex1(obj, obj_ce, NULL, "del", sizeof("del")-1, &retval, index);
 
                if (index == &tmp) {
                        zval_dtor(index);
index 17394f854d8cad4ece5dd36d558d39ef8effbdb3..c19f0614218b9af036c3e05b578847ccd4dcc415 100755 (executable)
@@ -41,7 +41,7 @@ void spl_instanciate(zend_class_entry *pce, zval **object TSRMLS_DC)
 /* }}} */
 
 /* {{{ spl_instanciate_arg_ex2 */
-int spl_instanciate_arg_ex2(zend_class_entry *pce, zval **retval, zval *arg1, zval *arg2, HashTable *symbol_table TSRMLS_DC)
+int spl_instanciate_arg_ex2(zend_class_entry *pce, zval **retval, zval *arg1, zval *arg2 TSRMLS_DC)
 {
        zval *object;
        
@@ -49,7 +49,7 @@ int spl_instanciate_arg_ex2(zend_class_entry *pce, zval **retval, zval *arg1, zv
        
        retval = &EG(uninitialized_zval_ptr);
        
-       spl_call_method(&object, pce, &pce->constructor, pce->constructor->common.function_name, strlen(pce->constructor->common.function_name), retval, NULL TSRMLS_CC, 2, arg1, arg2);
+       spl_call_method(&object, pce, &pce->constructor, pce->constructor->common.function_name, strlen(pce->constructor->common.function_name), retval, 2, arg1, arg2 TSRMLS_CC);
        *retval = object;
        return 0;
 }
@@ -170,160 +170,53 @@ spl_is_a spl_implements(zend_class_entry *ce)
 }
 /* }}} */
 
-#undef EX
-#define EX(element) execute_data.element
-
 /* {{{ spl_call_method */
-int spl_call_method(zval **object_pp, zend_class_entry *obj_ce, zend_function **fn_proxy, char *function_name, int fname_len, zval **retval, HashTable *symbol_table TSRMLS_DC, int param_count, ...)
+int spl_call_method(zval **object_pp, zend_class_entry *obj_ce, zend_function **fn_proxy, char *function_name, int function_name_len, zval **retval_ptr, int param_count, zval* arg1, zval* arg2 TSRMLS_DC)
 {
-       int i;
-       zval *arg;
-       zval *param;
-       zval **original_return_value;
-       HashTable *calling_symbol_table;
-       zend_function_state *original_function_state_ptr;
-       zend_op_array *original_op_array;
-       zend_op **original_opline_ptr;
-       zval *orig_free_op1, *orig_free_op2;
-       int (*orig_unary_op)(zval *result, zval *op1);
-       int (*orig_binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC);
-       zend_class_entry *current_scope;
-       zval *current_this;
-       zend_execute_data execute_data;
-       va_list args;
-
-       if (!object_pp || (!obj_ce && (obj_ce = spl_get_class_entry(*object_pp TSRMLS_CC)) == NULL)) {
-               return FAILURE;
-       }
-
-       /* Initialize execute_data */
-       EX(fbc) = NULL;
-       EX(Ts) = NULL;
-       EX(op_array) = NULL;
-       EX(opline) = NULL;
-
-       EX(object) = *object_pp;
-
-       original_function_state_ptr = EG(function_state_ptr);
-       if (fn_proxy && *fn_proxy) {
-               EX(function_state).function = *fn_proxy;
-       } else {
-               if (zend_hash_find(&obj_ce->function_table, function_name, fname_len+1, (void **) &EX(function_state).function)==FAILURE) {
-                       return FAILURE;
-               }
-               if (fn_proxy) {
-                       *fn_proxy = EX(function_state).function;
-               }
-       }
-
-       va_start(args, param_count);
-       if (param_count) {
-               for (i=1; i<=param_count; i++) {
-                       arg = va_arg(args, zval*);
+       int result;
+       zend_fcall_info fci;
+       zval z_fname;
+
+       zval **params[2];
+
+       params[0] = &arg1;
+       params[1] = &arg2;
+
+       fci.size = sizeof(fci);
+       /*fci.function_table = NULL; will be read form zend_class_entry of object if needed */
+       fci.object_pp = object_pp;
+       fci.function_name = &z_fname;
+       fci.retval_ptr_ptr = retval_ptr;
+       fci.param_count = param_count;
+       fci.params = params;
+       fci.no_separation = 1;
+       fci.symbol_table = NULL;
        
-                       if (ARG_SHOULD_BE_SENT_BY_REF(EX(function_state).function, i)
-                       && !PZVAL_IS_REF(arg)) {
-                               if (arg->refcount > 1) {
-                                       zval *new_zval;
-       
-                                       ALLOC_ZVAL(new_zval);
-                                       *new_zval = *arg;
-                                       zval_copy_ctor(new_zval);
-                                       new_zval->refcount = 2;
-                                       new_zval->is_ref = 1;
-                                       arg->refcount--;
-                                       param = new_zval;
-                               } else {
-                                       arg->refcount++;
-                                       arg->is_ref = 1;
-                                       param = arg;
-                               }
-                       } else if (arg != &EG(uninitialized_zval)) {
-                               arg->refcount++;
-                               param = arg;
-                       } else {
-                               ALLOC_ZVAL(param);
-                               *param = *arg;
-                               INIT_PZVAL(param);
-                       }
-                       zend_ptr_stack_push(&EG(argument_stack), param);
-               }
-       }
-       va_end(args);
-
-       zend_ptr_stack_push(&EG(argument_stack), (void *) (long) param_count);
-       zend_ptr_stack_push(&EG(argument_stack), NULL);
-
-       EG(function_state_ptr) = &EX(function_state);
-
-       current_scope = EG(scope);
-       EG(scope) = obj_ce;
-
-       current_this = EG(This);
-       EG(This) = *object_pp;
-
-       if (!PZVAL_IS_REF(EG(This))) {
-               EG(This)->refcount++; /* For $this pointer */
+       if (!fn_proxy && !obj_ce) {
+               ZVAL_STRINGL(&z_fname, function_name, function_name_len, 0);
+               result = zend_call_function(&fci, NULL TSRMLS_CC);
        } else {
-               zval *this_ptr;
-
-               ALLOC_ZVAL(this_ptr);
-               *this_ptr = *EG(This);
-               INIT_PZVAL(this_ptr);
-               zval_copy_ctor(this_ptr);
-               EG(This) = this_ptr;
-       }
-
-       EX(prev_execute_data) = EG(current_execute_data);
-       EG(current_execute_data) = &execute_data;
-
-       if (EX(function_state).function->type == ZEND_USER_FUNCTION) {
-               calling_symbol_table = EG(active_symbol_table);
-               if (symbol_table) {
-                       EG(active_symbol_table) = symbol_table;
+               zend_fcall_info_cache fcic;
+               
+               if (fn_proxy && !*fn_proxy) {
+                       fcic.initialized = 0;
+                       ZVAL_STRINGL(&z_fname, function_name, function_name_len, 0);
+                       result = zend_call_function(&fci, &fcic TSRMLS_CC);
+                       *fn_proxy = fcic.function_handler;
                } else {
-                       ALLOC_HASHTABLE(EG(active_symbol_table));
-                       zend_hash_init(EG(active_symbol_table), 0, NULL, ZVAL_PTR_DTOR, 0);
-               }
-
-               original_return_value = EG(return_value_ptr_ptr);
-               original_op_array = EG(active_op_array);
-               EG(return_value_ptr_ptr) = retval;
-               EG(active_op_array) = (zend_op_array *) EX(function_state).function;
-               original_opline_ptr = EG(opline_ptr);
-               orig_free_op1 = EG(free_op1);
-               orig_free_op2 = EG(free_op2);
-               orig_unary_op = EG(unary_op);
-               orig_binary_op = EG(binary_op);
-               zend_execute(EG(active_op_array) TSRMLS_CC);
-               if (!symbol_table) {
-                       zend_hash_destroy(EG(active_symbol_table));
-                       FREE_HASHTABLE(EG(active_symbol_table));
+                       fcic.initialized = 1;
+                       if (!fn_proxy) {
+                               /* this doesn't handle 'function not found' error! */
+                               zend_hash_find(&obj_ce->function_table, function_name, function_name_len+1, (void **) &fcic.function_handler);
+                       } else {
+                               fcic.function_handler = *fn_proxy;
+                       }
+                       fcic.calling_scope = obj_ce;
+                       fcic.object_pp = object_pp;
+                       result = zend_call_function(&fci, &fcic TSRMLS_CC);
                }
-               EG(active_symbol_table) = calling_symbol_table;
-               EG(active_op_array) = original_op_array;
-               EG(return_value_ptr_ptr)=original_return_value;
-               EG(opline_ptr) = original_opline_ptr;
-               EG(free_op1) = orig_free_op1;
-               EG(free_op2) = orig_free_op2;
-               EG(unary_op) = orig_unary_op;
-               EG(binary_op) = orig_binary_op;
-       } else {
-               ALLOC_INIT_ZVAL(*retval);
-               ((zend_internal_function *) EX(function_state).function)->handler(param_count, *retval, *object_pp, 1 TSRMLS_CC);
-               INIT_PZVAL(*retval);
-       }
-       zend_ptr_stack_clear_multiple(TSRMLS_C);
-       EG(function_state_ptr) = original_function_state_ptr;
-
-       if (EG(This)) {
-               zval_ptr_dtor(&EG(This));
        }
-       EG(scope) = current_scope;
-       EG(This) = current_this;
-       EG(current_execute_data) = EX(prev_execute_data);                       \
-
-       return SUCCESS;
+       return result;
 }
 /* }}} */
 
index f3a16472e5e6aa8c2fa7c3a6342d74d688afb485..52a278e3a5498e5d095a42f5167554890741ac12 100755 (executable)
@@ -36,7 +36,7 @@
 
 int zend_do_fcall_common_helper(ZEND_OPCODE_HANDLER_ARGS);
 
-int spl_call_method(zval **object_pp, zend_class_entry *obj_ce, zend_function **fn_proxy, char *function_name, int function_name_len, zval **retval_ptr, HashTable *symbol_table TSRMLS_DC, int param_count, ...);
+int spl_call_method(zval **object_pp, zend_class_entry *obj_ce, zend_function **fn_proxy, char *function_name, int function_name_len, zval **retval_ptr, int param_count, zval* arg1, zval* arg2 TSRMLS_DC);
 
 /* {{{ zend_class_entry */
 static inline zend_class_entry *spl_get_class_entry(zval *obj TSRMLS_DC)
@@ -53,7 +53,7 @@ static inline zend_class_entry *spl_get_class_entry(zval *obj TSRMLS_DC)
 static inline int spl_begin_method_call_arg(zval **obj, zend_class_entry *obj_ce, zend_function **fn_proxy, char *function_name, int fname_len, zval *retval, zval *arg1 TSRMLS_DC)
 {
        zval *local_retval;
-       int ret = spl_call_method(obj, obj_ce, fn_proxy, function_name, fname_len, &local_retval, NULL TSRMLS_CC, 1, arg1);
+       int ret = spl_call_method(obj, obj_ce, fn_proxy, function_name, fname_len, &local_retval, 1, arg1, NULL TSRMLS_CC);
        if (local_retval) {
                COPY_PZVAL_TO_ZVAL(*retval, local_retval);
        } else {
@@ -67,7 +67,7 @@ static inline int spl_begin_method_call_arg(zval **obj, zend_class_entry *obj_ce
 static inline int spl_begin_method_call_no_retval(zval **obj, zend_class_entry *obj_ce, zend_function **fn_proxy, char *function_name, int fname_len TSRMLS_DC)
 {
        zval *retval;
-       int ret = spl_call_method(obj, obj_ce, fn_proxy, function_name, fname_len, &retval, NULL TSRMLS_CC, 0);
+       int ret = spl_call_method(obj, obj_ce, fn_proxy, function_name, fname_len, &retval, 0, NULL, NULL TSRMLS_CC);
        if (retval) {
                zval_dtor(retval);
                FREE_ZVAL(retval);
@@ -77,16 +77,16 @@ static inline int spl_begin_method_call_no_retval(zval **obj, zend_class_entry *
 /* }}} */
 
 #define spl_begin_method_call_ex(obj, obj_ce, fn_proxy, function_name, fname_len, retval) \
-       spl_call_method(obj, obj_ce, fn_proxy, function_name, fname_len, retval, NULL TSRMLS_CC, 0)
+       spl_call_method(obj, obj_ce, fn_proxy, function_name, fname_len, retval, 0, NULL, NULL TSRMLS_CC)
 
 #define spl_begin_method_call_arg_ex1(obj, obj_ce, fn_proxy, function_name, fname_len, retval, arg1) \
-       spl_call_method(obj, obj_ce, fn_proxy, function_name, fname_len, retval, NULL TSRMLS_CC, 1, arg1)
+       spl_call_method(obj, obj_ce, fn_proxy, function_name, fname_len, retval, 1, arg1, NULL TSRMLS_CC)
 
 #define spl_begin_method_call_arg_ex2(obj, obj_ce, fn_proxy, function_name, fname_len, retval, arg1, arg2) \
-       spl_call_method(obj, obj_ce, fn_proxy, function_name, fname_len, retval, NULL TSRMLS_CC, 2, arg1, arg2)
+       spl_call_method(obj, obj_ce, fn_proxy, function_name, fname_len, retval, 2, arg1, arg2 TSRMLS_CC)
 
 void spl_instanciate(zend_class_entry *pce, zval **object TSRMLS_DC);
-int spl_instanciate_arg_ex2(zend_class_entry *pce, zval **retval, zval *arg1, zval *arg2, HashTable *symbol_table TSRMLS_DC);
+int spl_instanciate_arg_ex2(zend_class_entry *pce, zval **retval, zval *arg1, zval *arg2 TSRMLS_DC);
 
 zval ** spl_get_zval_ptr_ptr(znode *node, temp_variable *Ts TSRMLS_DC);
 void spl_unlock_zval_ptr_ptr(znode *node, temp_variable *Ts TSRMLS_DC);