felipe Tue Jun 3 13:55:47 2008 UTC Added files: /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: - Fixed bug #44769 (declaring private magic methods should throw error)
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_compile.c?r1=1.824&r2=1.825&diff_format=u Index: ZendEngine2/zend_compile.c diff -u ZendEngine2/zend_compile.c:1.824 ZendEngine2/zend_compile.c:1.825 --- ZendEngine2/zend_compile.c:1.824 Mon May 12 09:09:27 2008 +++ ZendEngine2/zend_compile.c Tue Jun 3 13:55:47 2008 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_compile.c,v 1.824 2008/05/12 09:09:27 dmitry Exp $ */ +/* $Id: zend_compile.c,v 1.825 2008/06/03 13:55:47 felipe Exp $ */ #include <zend_language_parser.h> #include "zend.h" @@ -1293,7 +1293,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 ((lcname_len == sizeof(ZEND_CALL_FUNC_NAME)-1) && (ZEND_U_EQUAL(Z_TYPE(function_name->u.constant), lcname, lcname_len, 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 ((lcname_len == sizeof(ZEND_CALLSTATIC_FUNC_NAME)-1) && (ZEND_U_EQUAL(Z_TYPE(function_name->u.constant), lcname, lcname_len, 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 ((lcname_len == sizeof(ZEND_GET_FUNC_NAME)-1) && (ZEND_U_EQUAL(Z_TYPE(function_name->u.constant), lcname, lcname_len, 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 ((lcname_len == sizeof(ZEND_SET_FUNC_NAME)-1) && (ZEND_U_EQUAL(Z_TYPE(function_name->u.constant), lcname, lcname_len, 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 ((lcname_len == sizeof(ZEND_UNSET_FUNC_NAME)-1) && (ZEND_U_EQUAL(Z_TYPE(function_name->u.constant), lcname, lcname_len, 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 ((lcname_len == sizeof(ZEND_ISSET_FUNC_NAME)-1) && (ZEND_U_EQUAL(Z_TYPE(function_name->u.constant), lcname, lcname_len, 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 ((lcname_len == sizeof(ZEND_TOSTRING_FUNC_NAME)-1) && (ZEND_U_EQUAL(Z_TYPE(function_name->u.constant), lcname, lcname_len, 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 { zstr short_class_name; unsigned int short_class_name_length; zstr short_class_lcname; @@ -1334,18 +1364,39 @@ } else if ((lcname_len == sizeof(ZEND_CLONE_FUNC_NAME)-1) && (ZEND_U_EQUAL(Z_TYPE(function_name->u.constant), lcname, lcname_len, ZEND_CLONE_FUNC_NAME, sizeof(ZEND_CLONE_FUNC_NAME)-1))) { CG(active_class_entry)->clone = (zend_function *) CG(active_op_array); } else if ((lcname_len == sizeof(ZEND_CALL_FUNC_NAME)-1) && (ZEND_U_EQUAL(Z_TYPE(function_name->u.constant), lcname, lcname_len, 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 ((lcname_len == sizeof(ZEND_CALLSTATIC_FUNC_NAME)-1) && (ZEND_U_EQUAL(Z_TYPE(function_name->u.constant), lcname, lcname_len, 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 ((lcname_len == sizeof(ZEND_GET_FUNC_NAME)-1) && (ZEND_U_EQUAL(Z_TYPE(function_name->u.constant), lcname, lcname_len, 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 ((lcname_len == sizeof(ZEND_SET_FUNC_NAME)-1) && (ZEND_U_EQUAL(Z_TYPE(function_name->u.constant), lcname, lcname_len, 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 ((lcname_len == sizeof(ZEND_UNSET_FUNC_NAME)-1) && (ZEND_U_EQUAL(Z_TYPE(function_name->u.constant), lcname, lcname_len, 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 ((lcname_len == sizeof(ZEND_ISSET_FUNC_NAME)-1) && (ZEND_U_EQUAL(Z_TYPE(function_name->u.constant), lcname, lcname_len, 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 ((lcname_len == sizeof(ZEND_TOSTRING_FUNC_NAME)-1) && (ZEND_U_EQUAL(Z_TYPE(function_name->u.constant), lcname, lcname_len, 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.3&r2=1.4&diff_format=u Index: php-src/tests/classes/__call_005.phpt diff -u php-src/tests/classes/__call_005.phpt:1.3 php-src/tests/classes/__call_005.phpt:1.4 --- php-src/tests/classes/__call_005.phpt:1.3 Mon May 26 15:52:04 2008 +++ php-src/tests/classes/__call_005.phpt Tue Jun 3 13:55:47 2008 @@ -21,16 +21,5 @@ $b = new B(); $b->test(); ?> ---EXPECT-- -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) { -} +--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_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