felipe Tue Jun 3 14:07:15 2008 UTC Added files: (Branch: PHP_5_3) /ZendEngine2/tests magic_methods_001.phpt magic_methods_002.phpt magic_methods_003.phpt magic_methods_004.phpt magic_methods_005.phpt magic_methods_006.phpt magic_methods_007.phpt magic_methods_008.phpt magic_methods_009.phpt magic_methods_010.phpt
Modified files: /ZendEngine2 zend_compile.c /php-src/tests/classes __call_005.phpt Log: - MFH: Fixed bug #44769 (declaring private magic methods should throw error)
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_compile.c?r1=1.647.2.27.2.41.2.64&r2=1.647.2.27.2.41.2.65&diff_format=u Index: ZendEngine2/zend_compile.c diff -u ZendEngine2/zend_compile.c:1.647.2.27.2.41.2.64 ZendEngine2/zend_compile.c:1.647.2.27.2.41.2.65 --- ZendEngine2/zend_compile.c:1.647.2.27.2.41.2.64 Mon May 12 09:09:05 2008 +++ ZendEngine2/zend_compile.c Tue Jun 3 14:07:15 2008 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_compile.c,v 1.647.2.27.2.41.2.64 2008/05/12 09:09:05 dmitry Exp $ */ +/* $Id: zend_compile.c,v 1.647.2.27.2.41.2.65 2008/06/03 14:07:15 felipe Exp $ */ #include <zend_language_parser.h> #include "zend.h" @@ -1203,7 +1203,37 @@ fn_flags |= ZEND_ACC_PUBLIC; } - if (!(CG(active_class_entry)->ce_flags & ZEND_ACC_INTERFACE)) { + if (CG(active_class_entry)->ce_flags & ZEND_ACC_INTERFACE) { + if ((name_len == sizeof(ZEND_CALL_FUNC_NAME)-1) && (!memcmp(lcname, ZEND_CALL_FUNC_NAME, sizeof(ZEND_CALL_FUNC_NAME)-1))) { + if (fn_flags & ((ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC) ^ ZEND_ACC_PUBLIC)) { + zend_error(E_COMPILE_ERROR, "The magic method __call() must have public visibility and can not be static"); + } + } else if ((name_len == sizeof(ZEND_CALLSTATIC_FUNC_NAME)-1) && (!memcmp(lcname, ZEND_CALLSTATIC_FUNC_NAME, sizeof(ZEND_CALLSTATIC_FUNC_NAME)-1))) { + if ((fn_flags & (ZEND_ACC_PPP_MASK ^ ZEND_ACC_PUBLIC)) || (fn_flags & ZEND_ACC_STATIC) == 0) { + zend_error(E_COMPILE_ERROR, "The magic method __callStatic() must have public visibility and be static"); + } + } else if ((name_len == sizeof(ZEND_GET_FUNC_NAME)-1) && (!memcmp(lcname, ZEND_GET_FUNC_NAME, sizeof(ZEND_GET_FUNC_NAME)-1))) { + if (fn_flags & ((ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC) ^ ZEND_ACC_PUBLIC)) { + zend_error(E_COMPILE_ERROR, "The magic method __get() must have public visibility and can not be static"); + } + } else if ((name_len == sizeof(ZEND_SET_FUNC_NAME)-1) && (!memcmp(lcname, ZEND_SET_FUNC_NAME, sizeof(ZEND_SET_FUNC_NAME)-1))) { + if (fn_flags & ((ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC) ^ ZEND_ACC_PUBLIC)) { + zend_error(E_COMPILE_ERROR, "The magic method __set() must have public visibility and can not be static"); + } + } else if ((name_len == sizeof(ZEND_UNSET_FUNC_NAME)-1) && (!memcmp(lcname, ZEND_UNSET_FUNC_NAME, sizeof(ZEND_UNSET_FUNC_NAME)-1))) { + if (fn_flags & ((ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC) ^ ZEND_ACC_PUBLIC)) { + zend_error(E_COMPILE_ERROR, "The magic method __unset() must have public visibility and can not be static"); + } + } else if ((name_len == sizeof(ZEND_ISSET_FUNC_NAME)-1) && (!memcmp(lcname, ZEND_ISSET_FUNC_NAME, sizeof(ZEND_ISSET_FUNC_NAME)-1))) { + if (fn_flags & ((ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC) ^ ZEND_ACC_PUBLIC)) { + zend_error(E_COMPILE_ERROR, "The magic method __isset() must have public visibility and can not be static"); + } + } else if ((name_len == sizeof(ZEND_TOSTRING_FUNC_NAME)-1) && (!memcmp(lcname, ZEND_TOSTRING_FUNC_NAME, sizeof(ZEND_TOSTRING_FUNC_NAME)-1))) { + if (fn_flags & ((ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC) ^ ZEND_ACC_PUBLIC)) { + zend_error(E_COMPILE_ERROR, "The magic method __toString() must have public visibility and can not be static"); + } + } + } else { char *short_class_name; int short_class_name_length; char *short_class_lcname; @@ -1235,18 +1265,39 @@ } else if ((name_len == sizeof(ZEND_CLONE_FUNC_NAME)-1) && (!memcmp(lcname, ZEND_CLONE_FUNC_NAME, sizeof(ZEND_CLONE_FUNC_NAME)-1))) { CG(active_class_entry)->clone = (zend_function *) CG(active_op_array); } else if ((name_len == sizeof(ZEND_CALL_FUNC_NAME)-1) && (!memcmp(lcname, ZEND_CALL_FUNC_NAME, sizeof(ZEND_CALL_FUNC_NAME)-1))) { + if (fn_flags & ((ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC) ^ ZEND_ACC_PUBLIC)) { + zend_error(E_COMPILE_ERROR, "The magic method __call() must have public visibility and can not be static"); + } CG(active_class_entry)->__call = (zend_function *) CG(active_op_array); } else if ((name_len == sizeof(ZEND_CALLSTATIC_FUNC_NAME)-1) && (!memcmp(lcname, ZEND_CALLSTATIC_FUNC_NAME, sizeof(ZEND_CALLSTATIC_FUNC_NAME)-1))) { + if ((fn_flags & (ZEND_ACC_PPP_MASK ^ ZEND_ACC_PUBLIC)) || (fn_flags & ZEND_ACC_STATIC) == 0) { + zend_error(E_COMPILE_ERROR, "The magic method __callStatic() must have public visibility and be static"); + } CG(active_class_entry)->__callstatic = (zend_function *) CG(active_op_array); } else if ((name_len == sizeof(ZEND_GET_FUNC_NAME)-1) && (!memcmp(lcname, ZEND_GET_FUNC_NAME, sizeof(ZEND_GET_FUNC_NAME)-1))) { + if (fn_flags & ((ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC) ^ ZEND_ACC_PUBLIC)) { + zend_error(E_COMPILE_ERROR, "The magic method __get() must have public visibility and can not be static"); + } CG(active_class_entry)->__get = (zend_function *) CG(active_op_array); } else if ((name_len == sizeof(ZEND_SET_FUNC_NAME)-1) && (!memcmp(lcname, ZEND_SET_FUNC_NAME, sizeof(ZEND_SET_FUNC_NAME)-1))) { + if (fn_flags & ((ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC) ^ ZEND_ACC_PUBLIC)) { + zend_error(E_COMPILE_ERROR, "The magic method __set() must have public visibility and can not be static"); + } CG(active_class_entry)->__set = (zend_function *) CG(active_op_array); } else if ((name_len == sizeof(ZEND_UNSET_FUNC_NAME)-1) && (!memcmp(lcname, ZEND_UNSET_FUNC_NAME, sizeof(ZEND_UNSET_FUNC_NAME)-1))) { + if (fn_flags & ((ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC) ^ ZEND_ACC_PUBLIC)) { + zend_error(E_COMPILE_ERROR, "The magic method __unset() must have public visibility and can not be static"); + } CG(active_class_entry)->__unset = (zend_function *) CG(active_op_array); } else if ((name_len == sizeof(ZEND_ISSET_FUNC_NAME)-1) && (!memcmp(lcname, ZEND_ISSET_FUNC_NAME, sizeof(ZEND_ISSET_FUNC_NAME)-1))) { + if (fn_flags & ((ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC) ^ ZEND_ACC_PUBLIC)) { + zend_error(E_COMPILE_ERROR, "The magic method __isset() must have public visibility and can not be static"); + } CG(active_class_entry)->__isset = (zend_function *) CG(active_op_array); } else if ((name_len == sizeof(ZEND_TOSTRING_FUNC_NAME)-1) && (!memcmp(lcname, ZEND_TOSTRING_FUNC_NAME, sizeof(ZEND_TOSTRING_FUNC_NAME)-1))) { + if (fn_flags & ((ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC) ^ ZEND_ACC_PUBLIC)) { + zend_error(E_COMPILE_ERROR, "The magic method __toString() must have public visibility and can not be static"); + } CG(active_class_entry)->__tostring = (zend_function *) CG(active_op_array); } else if (!(fn_flags & ZEND_ACC_STATIC)) { CG(active_op_array)->fn_flags |= ZEND_ACC_ALLOW_STATIC; http://cvs.php.net/viewvc.cgi/php-src/tests/classes/__call_005.phpt?r1=1.1.4.2&r2=1.1.4.3&diff_format=u Index: php-src/tests/classes/__call_005.phpt diff -u php-src/tests/classes/__call_005.phpt:1.1.4.2 php-src/tests/classes/__call_005.phpt:1.1.4.3 --- php-src/tests/classes/__call_005.phpt:1.1.4.2 Thu Mar 6 11:02:37 2008 +++ php-src/tests/classes/__call_005.phpt Tue Jun 3 14:07:15 2008 @@ -22,15 +22,4 @@ $b->test(); ?> --EXPECTF-- -In A::__call(test1, array(1,a)) -object(B)#1 (0) { -} -In A::__call(test2, array(1,a)) -object(B)#1 (0) { -} -In A::__call(test3, array(1,a)) -object(B)#1 (0) { -} -In A::__call(test4, array(1,a)) -object(B)#1 (0) { -} \ No newline at end of file +Fatal error: The magic method __call() must have public visibility and can not be static in %s on line %d http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/magic_methods_001.phpt?view=markup&rev=1.1 Index: ZendEngine2/tests/magic_methods_001.phpt +++ ZendEngine2/tests/magic_methods_001.phpt --TEST-- Testing several magic methods --FILE-- <?php class foo { function __unset($a) { print "unset\n"; var_dump($a); } public function __call($a, $b) { print "call\n"; var_dump($a); } function __clone() { print "clone\n"; } static public function __callstatic($a, $b) { print "callstatic\n"; } public function __tostring() { return 'foo'; } } $a = new foo; $a->sdfdsa(); $a::test(); clone $a; var_dump((string)$a); unset($a->a); ?> --EXPECT-- call unicode(6) "sdfdsa" callstatic clone unicode(3) "foo" unset unicode(1) "a" http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/magic_methods_002.phpt?view=markup&rev=1.1 Index: ZendEngine2/tests/magic_methods_002.phpt +++ ZendEngine2/tests/magic_methods_002.phpt --TEST-- Testing __unset with private visibility --FILE-- <?php class foo { private function __unset($a) { print "unset\n"; } } ?> --EXPECTF-- Fatal error: The magic method __unset() must have public visibility and can not be static in %s on line %d http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/magic_methods_003.phpt?view=markup&rev=1.1 Index: ZendEngine2/tests/magic_methods_003.phpt +++ ZendEngine2/tests/magic_methods_003.phpt --TEST-- Testing __unset declaring as static --FILE-- <?php class foo { static function __unset($a) { print "unset\n"; } } ?> --EXPECTF-- Fatal error: The magic method __unset() must have public visibility and can not be static in %s on line %d http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/magic_methods_004.phpt?view=markup&rev=1.1 Index: ZendEngine2/tests/magic_methods_004.phpt +++ ZendEngine2/tests/magic_methods_004.phpt --TEST-- Testing __unset() with protected visibility --FILE-- <?php class foo { protected function __unset($a) { print "unset\n"; } } ?> --EXPECTF-- Fatal error: The magic method __unset() must have public visibility and can not be static in %s on line %d http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/magic_methods_005.phpt?view=markup&rev=1.1 Index: ZendEngine2/tests/magic_methods_005.phpt +++ ZendEngine2/tests/magic_methods_005.phpt --TEST-- Testing __call() declaration in interface with wrong modifier --FILE-- <?php interface a { static function __call($a, $b); } ?> --EXPECTF-- Fatal error: The magic method __call() must have public visibility and can not be static in %s on line %d http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/magic_methods_006.phpt?view=markup&rev=1.1 Index: ZendEngine2/tests/magic_methods_006.phpt +++ ZendEngine2/tests/magic_methods_006.phpt --TEST-- Testing __callstatic declaration in interface with missing the 'static' modifier --FILE-- <?php interface a { function __callstatic($a, $b); } ?> --EXPECTF-- Fatal error: The magic method __callStatic() must have public visibility and be static in %s on line %d http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/magic_methods_007.phpt?view=markup&rev=1.1 Index: ZendEngine2/tests/magic_methods_007.phpt +++ ZendEngine2/tests/magic_methods_007.phpt --TEST-- Testing __set() declaration in abstract class with wrong modifier --FILE-- <?php abstract class b { abstract protected function __set($a); } ?> --EXPECTF-- Fatal error: The magic method __set() must have public visibility and can not be static in %s on line %d http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/magic_methods_008.phpt?view=markup&rev=1.1 Index: ZendEngine2/tests/magic_methods_008.phpt +++ ZendEngine2/tests/magic_methods_008.phpt --TEST-- Testing __set implementation with wrong declaration --FILE-- <?php abstract class b { abstract function __set($a, $b); } class a extends b { private function __set($a, $b) { } } ?> --EXPECTF-- Fatal error: The magic method __set() must have public visibility and can not be static in %s on line %d http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/magic_methods_009.phpt?view=markup&rev=1.1 Index: ZendEngine2/tests/magic_methods_009.phpt +++ ZendEngine2/tests/magic_methods_009.phpt --TEST-- Testing __callstatic declaration with wrong modifier --FILE-- <?php class a { static protected function __callstatic($a, $b) { } } ?> --EXPECTF-- Fatal error: The magic method __callStatic() must have public visibility and be static in %s on line %d http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/magic_methods_010.phpt?view=markup&rev=1.1 Index: ZendEngine2/tests/magic_methods_010.phpt +++ ZendEngine2/tests/magic_methods_010.phpt --TEST-- Testing __toString() declaration with wrong modifier --FILE-- <?php class a { static protected function __toString($a, $b) { } } ?> --EXPECTF-- Fatal error: The magic method __toString() must have public visibility and can not be static in %s on line %d
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php