]> granicus.if.org Git - php/commitdiff
Microoptimization (avoid reloading from memory)
authorDmitry Stogov <dmitry@zend.com>
Tue, 3 Mar 2015 13:51:27 +0000 (16:51 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 3 Mar 2015 13:51:27 +0000 (16:51 +0300)
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 2e9ffd6448f58c380700ae318a3e64dd9dca8b00..1f4fe799a390e1af351950ed4687c9725e55e8a4 100644 (file)
@@ -1894,6 +1894,7 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV)
 
 ZEND_VM_HELPER(zend_leave_helper, ANY, ANY)
 {
+       zend_execute_data *old_execute_data;
        zend_call_kind call_kind = EX_CALL_KIND();
 
        if (call_kind == ZEND_CALL_NESTED_FUNCTION) {
@@ -1904,14 +1905,13 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY)
                        zend_clean_and_cache_symbol_table(EX(symbol_table));
                }
                zend_vm_stack_free_extra_args(execute_data);
-               EG(current_execute_data) = EX(prev_execute_data);
-               if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_CLOSURE) != 0) && EX(func)->op_array.prototype) {
-                       OBJ_RELEASE((zend_object*)EX(func)->op_array.prototype);
+               old_execute_data = execute_data;
+               execute_data = EG(current_execute_data) = EX(prev_execute_data);
+               if (UNEXPECTED((old_execute_data->func->op_array.fn_flags & ZEND_ACC_CLOSURE) != 0) && EX(func)->op_array.prototype) {
+                       OBJ_RELEASE((zend_object*)old_execute_data->func->op_array.prototype);
                }
-               object = Z_OBJ(EX(This));
-               zend_vm_stack_free_call_frame(execute_data);
-
-               execute_data = EG(current_execute_data);
+               object = Z_OBJ(old_execute_data->This);
+               zend_vm_stack_free_call_frame(old_execute_data);
 
                if (object) {
                        if (UNEXPECTED(EG(exception) != NULL) && (EX(opline)->op1.num & ZEND_CALL_CTOR)) {
@@ -1942,10 +1942,10 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY)
                zend_detach_symbol_table(execute_data);
                destroy_op_array(&EX(func)->op_array);
                efree_size(EX(func), sizeof(zend_op_array));
-               EG(current_execute_data) = EX(prev_execute_data);
-               zend_vm_stack_free_call_frame(execute_data);
+               old_execute_data = execute_data;
+               execute_data = EG(current_execute_data) = EX(prev_execute_data);
+               zend_vm_stack_free_call_frame(old_execute_data);
 
-               execute_data = EG(current_execute_data);
                zend_attach_symbol_table(execute_data);
                if (UNEXPECTED(EG(exception) != NULL)) {
                        zend_throw_exception_internal(NULL);
@@ -1968,7 +1968,6 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY)
                        }
                } else /* if (call_kind == ZEND_CALL_TOP_CODE) */ {
                        zend_array *symbol_table = EX(symbol_table);
-                       zend_execute_data *old_execute_data;
 
                        zend_detach_symbol_table(execute_data);
                        old_execute_data = EX(prev_execute_data);
index 465ecc6dd45fcd28cba5ed89b304b4fc2a31e461..0cff7d7baf75e7a6e098a6ae7b8c05b7abc24d54 100644 (file)
@@ -383,6 +383,7 @@ ZEND_API void zend_execute(zend_op_array *op_array, zval *return_value)
 
 static int ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
 {
+       zend_execute_data *old_execute_data;
        zend_call_kind call_kind = EX_CALL_KIND();
 
        if (call_kind == ZEND_CALL_NESTED_FUNCTION) {
@@ -393,14 +394,13 @@ static int ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
                        zend_clean_and_cache_symbol_table(EX(symbol_table));
                }
                zend_vm_stack_free_extra_args(execute_data);
-               EG(current_execute_data) = EX(prev_execute_data);
-               if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_CLOSURE) != 0) && EX(func)->op_array.prototype) {
-                       OBJ_RELEASE((zend_object*)EX(func)->op_array.prototype);
+               old_execute_data = execute_data;
+               execute_data = EG(current_execute_data) = EX(prev_execute_data);
+               if (UNEXPECTED((old_execute_data->func->op_array.fn_flags & ZEND_ACC_CLOSURE) != 0) && EX(func)->op_array.prototype) {
+                       OBJ_RELEASE((zend_object*)old_execute_data->func->op_array.prototype);
                }
-               object = Z_OBJ(EX(This));
-               zend_vm_stack_free_call_frame(execute_data);
-
-               execute_data = EG(current_execute_data);
+               object = Z_OBJ(old_execute_data->This);
+               zend_vm_stack_free_call_frame(old_execute_data);
 
                if (object) {
                        if (UNEXPECTED(EG(exception) != NULL) && (EX(opline)->op1.num & ZEND_CALL_CTOR)) {
@@ -431,10 +431,10 @@ static int ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
                zend_detach_symbol_table(execute_data);
                destroy_op_array(&EX(func)->op_array);
                efree_size(EX(func), sizeof(zend_op_array));
-               EG(current_execute_data) = EX(prev_execute_data);
-               zend_vm_stack_free_call_frame(execute_data);
+               old_execute_data = execute_data;
+               execute_data = EG(current_execute_data) = EX(prev_execute_data);
+               zend_vm_stack_free_call_frame(old_execute_data);
 
-               execute_data = EG(current_execute_data);
                zend_attach_symbol_table(execute_data);
                if (UNEXPECTED(EG(exception) != NULL)) {
                        zend_throw_exception_internal(NULL);
@@ -457,7 +457,6 @@ static int ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
                        }
                } else /* if (call_kind == ZEND_CALL_TOP_CODE) */ {
                        zend_array *symbol_table = EX(symbol_table);
-                       zend_execute_data *old_execute_data;
 
                        zend_detach_symbol_table(execute_data);
                        old_execute_data = EX(prev_execute_data);