felipe Thu, 03 Dec 2009 12:34:50 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=291642
Log: - Fixed bug #49472 (Constants defined in Interfaces can be overridden) Bug: http://bugs.php.net/49472 (Assigned) Constants defined in Interfaces can be overridden Changed paths: U php/php-src/branches/PHP_5_2/NEWS A php/php-src/branches/PHP_5_2/Zend/tests/bug49472.phpt U php/php-src/branches/PHP_5_2/Zend/tests/errmsg_025.phpt U php/php-src/branches/PHP_5_2/Zend/zend_compile.c U php/php-src/branches/PHP_5_3/NEWS A php/php-src/branches/PHP_5_3/Zend/tests/bug49472.phpt U php/php-src/branches/PHP_5_3/Zend/tests/errmsg_025.phpt U php/php-src/branches/PHP_5_3/Zend/tests/inter_01.phpt U php/php-src/branches/PHP_5_3/Zend/zend_compile.c A php/php-src/trunk/Zend/tests/bug49472.phpt U php/php-src/trunk/Zend/tests/errmsg_025.phpt U php/php-src/trunk/Zend/tests/inter_01.phpt U php/php-src/trunk/Zend/zend_compile.c
Modified: php/php-src/branches/PHP_5_2/NEWS =================================================================== --- php/php-src/branches/PHP_5_2/NEWS 2009-12-03 12:11:38 UTC (rev 291641) +++ php/php-src/branches/PHP_5_2/NEWS 2009-12-03 12:34:50 UTC (rev 291642) @@ -12,6 +12,8 @@ - Fixed bug #50168 (FastCGI fails with wrong error on HEAD request to non-existent file). (Dmitry) - Fixed bug #49660 (libxml 2.7.3+ limits text nodes to 10MB). (Felipe) +- Fixed bug #49472 (Constants defined in Interfaces can be overridden). + (Felipe) 27 Nov 2009, PHP 5.2.12RC3 Added: php/php-src/branches/PHP_5_2/Zend/tests/bug49472.phpt =================================================================== --- php/php-src/branches/PHP_5_2/Zend/tests/bug49472.phpt (rev 0) +++ php/php-src/branches/PHP_5_2/Zend/tests/bug49472.phpt 2009-12-03 12:34:50 UTC (rev 291642) @@ -0,0 +1,27 @@ +--TEST-- +Bug #49472 (Constants defined in Interfaces can be overridden) +--FILE-- +<?php + +interface ia { + const c = 'Sea'; + const y = 2; +} + +class Foo implements ia { +} + +class FooBar extends Foo implements ia { + const x = 1; + const c = 'Ocean'; + + public function show() { + return ia::c; + } +} + +new FooBar; + +?> +--EXPECTF-- +Fatal error: Cannot inherit previously-inherited or override constant c from interface ia in %s on line %d Property changes on: php/php-src/branches/PHP_5_2/Zend/tests/bug49472.phpt ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Added: svn:eol-style + native Modified: php/php-src/branches/PHP_5_2/Zend/tests/errmsg_025.phpt =================================================================== --- php/php-src/branches/PHP_5_2/Zend/tests/errmsg_025.phpt 2009-12-03 12:11:38 UTC (rev 291641) +++ php/php-src/branches/PHP_5_2/Zend/tests/errmsg_025.phpt 2009-12-03 12:34:50 UTC (rev 291642) @@ -16,5 +16,5 @@ echo "Done\n"; ?> ---EXPECTF-- -Fatal error: Cannot inherit previously-inherited constant FOO from interface test2 in %s on line %d +--EXPECTF-- +Fatal error: Cannot inherit previously-inherited or override constant FOO from interface test2 in %s on line %d Modified: php/php-src/branches/PHP_5_2/Zend/zend_compile.c =================================================================== --- php/php-src/branches/PHP_5_2/Zend/zend_compile.c 2009-12-03 12:11:38 UTC (rev 291641) +++ php/php-src/branches/PHP_5_2/Zend/zend_compile.c 2009-12-03 12:34:50 UTC (rev 291642) @@ -2333,21 +2333,29 @@ } } - static zend_bool do_inherit_constant_check(HashTable *child_constants_table, zval **parent_constant, zend_hash_key *hash_key, zend_class_entry *iface) { zval **old_constant; if (zend_hash_quick_find(child_constants_table, hash_key->arKey, hash_key->nKeyLength, hash_key->h, (void**)&old_constant) == SUCCESS) { - if (*old_constant != *parent_constant) { - zend_error(E_COMPILE_ERROR, "Cannot inherit previously-inherited constant %s from interface %s", hash_key->arKey, iface->name); + if (*old_constant != *parent_constant) { + zend_error(E_COMPILE_ERROR, "Cannot inherit previously-inherited or override constant %s from interface %s", hash_key->arKey, iface->name); } return 0; } return 1; } +static int do_interface_constant_check(zval **val, int num_args, va_list args, zend_hash_key *key) /* {{{ */ +{ + zend_class_entry **iface = va_arg(args, zend_class_entry**); + do_inherit_constant_check(&(*iface)->constants_table, val, key, *iface); + + return ZEND_HASH_APPLY_KEEP; +} +/* }}} */ + ZEND_API void zend_do_implement_interface(zend_class_entry *ce, zend_class_entry *iface TSRMLS_DC) { zend_uint i, ignore = 0; @@ -2366,7 +2374,10 @@ } } } - if (!ignore) { + if (ignore) { + /* Check for attempt to redeclare interface constants */ + zend_hash_apply_with_arguments(&ce->constants_table, (apply_func_args_t) do_interface_constant_check, 1, &iface); + } else { if (ce->num_interfaces >= current_iface_num) { if (ce->type == ZEND_INTERNAL_CLASS) { ce->interfaces = (zend_class_entry **) realloc(ce->interfaces, sizeof(zend_class_entry *) * (++current_iface_num)); Modified: php/php-src/branches/PHP_5_3/NEWS =================================================================== --- php/php-src/branches/PHP_5_3/NEWS 2009-12-03 12:11:38 UTC (rev 291641) +++ php/php-src/branches/PHP_5_3/NEWS 2009-12-03 12:34:50 UTC (rev 291642) @@ -92,6 +92,8 @@ - Fixed bug #49647 (DOMUserData does not exist). (Rob) - Fixed bug #49521 (PDO fetchObject sets values before calling constructor). (Pierrick) +- Fixed bug #49472 (Constants defined in Interfaces can be overridden). + (Felipe) - Fixed bug #49244 (Floating point NaN cause garbage characters). (Sjoerd) - Fixed bug #49224 (Compile error due to old DNS functions on AIX systems). (Scott) Added: php/php-src/branches/PHP_5_3/Zend/tests/bug49472.phpt =================================================================== --- php/php-src/branches/PHP_5_3/Zend/tests/bug49472.phpt (rev 0) +++ php/php-src/branches/PHP_5_3/Zend/tests/bug49472.phpt 2009-12-03 12:34:50 UTC (rev 291642) @@ -0,0 +1,27 @@ +--TEST-- +Bug #49472 (Constants defined in Interfaces can be overridden) +--FILE-- +<?php + +interface ia { + const c = 'Sea'; + const y = 2; +} + +class Foo implements ia { +} + +class FooBar extends Foo implements ia { + const x = 1; + const c = 'Ocean'; + + public function show() { + return ia::c; + } +} + +new FooBar; + +?> +--EXPECTF-- +Fatal error: Cannot inherit previously-inherited or override constant c from interface ia in %s on line %d Property changes on: php/php-src/branches/PHP_5_3/Zend/tests/bug49472.phpt ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Added: svn:eol-style + native Modified: php/php-src/branches/PHP_5_3/Zend/tests/errmsg_025.phpt =================================================================== --- php/php-src/branches/PHP_5_3/Zend/tests/errmsg_025.phpt 2009-12-03 12:11:38 UTC (rev 291641) +++ php/php-src/branches/PHP_5_3/Zend/tests/errmsg_025.phpt 2009-12-03 12:34:50 UTC (rev 291642) @@ -16,5 +16,5 @@ echo "Done\n"; ?> ---EXPECTF-- -Fatal error: Cannot inherit previously-inherited constant FOO from interface test2 in %s on line %d +--EXPECTF-- +Fatal error: Cannot inherit previously-inherited or override constant FOO from interface test2 in %s on line %d Modified: php/php-src/branches/PHP_5_3/Zend/tests/inter_01.phpt =================================================================== --- php/php-src/branches/PHP_5_3/Zend/tests/inter_01.phpt 2009-12-03 12:11:38 UTC (rev 291641) +++ php/php-src/branches/PHP_5_3/Zend/tests/inter_01.phpt 2009-12-03 12:34:50 UTC (rev 291642) @@ -15,4 +15,4 @@ } ?> --EXPECTF-- -Fatal error: Cannot inherit previously-inherited constant foo from interface foo in %s on line %d +Fatal error: Cannot inherit previously-inherited or override constant foo from interface foo in %s on line %d Modified: php/php-src/branches/PHP_5_3/Zend/zend_compile.c =================================================================== --- php/php-src/branches/PHP_5_3/Zend/zend_compile.c 2009-12-03 12:11:38 UTC (rev 291641) +++ php/php-src/branches/PHP_5_3/Zend/zend_compile.c 2009-12-03 12:34:50 UTC (rev 291642) @@ -2876,8 +2876,8 @@ zval **old_constant; if (zend_hash_quick_find(child_constants_table, hash_key->arKey, hash_key->nKeyLength, hash_key->h, (void**)&old_constant) == SUCCESS) { - if (*old_constant != *parent_constant) { - zend_error(E_COMPILE_ERROR, "Cannot inherit previously-inherited constant %s from interface %s", hash_key->arKey, iface->name); + if (*old_constant != *parent_constant) { + zend_error(E_COMPILE_ERROR, "Cannot inherit previously-inherited or override constant %s from interface %s", hash_key->arKey, iface->name); } return 0; } @@ -2885,6 +2885,16 @@ } /* }}} */ +static int do_interface_constant_check(zval **val TSRMLS_DC, int num_args, va_list args, const zend_hash_key *key) /* {{{ */ +{ + zend_class_entry **iface = va_arg(args, zend_class_entry**); + + do_inherit_constant_check(&(*iface)->constants_table, (const zval **) val, key, *iface); + + return ZEND_HASH_APPLY_KEEP; +} +/* }}} */ + ZEND_API void zend_do_implement_interface(zend_class_entry *ce, zend_class_entry *iface TSRMLS_DC) /* {{{ */ { zend_uint i, ignore = 0; @@ -2903,7 +2913,10 @@ } } } - if (!ignore) { + if (ignore) { + /* Check for attempt to redeclare interface constants */ + zend_hash_apply_with_arguments(&ce->constants_table TSRMLS_CC, (apply_func_args_t) do_interface_constant_check, 1, &iface); + } else { if (ce->num_interfaces >= current_iface_num) { if (ce->type == ZEND_INTERNAL_CLASS) { ce->interfaces = (zend_class_entry **) realloc(ce->interfaces, sizeof(zend_class_entry *) * (++current_iface_num)); Added: php/php-src/trunk/Zend/tests/bug49472.phpt =================================================================== --- php/php-src/trunk/Zend/tests/bug49472.phpt (rev 0) +++ php/php-src/trunk/Zend/tests/bug49472.phpt 2009-12-03 12:34:50 UTC (rev 291642) @@ -0,0 +1,27 @@ +--TEST-- +Bug #49472 (Constants defined in Interfaces can be overridden) +--FILE-- +<?php + +interface ia { + const c = 'Sea'; + const y = 2; +} + +class Foo implements ia { +} + +class FooBar extends Foo implements ia { + const x = 1; + const c = 'Ocean'; + + public function show() { + return ia::c; + } +} + +new FooBar; + +?> +--EXPECTF-- +Fatal error: Cannot inherit previously-inherited or override constant c from interface ia in %s on line %d Property changes on: php/php-src/trunk/Zend/tests/bug49472.phpt ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Added: svn:eol-style + native Modified: php/php-src/trunk/Zend/tests/errmsg_025.phpt =================================================================== --- php/php-src/trunk/Zend/tests/errmsg_025.phpt 2009-12-03 12:11:38 UTC (rev 291641) +++ php/php-src/trunk/Zend/tests/errmsg_025.phpt 2009-12-03 12:34:50 UTC (rev 291642) @@ -17,4 +17,4 @@ echo "Done\n"; ?> --EXPECTF-- -Fatal error: Cannot inherit previously-inherited constant FOO from interface test2 in %s on line %d +Fatal error: Cannot inherit previously-inherited or override constant FOO from interface test2 in %s on line %d Modified: php/php-src/trunk/Zend/tests/inter_01.phpt =================================================================== --- php/php-src/trunk/Zend/tests/inter_01.phpt 2009-12-03 12:11:38 UTC (rev 291641) +++ php/php-src/trunk/Zend/tests/inter_01.phpt 2009-12-03 12:34:50 UTC (rev 291642) @@ -15,4 +15,4 @@ } ?> --EXPECTF-- -Fatal error: Cannot inherit previously-inherited constant foo from interface foo in %s on line %d +Fatal error: Cannot inherit previously-inherited or override constant foo from interface foo in %s on line %d Modified: php/php-src/trunk/Zend/zend_compile.c =================================================================== --- php/php-src/trunk/Zend/zend_compile.c 2009-12-03 12:11:38 UTC (rev 291641) +++ php/php-src/trunk/Zend/zend_compile.c 2009-12-03 12:34:50 UTC (rev 291642) @@ -2938,7 +2938,7 @@ if (zend_u_hash_quick_find(child_constants_table, hash_key->type, hash_key->arKey, hash_key->nKeyLength, hash_key->h, (void**)&old_constant) == SUCCESS) { if (*old_constant != *parent_constant) { - zend_error(E_COMPILE_ERROR, "Cannot inherit previously-inherited constant %R from interface %v", hash_key->type, hash_key->arKey, iface->name); + zend_error(E_COMPILE_ERROR, "Cannot inherit previously-inherited or override constant %R from interface %v", hash_key->type, hash_key->arKey, iface->name); } return 0; } @@ -2946,6 +2946,16 @@ } /* }}} */ +static int do_interface_constant_check(zval **val TSRMLS_DC, int num_args, va_list args, const zend_hash_key *key) /* {{{ */ +{ + zend_class_entry **iface = va_arg(args, zend_class_entry**); + + do_inherit_constant_check(&(*iface)->constants_table, (const zval **) val, key, *iface); + + return ZEND_HASH_APPLY_KEEP; +} +/* }}} */ + ZEND_API void zend_do_implement_interface(zend_class_entry *ce, zend_class_entry *iface TSRMLS_DC) /* {{{ */ { zend_uint i, ignore = 0; @@ -2964,7 +2974,10 @@ } } } - if (!ignore) { + if (ignore) { + /* Check for attempt to redeclare interface constants */ + zend_hash_apply_with_arguments(&ce->constants_table TSRMLS_CC, (apply_func_args_t) do_interface_constant_check, 1, &iface); + } else { if (ce->num_interfaces >= current_iface_num) { if (ce->type == ZEND_INTERNAL_CLASS) { ce->interfaces = (zend_class_entry **) realloc(ce->interfaces, sizeof(zend_class_entry *) * (++current_iface_num));
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php