summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2015-03-03 16:51:27 +0300
committerDmitry Stogov <dmitry@zend.com>2015-03-03 16:51:27 +0300
commitb4e9da22d720b6405528ebe5265099663c6dbac4 (patch)
treefe162225ea022af6472bfd87b5d5a3d0312ab85d
parent6b9c40280a5e4bedf4ea2d583a3acc4e7d0730f6 (diff)
downloadphp-git-b4e9da22d720b6405528ebe5265099663c6dbac4.tar.gz
Microoptimization (avoid reloading from memory)
-rw-r--r--Zend/zend_vm_def.h21
-rw-r--r--Zend/zend_vm_execute.h21
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);