]> granicus.if.org Git - php/commitdiff
Fixed bug #61025 (__invoke() visibility not honored)
authorXinchen Hui <laruence@php.net>
Fri, 8 Mar 2013 02:34:17 +0000 (10:34 +0800)
committerXinchen Hui <laruence@php.net>
Fri, 8 Mar 2013 02:34:17 +0000 (10:34 +0800)
NEWS
NEWS-5.5
Zend/tests/bug61025.phpt [new file with mode: 0644]
Zend/zend_closures.c
Zend/zend_closures.h
Zend/zend_compile.c
Zend/zend_compile.h

diff --git a/NEWS b/NEWS
index a82e9a26d92d853914fab35877aa7d71fee747ef..a1c0aea21f7dc0d2dd7e5bbaef24c42fad10fb09 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -6,6 +6,7 @@ PHP                                                                        NEWS
 07 Mar 2013, PHP 5.5.0 Alpha 6
 
 - Core:
+  . Fixed bug #61025 (__invoke() visibility not honored). (Laruence)
   . Fixed bug #49348 (Uninitialized ++$foo->bar; does not cause a notice).
     (Stas)
 
index a5b11c0d3263d1a0c7c1cdb1c16877b68dcfd4e9..d5acd617b4377f06541ffa70bb1905f73101fa03 100644 (file)
--- a/NEWS-5.5
+++ b/NEWS-5.5
@@ -3,6 +3,7 @@ PHP                                                                        NEWS
 ?? ??? 201?, PHP 5.5.0 Beta 1
 
 - Core:
+  . Fixed bug #61025 (__invoke() visibility not honored). (Laruence)
   . Fixed bug #49348 (Uninitialized ++$foo->bar; does not cause a notice).
     (Stas)
 
diff --git a/Zend/tests/bug61025.phpt b/Zend/tests/bug61025.phpt
new file mode 100644 (file)
index 0000000..0709c28
--- /dev/null
@@ -0,0 +1,27 @@
+--TEST--
+Bug #61025 (__invoke() visibility not honored)
+--FILE--
+<?php
+
+Interface InvokeAble {
+    static function __invoke();
+}
+
+class Bar {
+    private function __invoke() {
+        return __CLASS__;
+    }
+}
+
+$b = new Bar;
+echo $b();
+
+echo $b->__invoke();
+
+?>
+--EXPECTF--
+Warning: The magic method __invoke() must have public visibility and cannot be static in %sbug61025.php on line %d
+
+Warning: The magic method __invoke() must have public visibility and cannot be static in %sbug61025.php on line %d
+Bar
+Fatal error: Call to private method Bar::__invoke() from context '' in %sbug61025.php on line %d
index 0de9283337705757c85c01f92cb468c6ac0adc1c..5faefbd2241a47bc1850b53a2dccffeac77455d7 100644 (file)
@@ -291,7 +291,6 @@ static zend_object_value zend_closure_clone(zval *zobject TSRMLS_DC) /* {{{ */
 }
 /* }}} */
 
-
 int zend_closure_get_closure(zval *obj, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zval **zobj_ptr TSRMLS_DC) /* {{{ */
 {
        zend_closure *closure;
index c41cf475603fbf48d8e5fdbfca500c0b92b3887c..9d50641d219873576b8dd21dbb4e6c01bbab4e97 100644 (file)
@@ -24,8 +24,6 @@
 
 BEGIN_EXTERN_C()
 
-#define ZEND_INVOKE_FUNC_NAME "__invoke"
-
 void zend_register_closure_ce(TSRMLS_D);
 
 extern ZEND_API zend_class_entry *zend_ce_closure;
index e45419d3f0c875be2d04108316afc1797914b908..aa1df99ea959334dc731048701c697caca256604 100644 (file)
@@ -1621,6 +1621,10 @@ void zend_do_begin_function_declaration(znode *function_token, znode *function_n
                                if (fn_flags & ((ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC) ^ ZEND_ACC_PUBLIC)) {
                                        zend_error(E_WARNING, "The magic method __toString() must have public visibility and cannot be static");
                                }
+                       } else if ((name_len == sizeof(ZEND_INVOKE_FUNC_NAME)-1) && (!memcmp(lcname, ZEND_INVOKE_FUNC_NAME, sizeof(ZEND_INVOKE_FUNC_NAME)-1))) {
+                               if (fn_flags & ((ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC) ^ ZEND_ACC_PUBLIC)) {
+                                       zend_error(E_WARNING, "The magic method __invoke() must have public visibility and cannot be static");
+                               }
                        }
                } else {
                        char *class_lcname;
@@ -1677,6 +1681,10 @@ void zend_do_begin_function_declaration(znode *function_token, znode *function_n
                                        zend_error(E_WARNING, "The magic method __toString() must have public visibility and cannot be static");
                                }
                                CG(active_class_entry)->__tostring = (zend_function *) CG(active_op_array);
+                       } else if ((name_len == sizeof(ZEND_INVOKE_FUNC_NAME)-1) && (!memcmp(lcname, ZEND_INVOKE_FUNC_NAME, sizeof(ZEND_INVOKE_FUNC_NAME)-1))) {
+                               if (fn_flags & ((ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC) ^ ZEND_ACC_PUBLIC)) {
+                                       zend_error(E_WARNING, "The magic method __invoke() must have public visibility and cannot be static");
+                               }
                        } else if (!(fn_flags & ZEND_ACC_STATIC)) {
                                CG(active_op_array)->fn_flags |= ZEND_ACC_ALLOW_STATIC;
                        }
index 8042dd54eee816d1dc284885c1c428da6d83dcef..2295cffab943e6b05916e35cabbcc8277e63935b 100644 (file)
@@ -856,6 +856,7 @@ END_EXTERN_C()
 #define ZEND_CALLSTATIC_FUNC_NAME   "__callstatic"
 #define ZEND_TOSTRING_FUNC_NAME     "__tostring"
 #define ZEND_AUTOLOAD_FUNC_NAME     "__autoload"
+#define ZEND_INVOKE_FUNC_NAME       "__invoke"
 
 /* The following constants may be combined in CG(compiler_options)
  * to change the default compiler behavior */