]> granicus.if.org Git - php/commitdiff
Optimized function call helper
authorDmitry Stogov <dmitry@php.net>
Mon, 21 Apr 2008 10:15:26 +0000 (10:15 +0000)
committerDmitry Stogov <dmitry@php.net>
Mon, 21 Apr 2008 10:15:26 +0000 (10:15 +0000)
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 25fbf6082aff0f87488d367ebcff516d6e7d52a6..fc9299bb39c8258af068101a98b1e672a5ec45c1 100644 (file)
@@ -2184,10 +2184,9 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY)
        zend_ptr_stack_3_pop(&EG(arg_types_stack), (void*)&EX(called_scope), (void**)&ex_object, (void**)&EX(fbc));
        EX(function_state).arguments = zend_vm_stack_push_args(opline->extended_value TSRMLS_CC);
 
-       EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
-
        if (EX(function_state).function->type == ZEND_INTERNAL_FUNCTION) {
                ALLOC_INIT_ZVAL(EX_T(opline->result.u.var).var.ptr);
+               EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
                EX_T(opline->result.u.var).var.fcall_returned_reference = EX(function_state).function->common.return_reference;
 
                if (EX(function_state).function->common.arg_info) {
@@ -2207,20 +2206,12 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY)
                        zend_execute_internal(EXECUTE_DATA, RETURN_VALUE_USED(opline) TSRMLS_CC);
                }
 
-/*     We shouldn't fix bad extensions here,
-    because it can break proper ones (Bug #34045)
-               if (!EX(function_state).function->common.return_reference) {
-                       Z_UNSET_ISREF_P(EX_T(opline->result.u.var).var.ptr);
-                       Z_SET_REFCOUNT_P(EX_T(opline->result.u.var).var.ptr, 1);
-               }
-*/
                if (!RETURN_VALUE_USED(opline)) {
                        zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
                }
        } else if (EX(function_state).function->type == ZEND_USER_FUNCTION) {
                zval **original_return_value = EG(return_value_ptr_ptr);
 
-               EX_T(opline->result.u.var).var.ptr = NULL;
                if (EG(symtable_cache_ptr)>=EG(symtable_cache)) {
                        /*printf("Cache hit!  Reusing %x\n", symtable_cache[symtable_cache_ptr]);*/
                        EG(active_symbol_table) = *(EG(symtable_cache_ptr)--);
@@ -2229,17 +2220,16 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY)
                        zend_u_hash_init(EG(active_symbol_table), 0, NULL, ZVAL_PTR_DTOR, 0, UG(unicode));
                        /*printf("Cache miss!  Initialized %x\n", EG(active_symbol_table));*/
                }
-               EG(return_value_ptr_ptr) = RETURN_VALUE_USED(opline) ? &EX_T(opline->result.u.var).var.ptr : NULL;
-               EG(active_op_array) = (zend_op_array *) EX(function_state).function;
+               EG(active_op_array) = &EX(function_state).function->op_array;
+               EG(return_value_ptr_ptr) = NULL;
+               if (RETURN_VALUE_USED(opline)) {                        
+                       EG(return_value_ptr_ptr) = &EX_T(opline->result.u.var).var.ptr;
+                       EX_T(opline->result.u.var).var.ptr = NULL;
+                       EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
+                       EX_T(opline->result.u.var).var.fcall_returned_reference = EX(function_state).function->common.return_reference;
+               }
 
                zend_execute(EG(active_op_array) TSRMLS_CC);
-               EX_T(opline->result.u.var).var.fcall_returned_reference = EG(active_op_array)->return_reference;
-
-               if (RETURN_VALUE_USED(opline)) {
-                       if (!EG(exception) && !EX_T(opline->result.u.var).var.ptr) {
-                               ALLOC_INIT_ZVAL(EX_T(opline->result.u.var).var.ptr);
-                       }
-               }
 
                EG(opline_ptr) = &EX(opline);
                EG(active_op_array) = EX(op_array);
@@ -2275,35 +2265,33 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY)
                        Z_UNSET_ISREF_P(EX_T(opline->result.u.var).var.ptr);
                        Z_SET_REFCOUNT_P(EX_T(opline->result.u.var).var.ptr, 1);
                        EX_T(opline->result.u.var).var.fcall_returned_reference = 0;
+                       EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
                }
        }
 
        EX(function_state).function = (zend_function *) EX(op_array);
        EX(function_state).arguments = NULL;
 
-       if (EG(This)) {
-               if (EG(exception) && IS_CTOR_CALL(EX(called_scope))) {
-                       if (IS_CTOR_USED(EX(called_scope))) {
-                               Z_DELREF_P(EG(This));
-                       }
-                       if (Z_REFCOUNT_P(EG(This)) == 1) {
-                               zend_object_store_ctor_failed(EG(This) TSRMLS_CC);
+       if (should_change_scope) {
+               if (EG(This)) {
+                       if (EG(exception) && IS_CTOR_CALL(EX(called_scope))) {
+                               if (IS_CTOR_USED(EX(called_scope))) {
+                                       Z_DELREF_P(EG(This));
+                               }
+                               if (Z_REFCOUNT_P(EG(This)) == 1) {
+                                       zend_object_store_ctor_failed(EG(This) TSRMLS_CC);
+                               }
                        }
-               }
-               if (should_change_scope) {
                        zval_ptr_dtor(&EG(This));
                }
-       }
-
-       EX(object) = ex_object;
-       EX(called_scope) = DECODE_CTOR(EX(called_scope));
-
-       if (should_change_scope) {
                EG(This) = current_this;
                EG(scope) = current_scope;
                EG(called_scope) = current_called_scope;
        }
 
+       EX(object) = ex_object;
+       EX(called_scope) = DECODE_CTOR(EX(called_scope));
+
        zend_vm_stack_clear_multiple(TSRMLS_C);
 
        if (EG(exception)) {
index 4f6aae710937042277507e89acb7dcd426922ab6..843b9f90bcc9a70444d2559950256b9180001ba6 100644 (file)
@@ -177,10 +177,9 @@ static int zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
        zend_ptr_stack_3_pop(&EG(arg_types_stack), (void*)&EX(called_scope), (void**)&ex_object, (void**)&EX(fbc));
        EX(function_state).arguments = zend_vm_stack_push_args(opline->extended_value TSRMLS_CC);
 
-       EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
-
        if (EX(function_state).function->type == ZEND_INTERNAL_FUNCTION) {
                ALLOC_INIT_ZVAL(EX_T(opline->result.u.var).var.ptr);
+               EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
                EX_T(opline->result.u.var).var.fcall_returned_reference = EX(function_state).function->common.return_reference;
 
                if (EX(function_state).function->common.arg_info) {
@@ -200,20 +199,12 @@ static int zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
                        zend_execute_internal(execute_data, RETURN_VALUE_USED(opline) TSRMLS_CC);
                }
 
-/*     We shouldn't fix bad extensions here,
-    because it can break proper ones (Bug #34045)
-               if (!EX(function_state).function->common.return_reference) {
-                       Z_UNSET_ISREF_P(EX_T(opline->result.u.var).var.ptr);
-                       Z_SET_REFCOUNT_P(EX_T(opline->result.u.var).var.ptr, 1);
-               }
-*/
                if (!RETURN_VALUE_USED(opline)) {
                        zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
                }
        } else if (EX(function_state).function->type == ZEND_USER_FUNCTION) {
                zval **original_return_value = EG(return_value_ptr_ptr);
 
-               EX_T(opline->result.u.var).var.ptr = NULL;
                if (EG(symtable_cache_ptr)>=EG(symtable_cache)) {
                        /*printf("Cache hit!  Reusing %x\n", symtable_cache[symtable_cache_ptr]);*/
                        EG(active_symbol_table) = *(EG(symtable_cache_ptr)--);
@@ -222,18 +213,17 @@ static int zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
                        zend_u_hash_init(EG(active_symbol_table), 0, NULL, ZVAL_PTR_DTOR, 0, UG(unicode));
                        /*printf("Cache miss!  Initialized %x\n", EG(active_symbol_table));*/
                }
-               EG(return_value_ptr_ptr) = RETURN_VALUE_USED(opline) ? &EX_T(opline->result.u.var).var.ptr : NULL;
-               EG(active_op_array) = (zend_op_array *) EX(function_state).function;
-
-               zend_execute(EG(active_op_array) TSRMLS_CC);
-               EX_T(opline->result.u.var).var.fcall_returned_reference = EG(active_op_array)->return_reference;
-
+               EG(active_op_array) = &EX(function_state).function->op_array;
+               EG(return_value_ptr_ptr) = NULL;
                if (RETURN_VALUE_USED(opline)) {
-                       if (!EG(exception) && !EX_T(opline->result.u.var).var.ptr) {
-                               ALLOC_INIT_ZVAL(EX_T(opline->result.u.var).var.ptr);
-                       }
+                       EG(return_value_ptr_ptr) = &EX_T(opline->result.u.var).var.ptr;
+                       EX_T(opline->result.u.var).var.ptr = NULL;
+                       EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
+                       EX_T(opline->result.u.var).var.fcall_returned_reference = EX(function_state).function->common.return_reference;
                }
 
+               zend_execute(EG(active_op_array) TSRMLS_CC);
+
                EG(opline_ptr) = &EX(opline);
                EG(active_op_array) = EX(op_array);
                EG(return_value_ptr_ptr)=original_return_value;
@@ -268,35 +258,33 @@ static int zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
                        Z_UNSET_ISREF_P(EX_T(opline->result.u.var).var.ptr);
                        Z_SET_REFCOUNT_P(EX_T(opline->result.u.var).var.ptr, 1);
                        EX_T(opline->result.u.var).var.fcall_returned_reference = 0;
+                       EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
                }
        }
 
        EX(function_state).function = (zend_function *) EX(op_array);
        EX(function_state).arguments = NULL;
 
-       if (EG(This)) {
-               if (EG(exception) && IS_CTOR_CALL(EX(called_scope))) {
-                       if (IS_CTOR_USED(EX(called_scope))) {
-                               Z_DELREF_P(EG(This));
-                       }
-                       if (Z_REFCOUNT_P(EG(This)) == 1) {
-                               zend_object_store_ctor_failed(EG(This) TSRMLS_CC);
+       if (should_change_scope) {
+               if (EG(This)) {
+                       if (EG(exception) && IS_CTOR_CALL(EX(called_scope))) {
+                               if (IS_CTOR_USED(EX(called_scope))) {
+                                       Z_DELREF_P(EG(This));
+                               }
+                               if (Z_REFCOUNT_P(EG(This)) == 1) {
+                                       zend_object_store_ctor_failed(EG(This) TSRMLS_CC);
+                               }
                        }
-               }
-               if (should_change_scope) {
                        zval_ptr_dtor(&EG(This));
                }
-       }
-
-       EX(object) = ex_object;
-       EX(called_scope) = DECODE_CTOR(EX(called_scope));
-
-       if (should_change_scope) {
                EG(This) = current_this;
                EG(scope) = current_scope;
                EG(called_scope) = current_called_scope;
        }
 
+       EX(object) = ex_object;
+       EX(called_scope) = DECODE_CTOR(EX(called_scope));
+
        zend_vm_stack_clear_multiple(TSRMLS_C);
 
        if (EG(exception)) {