summaryrefslogtreecommitdiff
path: root/Zend/zend_objects.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2018-06-22 14:29:54 +0300
committerDmitry Stogov <dmitry@zend.com>2018-06-22 14:29:54 +0300
commit34e58a6447ec516af1cef0dd25dd132fe0fdf272 (patch)
tree5f5fda496e37c5511d50e0cd20a19ca3a457bedb /Zend/zend_objects.c
parent3c600e2d61161b2db2c2e9b0e67b2cc8e93df906 (diff)
downloadphp-git-34e58a6447ec516af1cef0dd25dd132fe0fdf272.tar.gz
Reduced overhead of magic method calls (__get/__set/__unset/__isset/__dectructor/__clone).
Diffstat (limited to 'Zend/zend_objects.c')
-rw-r--r--Zend/zend_objects.c53
1 files changed, 44 insertions, 9 deletions
diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c
index 00d124ff24..496b46f5f8 100644
--- a/Zend/zend_objects.c
+++ b/Zend/zend_objects.c
@@ -78,8 +78,10 @@ ZEND_API void zend_objects_destroy_object(zend_object *object)
if (destructor) {
zend_object *old_exception;
- zval obj;
zend_class_entry *orig_fake_scope;
+ zend_fcall_info fci;
+ zend_fcall_info_cache fcic;
+ zval ret;
if (destructor->op_array.fn_flags & (ZEND_ACC_PRIVATE|ZEND_ACC_PROTECTED)) {
if (destructor->op_array.fn_flags & ZEND_ACC_PRIVATE) {
@@ -124,7 +126,6 @@ ZEND_API void zend_objects_destroy_object(zend_object *object)
}
GC_ADDREF(object);
- ZVAL_OBJ(&obj, object);
/* Make sure that destructors are protected from previously thrown exceptions.
* For example, if an exception was thrown in a function and when the function's
@@ -141,7 +142,24 @@ ZEND_API void zend_objects_destroy_object(zend_object *object)
}
orig_fake_scope = EG(fake_scope);
EG(fake_scope) = NULL;
- zend_call_method_with_0_params(&obj, object->ce, &destructor, ZEND_DESTRUCTOR_FUNC_NAME, NULL);
+
+ ZVAL_UNDEF(&ret);
+
+ fci.size = sizeof(fci);
+ fci.object = object;
+ fci.retval = &ret;
+ fci.param_count = 0;
+ fci.params = NULL;
+ fci.no_separation = 1;
+ ZVAL_UNDEF(&fci.function_name); /* Unused */
+
+ fcic.function_handler = destructor;
+ fcic.called_scope = object->ce;
+ fcic.object = object;
+
+ zend_call_function(&fci, &fcic);
+ zval_ptr_dtor(&ret);
+
if (old_exception) {
if (EG(exception)) {
zend_exception_set_previous(EG(exception), old_exception);
@@ -149,7 +167,7 @@ ZEND_API void zend_objects_destroy_object(zend_object *object)
EG(exception) = old_exception;
}
}
- zval_ptr_dtor(&obj);
+ OBJ_RELEASE(object);
EG(fake_scope) = orig_fake_scope;
}
}
@@ -220,12 +238,29 @@ ZEND_API void ZEND_FASTCALL zend_objects_clone_members(zend_object *new_object,
}
if (old_object->ce->clone) {
- zval new_obj;
+ zend_fcall_info fci;
+ zend_fcall_info_cache fcic;
+ zval ret;
+
+ GC_ADDREF(new_object);
+
+ ZVAL_UNDEF(&ret);
+
+ fci.size = sizeof(fci);
+ fci.object = new_object;
+ fci.retval = &ret;
+ fci.param_count = 0;
+ fci.params = NULL;
+ fci.no_separation = 1;
+ ZVAL_UNDEF(&fci.function_name); /* Unused */
+
+ fcic.function_handler = new_object->ce->clone;
+ fcic.called_scope = new_object->ce;
+ fcic.object = new_object;
- ZVAL_OBJ(&new_obj, new_object);
- Z_ADDREF(new_obj);
- zend_call_method_with_0_params(&new_obj, old_object->ce, &old_object->ce->clone, ZEND_CLONE_FUNC_NAME, NULL);
- zval_ptr_dtor(&new_obj);
+ zend_call_function(&fci, &fcic);
+ zval_ptr_dtor(&ret);
+ OBJ_RELEASE(new_object);
}
}