]> granicus.if.org Git - php/commitdiff
- MFB: Fixed bug #45186 (__call depends on __callstatic in class scope)
authorFelipe Pena <felipe@php.net>
Thu, 5 Jun 2008 19:16:17 +0000 (19:16 +0000)
committerFelipe Pena <felipe@php.net>
Thu, 5 Jun 2008 19:16:17 +0000 (19:16 +0000)
Zend/zend_API.c

index 6f56ec9fff0bf809847f16856264ed21e3238376..570d8f7bc08b2c23af8c0264c33cc6972136543f 100644 (file)
@@ -2802,14 +2802,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 '%v' does not have a method '%v'", (*ce_ptr)->name, lmname);
-                       } else {
-                               if (error) zend_spprintf(error, 0, "function '%v' 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 '%v' does not have a method '%v'", (*ce_ptr)->name, lmname);
+                               } else {
+                                       if (error) zend_spprintf(error, 0, "function '%v' does not exist", lmname);
+                               }
                        }
                }
        } else {