summaryrefslogtreecommitdiff
path: root/Zend/zend_API.c
diff options
context:
space:
mode:
authorFelipe Pena <felipe@php.net>2008-06-05 18:53:06 +0000
committerFelipe Pena <felipe@php.net>2008-06-05 18:53:06 +0000
commit0da88458e2debb02c0fe00dbd1432d7a3794ced7 (patch)
tree6129db62bb830f83e575236523dd9a28bdfabfb9 /Zend/zend_API.c
parent2af92fa8361ef67bf7f85c6d4da5256655cf94ca (diff)
downloadphp-git-0da88458e2debb02c0fe00dbd1432d7a3794ced7.tar.gz
- Fixed bug #45186 (__call depends on __callstatic in class scope)
Diffstat (limited to 'Zend/zend_API.c')
-rw-r--r--Zend/zend_API.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/Zend/zend_API.c b/Zend/zend_API.c
index 163ec5411c..d8f627adad 100644
--- a/Zend/zend_API.c
+++ b/Zend/zend_API.c
@@ -2392,14 +2392,27 @@ static int zend_is_callable_check_func(int check_flags, zval ***zobj_ptr_ptr, ze
if (*zobj_ptr_ptr && *ce_ptr && (*ce_ptr)->__call != 0) {
retval = (*ce_ptr)->__call != NULL;
*fptr_ptr = (*ce_ptr)->__call;
- } else if (!*zobj_ptr_ptr && *ce_ptr && (*ce_ptr)->__callstatic) {
- retval = 1;
- *fptr_ptr = (*ce_ptr)->__callstatic;
} else {
- if (*ce_ptr) {
- if (error) zend_spprintf(error, 0, "class '%s' does not have a method '%s'", (*ce_ptr)->name, lmname);
- } else {
- if (error) zend_spprintf(error, 0, "function '%s' does not exist", lmname);
+ if (!*zobj_ptr_ptr && *ce_ptr && ((*ce_ptr)->__callstatic || (*ce_ptr)->__call)) {
+ if ((*ce_ptr)->__call &&
+ EG(This) &&
+ Z_OBJ_HT_P(EG(This))->get_class_entry &&
+ instanceof_function(Z_OBJCE_P(EG(This)), *ce_ptr TSRMLS_CC)) {
+ retval = 1;
+ *fptr_ptr = (*ce_ptr)->__call;
+ *zobj_ptr_ptr = &EG(This);
+ } else if ((*ce_ptr)->__callstatic) {
+ retval = 1;
+ *fptr_ptr = (*ce_ptr)->__callstatic;
+ }
+ }
+
+ if (retval == 0) {
+ if (*ce_ptr) {
+ if (error) zend_spprintf(error, 0, "class '%s' does not have a method '%s'", (*ce_ptr)->name, lmname);
+ } else {
+ if (error) zend_spprintf(error, 0, "function '%s' does not exist", lmname);
+ }
}
}
} else {