summaryrefslogtreecommitdiff
path: root/Zend/zend_interfaces.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2015-04-23 12:16:37 +0300
committerDmitry Stogov <dmitry@zend.com>2015-04-23 12:16:37 +0300
commit49cf7c5d120876b52fb187e4c13f4adc4fc4d9a6 (patch)
tree98dd1e2611a86e363a9c8f35f91a033eb5c1d0e6 /Zend/zend_interfaces.c
parent801768f72ceb5682b3bc6c10827f747d93753a58 (diff)
downloadphp-git-49cf7c5d120876b52fb187e4c13f4adc4fc4d9a6.tar.gz
Don't propogate "fake" EX(called_scope) and EX(This) into each internal function.
They need quite seldom and it's cheaper to get them from corresponfing upper stack frame.
Diffstat (limited to 'Zend/zend_interfaces.c')
-rw-r--r--Zend/zend_interfaces.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c
index 5cb7024706..54f8f8c117 100644
--- a/Zend/zend_interfaces.c
+++ b/Zend/zend_interfaces.c
@@ -89,13 +89,16 @@ ZEND_API zval* zend_call_method(zval *object, zend_class_entry *obj_ce, zend_fun
fcic.calling_scope = obj_ce;
if (object) {
fcic.called_scope = Z_OBJCE_P(object);
- } else if (obj_ce &&
- !(EG(current_execute_data) &&
- EG(current_execute_data)->called_scope &&
- instanceof_function(EG(current_execute_data)->called_scope, obj_ce))) {
- fcic.called_scope = obj_ce;
} else {
- fcic.called_scope = EG(current_execute_data) ? EG(current_execute_data)->called_scope : NULL;
+ zend_class_entry *called_scope = zend_get_called_scope(EG(current_execute_data));
+
+ if (obj_ce &&
+ (!called_scope ||
+ !instanceof_function(called_scope, obj_ce))) {
+ fcic.called_scope = obj_ce;
+ } else {
+ fcic.called_scope = called_scope;
+ }
}
fcic.object = object ? Z_OBJ_P(object) : NULL;
result = zend_call_function(&fci, &fcic);