Commit:    01049ca7aed40a5f1081d0303c69a40dae0f982e
Author:    Xinchen Hui <larue...@php.net>         Fri, 8 Mar 2013 10:34:17 +0800
Parents:   ac73ca6db4fca8273928856c8011ed13b83590b1
Branches:  PHP-5.5

Link:       
http://git.php.net/?p=php-src.git;a=commitdiff;h=01049ca7aed40a5f1081d0303c69a40dae0f982e

Log:
Fixed bug #61025 (__invoke() visibility not honored)

Bugs:
https://bugs.php.net/61025

Changed paths:
  M  NEWS
  M  NEWS-5.5
  A  Zend/tests/bug61025.phpt
  M  Zend/zend_closures.c
  M  Zend/zend_closures.h
  M  Zend/zend_compile.c
  M  Zend/zend_compile.h


Diff:
diff --git a/NEWS b/NEWS
index a82e9a2..a1c0aea 100644
--- 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)
 
diff --git a/NEWS-5.5 b/NEWS-5.5
index a5b11c0..d5acd61 100644
--- 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
index 0000000..0709c28
--- /dev/null
+++ b/Zend/tests/bug61025.phpt
@@ -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
diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c
index 0de9283..5faefbd 100644
--- a/Zend/zend_closures.c
+++ b/Zend/zend_closures.c
@@ -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;
diff --git a/Zend/zend_closures.h b/Zend/zend_closures.h
index c41cf47..9d50641 100644
--- a/Zend/zend_closures.h
+++ b/Zend/zend_closures.h
@@ -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;
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index e45419d..aa1df99 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -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;
                        }
diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h
index 8042dd5..2295cff 100644
--- a/Zend/zend_compile.h
+++ b/Zend/zend_compile.h
@@ -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 */


--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to