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

Reply via email to