colder Mon, 01 Feb 2010 13:45:57 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=294304
Log: Fix #48667 (Implementing Iterator and IteratorAggregate is now restricted in both orders) Bug: http://bugs.php.net/48667 (Assigned) "could not implement" - NOT redefining functions Changed paths: U php/php-src/branches/PHP_5_2/NEWS A php/php-src/branches/PHP_5_2/Zend/tests/bug48667_1.phpt A php/php-src/branches/PHP_5_2/Zend/tests/bug48667_2.phpt U php/php-src/branches/PHP_5_2/Zend/zend_interfaces.c A php/php-src/branches/PHP_5_3/Zend/tests/bug48667_1.phpt A php/php-src/branches/PHP_5_3/Zend/tests/bug48667_2.phpt U php/php-src/branches/PHP_5_3/Zend/zend_interfaces.c A php/php-src/trunk/Zend/tests/bug48667_1.phpt A php/php-src/trunk/Zend/tests/bug48667_2.phpt U php/php-src/trunk/Zend/zend_interfaces.c
Modified: php/php-src/branches/PHP_5_2/NEWS =================================================================== --- php/php-src/branches/PHP_5_2/NEWS 2010-02-01 12:59:08 UTC (rev 294303) +++ php/php-src/branches/PHP_5_2/NEWS 2010-02-01 13:45:57 UTC (rev 294304) @@ -66,6 +66,7 @@ - Fixed bug #49851 (http wrapper breaks on 1024 char long headers). (Ilia) - Fixed bug #49600 (imageTTFText text shifted right). (Takeshi Abe) - Fixed bug #49463 (setAttributeNS fails setting default namespace). (Rob) +- Fixed bug #48667 (Implementing Iterator and IteratorAggregate). (Etienne) - Fixed bug #48590 (SoapClient does not honor max_redirects). (Sriram) - Fixed bug #48190 (Content-type parameter "boundary" is not case-insensitive in HTTP uploads). (Ilia) Added: php/php-src/branches/PHP_5_2/Zend/tests/bug48667_1.phpt =================================================================== --- php/php-src/branches/PHP_5_2/Zend/tests/bug48667_1.phpt (rev 0) +++ php/php-src/branches/PHP_5_2/Zend/tests/bug48667_1.phpt 2010-02-01 13:45:57 UTC (rev 294304) @@ -0,0 +1,10 @@ +--TEST-- +Bug #48667 (Implementing both iterator and iteratoraggregate) +--FILE-- +<?php + +abstract class A implements Iterator, IteratorAggregate { } + +?> +--EXPECTF-- +Fatal error: Class A cannot implement both IteratorAggregate and Iterator at the same time. in %s on line %d Added: php/php-src/branches/PHP_5_2/Zend/tests/bug48667_2.phpt =================================================================== --- php/php-src/branches/PHP_5_2/Zend/tests/bug48667_2.phpt (rev 0) +++ php/php-src/branches/PHP_5_2/Zend/tests/bug48667_2.phpt 2010-02-01 13:45:57 UTC (rev 294304) @@ -0,0 +1,10 @@ +--TEST-- +Bug #48667 (Implementing both iterator and iteratoraggregate) +--FILE-- +<?php + +abstract class A implements IteratorAggregate, Iterator { } + +?> +--EXPECTF-- +Fatal error: Class A cannot implement both Iterator and IteratorAggregate at the same time. in %s on line %d Modified: php/php-src/branches/PHP_5_2/Zend/zend_interfaces.c =================================================================== --- php/php-src/branches/PHP_5_2/Zend/zend_interfaces.c 2010-02-01 12:59:08 UTC (rev 294303) +++ php/php-src/branches/PHP_5_2/Zend/zend_interfaces.c 2010-02-01 13:45:57 UTC (rev 294304) @@ -344,6 +344,10 @@ if (class_type->num_interfaces) { for (i = 0; i < class_type->num_interfaces; i++) { if (class_type->interfaces[i] == zend_ce_iterator) { + zend_error(E_ERROR, "Class %s cannot implement both %s and %s at the same time.", + class_type->name, + interface->name, + zend_ce_iterator->name); return FAILURE; } if (class_type->interfaces[i] == zend_ce_traversable) { @@ -369,8 +373,14 @@ if (class_type->type == ZEND_INTERNAL_CLASS) { /* inheritance ensures the class has the necessary userland methods */ return SUCCESS; - } else if (class_type->get_iterator != zend_user_it_get_new_iterator) { + } else { /* c-level get_iterator cannot be changed */ + if (class_type->get_iterator == zend_user_it_get_new_iterator) { + zend_error(E_ERROR, "Class %s cannot implement both %s and %s at the same time.", + class_type->name, + interface->name, + zend_ce_aggregate->name); + } return FAILURE; } } Added: php/php-src/branches/PHP_5_3/Zend/tests/bug48667_1.phpt =================================================================== --- php/php-src/branches/PHP_5_3/Zend/tests/bug48667_1.phpt (rev 0) +++ php/php-src/branches/PHP_5_3/Zend/tests/bug48667_1.phpt 2010-02-01 13:45:57 UTC (rev 294304) @@ -0,0 +1,10 @@ +--TEST-- +Bug #48667 (Implementing both iterator and iteratoraggregate) +--FILE-- +<?php + +abstract class A implements Iterator, IteratorAggregate { } + +?> +--EXPECTF-- +Fatal error: Class A cannot implement both IteratorAggregate and Iterator at the same time. in %s on line %d Added: php/php-src/branches/PHP_5_3/Zend/tests/bug48667_2.phpt =================================================================== --- php/php-src/branches/PHP_5_3/Zend/tests/bug48667_2.phpt (rev 0) +++ php/php-src/branches/PHP_5_3/Zend/tests/bug48667_2.phpt 2010-02-01 13:45:57 UTC (rev 294304) @@ -0,0 +1,10 @@ +--TEST-- +Bug #48667 (Implementing both iterator and iteratoraggregate) +--FILE-- +<?php + +abstract class A implements IteratorAggregate, Iterator { } + +?> +--EXPECTF-- +Fatal error: Class A cannot implement both Iterator and IteratorAggregate at the same time. in %s on line %d Modified: php/php-src/branches/PHP_5_3/Zend/zend_interfaces.c =================================================================== --- php/php-src/branches/PHP_5_3/Zend/zend_interfaces.c 2010-02-01 12:59:08 UTC (rev 294303) +++ php/php-src/branches/PHP_5_3/Zend/zend_interfaces.c 2010-02-01 13:45:57 UTC (rev 294304) @@ -353,6 +353,10 @@ if (class_type->num_interfaces) { for (i = 0; i < class_type->num_interfaces; i++) { if (class_type->interfaces[i] == zend_ce_iterator) { + zend_error(E_ERROR, "Class %s cannot implement both %s and %s at the same time.", + class_type->name, + interface->name, + zend_ce_iterator->name); return FAILURE; } if (class_type->interfaces[i] == zend_ce_traversable) { @@ -378,8 +382,14 @@ if (class_type->type == ZEND_INTERNAL_CLASS) { /* inheritance ensures the class has the necessary userland methods */ return SUCCESS; - } else if (class_type->get_iterator != zend_user_it_get_new_iterator) { + } else { /* c-level get_iterator cannot be changed */ + if (class_type->get_iterator == zend_user_it_get_new_iterator) { + zend_error(E_ERROR, "Class %s cannot implement both %s and %s at the same time.", + class_type->name, + interface->name, + zend_ce_aggregate->name); + } return FAILURE; } } Added: php/php-src/trunk/Zend/tests/bug48667_1.phpt =================================================================== --- php/php-src/trunk/Zend/tests/bug48667_1.phpt (rev 0) +++ php/php-src/trunk/Zend/tests/bug48667_1.phpt 2010-02-01 13:45:57 UTC (rev 294304) @@ -0,0 +1,10 @@ +--TEST-- +Bug #48667 (Implementing both iterator and iteratoraggregate) +--FILE-- +<?php + +abstract class A implements Iterator, IteratorAggregate { } + +?> +--EXPECTF-- +Fatal error: Class A cannot implement both IteratorAggregate and Iterator at the same time. in %s on line %d Added: php/php-src/trunk/Zend/tests/bug48667_2.phpt =================================================================== --- php/php-src/trunk/Zend/tests/bug48667_2.phpt (rev 0) +++ php/php-src/trunk/Zend/tests/bug48667_2.phpt 2010-02-01 13:45:57 UTC (rev 294304) @@ -0,0 +1,10 @@ +--TEST-- +Bug #48667 (Implementing both iterator and iteratoraggregate) +--FILE-- +<?php + +abstract class A implements IteratorAggregate, Iterator { } + +?> +--EXPECTF-- +Fatal error: Class A cannot implement both Iterator and IteratorAggregate at the same time. in %s on line %d Modified: php/php-src/trunk/Zend/zend_interfaces.c =================================================================== --- php/php-src/trunk/Zend/zend_interfaces.c 2010-02-01 12:59:08 UTC (rev 294303) +++ php/php-src/trunk/Zend/zend_interfaces.c 2010-02-01 13:45:57 UTC (rev 294304) @@ -361,6 +361,10 @@ if (class_type->num_interfaces) { for (i = 0; i < class_type->num_interfaces; i++) { if (class_type->interfaces[i] == zend_ce_iterator) { + zend_error(E_ERROR, "Class %v cannot implement both %v and %v at the same time.", + class_type->name, + interface->name, + zend_ce_iterator->name); return FAILURE; } if (class_type->interfaces[i] == zend_ce_traversable) { @@ -386,8 +390,14 @@ if (class_type->type == ZEND_INTERNAL_CLASS) { /* inheritance ensures the class has the necessary userland methods */ return SUCCESS; - } else if (class_type->get_iterator != zend_user_it_get_new_iterator) { + } else { /* c-level get_iterator cannot be changed */ + if (class_type->get_iterator == zend_user_it_get_new_iterator) { + zend_error(E_ERROR, "Class %v cannot implement both %v and %v at the same time.", + class_type->name, + interface->name, + zend_ce_aggregate->name); + } return FAILURE; } }
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php