diff options
author | Dmitry Stogov <dmitry@zend.com> | 2018-06-22 14:29:54 +0300 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2018-06-22 14:29:54 +0300 |
commit | 34e58a6447ec516af1cef0dd25dd132fe0fdf272 (patch) | |
tree | 5f5fda496e37c5511d50e0cd20a19ca3a457bedb /Zend/zend_objects.c | |
parent | 3c600e2d61161b2db2c2e9b0e67b2cc8e93df906 (diff) | |
download | php-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.c | 53 |
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); } } |