From b4e9da22d720b6405528ebe5265099663c6dbac4 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 3 Mar 2015 16:51:27 +0300 Subject: [PATCH] Microoptimization (avoid reloading from memory) --- Zend/zend_vm_def.h | 21 ++++++++++----------- Zend/zend_vm_execute.h | 21 ++++++++++----------- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 2e9ffd6448..1f4fe799a3 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -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); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 465ecc6dd4..0cff7d7baf 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -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); -- 2.40.0