cataphract                               Sat, 10 Mar 2012 17:19:39 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=324082

Log:
- Fixed bug #61326 (ArrayObject comparison).

Bug: https://bugs.php.net/61326 (Assigned) ArrayObject comparison
      
Changed paths:
    U   php/php-src/branches/PHP_5_3/NEWS
    U   php/php-src/branches/PHP_5_3/ext/spl/spl_array.c
    A   php/php-src/branches/PHP_5_3/ext/spl/tests/bug61326.phpt
    U   php/php-src/branches/PHP_5_4/ext/spl/spl_array.c
    A   php/php-src/branches/PHP_5_4/ext/spl/tests/bug61326.phpt
    U   php/php-src/trunk/ext/spl/spl_array.c
    A   php/php-src/trunk/ext/spl/tests/bug61326.phpt

Modified: php/php-src/branches/PHP_5_3/NEWS
===================================================================
--- php/php-src/branches/PHP_5_3/NEWS	2012-03-10 16:24:37 UTC (rev 324081)
+++ php/php-src/branches/PHP_5_3/NEWS	2012-03-10 17:19:39 UTC (rev 324082)
@@ -47,6 +47,9 @@
   . Fixed bug #61267 (pdo_pgsql's PDO::exec() returns the number of SELECTed
     rows on postgresql >= 9). (ben dot pineau at gmail dot com)

+- PDO_Sqlite extension:
+  . Add createCollation support. (Damien)
+
 - Phar:
   . Fixed bug #61184 (Phar::webPhar() generates headers with trailing NUL
     bytes). (Nikic)
@@ -60,13 +63,13 @@
     chunksize length line is > 10 bytes). (Ilia)
   . Fixed bug #60887 (SoapClient ignores user_agent option and sends no
     User-Agent header). (carloschilazo at gmail dot com)
-
+
+- SPL
+  . Fixed bug #61326 (ArrayObject comparison). (Gustavo)
+
 - SQLite3 extension:
   . Add createCollation() method. (Brad Dewar)

-- PDO_Sqlite extension:
-  . Add createCollation support. (Damien)
-
 - Reflection:
   . Fixed bug #60968 (Late static binding doesn't work with
     ReflectionMethod::invokeArgs()). (Laruence)

Modified: php/php-src/branches/PHP_5_3/ext/spl/spl_array.c
===================================================================
--- php/php-src/branches/PHP_5_3/ext/spl/spl_array.c	2012-03-10 16:24:37 UTC (rev 324081)
+++ php/php-src/branches/PHP_5_3/ext/spl/spl_array.c	2012-03-10 17:19:39 UTC (rev 324082)
@@ -836,6 +836,30 @@
 	std_object_handlers.unset_property(object, member TSRMLS_CC);
 } /* }}} */

+static int spl_array_compare_objects(zval *o1, zval *o2 TSRMLS_DC) /* {{{ */
+{
+	HashTable			*ht1,
+						*ht2;
+	spl_array_object	*intern1,
+						*intern2;
+	int					result	= 0;
+	zval				temp_zv;
+
+	intern1	= (spl_array_object*)zend_object_store_get_object(o1 TSRMLS_CC);
+	intern2	= (spl_array_object*)zend_object_store_get_object(o2 TSRMLS_CC);
+	ht1		= spl_array_get_hash_table(intern1, 0 TSRMLS_CC);
+	ht2		= spl_array_get_hash_table(intern2, 0 TSRMLS_CC);
+
+	zend_compare_symbol_tables(&temp_zv, ht1, ht2 TSRMLS_CC);
+	result = (int)Z_LVAL(temp_zv);
+	/* if we just compared std.properties, don't do it again */
+	if (result == 0 &&
+			!(ht1 == intern1->std.properties && ht2 == intern2->std.properties)) {
+		result = std_object_handlers.compare_objects(o1, o2 TSRMLS_CC);
+	}
+	return result;
+} /* }}} */
+
 static int spl_array_skip_protected(spl_array_object *intern, HashTable *aht TSRMLS_DC) /* {{{ */
 {
 	char *string_key;
@@ -2003,6 +2027,8 @@
 	spl_handler_ArrayObject.has_property = spl_array_has_property;
 	spl_handler_ArrayObject.unset_property = spl_array_unset_property;

+	spl_handler_ArrayObject.compare_objects = spl_array_compare_objects;
+
 	REGISTER_SPL_STD_CLASS_EX(ArrayIterator, spl_array_object_new, spl_funcs_ArrayIterator);
 	REGISTER_SPL_IMPLEMENTS(ArrayIterator, Iterator);
 	REGISTER_SPL_IMPLEMENTS(ArrayIterator, ArrayAccess);

Added: php/php-src/branches/PHP_5_3/ext/spl/tests/bug61326.phpt
===================================================================
--- php/php-src/branches/PHP_5_3/ext/spl/tests/bug61326.phpt	                        (rev 0)
+++ php/php-src/branches/PHP_5_3/ext/spl/tests/bug61326.phpt	2012-03-10 17:19:39 UTC (rev 324082)
@@ -0,0 +1,17 @@
+--TEST--
+Bug #61326: ArrayObject comparison
+--FILE--
+<?php
+$aobj1 = new ArrayObject(array(0));
+$aobj2 = new ArrayObject(array(1));
+var_dump($aobj1 == $aobj2);
+
+$aobj3 = new ArrayObject(array(0));
+var_dump($aobj1 == $aobj3);
+
+$aobj3->foo = 'bar';
+var_dump($aobj1 == $aobj3);
+--EXPECT--
+bool(false)
+bool(true)
+bool(false)


Property changes on: php/php-src/branches/PHP_5_3/ext/spl/tests/bug61326.phpt
___________________________________________________________________
Added: svn:keywords
   + Id Rev Revision
Added: svn:eol-style
   + native

Modified: php/php-src/branches/PHP_5_4/ext/spl/spl_array.c
===================================================================
--- php/php-src/branches/PHP_5_4/ext/spl/spl_array.c	2012-03-10 16:24:37 UTC (rev 324081)
+++ php/php-src/branches/PHP_5_4/ext/spl/spl_array.c	2012-03-10 17:19:39 UTC (rev 324082)
@@ -862,6 +862,30 @@
 	std_object_handlers.unset_property(object, member, key TSRMLS_CC);
 } /* }}} */

+static int spl_array_compare_objects(zval *o1, zval *o2 TSRMLS_DC) /* {{{ */
+{
+	HashTable			*ht1,
+						*ht2;
+	spl_array_object	*intern1,
+						*intern2;
+	int					result	= 0;
+	zval				temp_zv;
+
+	intern1	= (spl_array_object*)zend_object_store_get_object(o1 TSRMLS_CC);
+	intern2	= (spl_array_object*)zend_object_store_get_object(o2 TSRMLS_CC);
+	ht1		= spl_array_get_hash_table(intern1, 0 TSRMLS_CC);
+	ht2		= spl_array_get_hash_table(intern2, 0 TSRMLS_CC);
+
+	zend_compare_symbol_tables(&temp_zv, ht1, ht2 TSRMLS_CC);
+	result = (int)Z_LVAL(temp_zv);
+	/* if we just compared std.properties, don't do it again */
+	if (result == 0 &&
+			!(ht1 == intern1->std.properties && ht2 == intern2->std.properties)) {
+		result = std_object_handlers.compare_objects(o1, o2 TSRMLS_CC);
+	}
+	return result;
+} /* }}} */
+
 static int spl_array_skip_protected(spl_array_object *intern, HashTable *aht TSRMLS_DC) /* {{{ */
 {
 	char *string_key;
@@ -1939,6 +1963,8 @@
 	spl_handler_ArrayObject.has_property = spl_array_has_property;
 	spl_handler_ArrayObject.unset_property = spl_array_unset_property;

+	spl_handler_ArrayObject.compare_objects = spl_array_compare_objects;
+
 	REGISTER_SPL_STD_CLASS_EX(ArrayIterator, spl_array_object_new, spl_funcs_ArrayIterator);
 	REGISTER_SPL_IMPLEMENTS(ArrayIterator, Iterator);
 	REGISTER_SPL_IMPLEMENTS(ArrayIterator, ArrayAccess);

Added: php/php-src/branches/PHP_5_4/ext/spl/tests/bug61326.phpt
===================================================================
--- php/php-src/branches/PHP_5_4/ext/spl/tests/bug61326.phpt	                        (rev 0)
+++ php/php-src/branches/PHP_5_4/ext/spl/tests/bug61326.phpt	2012-03-10 17:19:39 UTC (rev 324082)
@@ -0,0 +1,17 @@
+--TEST--
+Bug #61326: ArrayObject comparison
+--FILE--
+<?php
+$aobj1 = new ArrayObject(array(0));
+$aobj2 = new ArrayObject(array(1));
+var_dump($aobj1 == $aobj2);
+
+$aobj3 = new ArrayObject(array(0));
+var_dump($aobj1 == $aobj3);
+
+$aobj3->foo = 'bar';
+var_dump($aobj1 == $aobj3);
+--EXPECT--
+bool(false)
+bool(true)
+bool(false)


Property changes on: php/php-src/branches/PHP_5_4/ext/spl/tests/bug61326.phpt
___________________________________________________________________
Added: svn:keywords
   + Id Rev Revision
Added: svn:eol-style
   + native

Modified: php/php-src/trunk/ext/spl/spl_array.c
===================================================================
--- php/php-src/trunk/ext/spl/spl_array.c	2012-03-10 16:24:37 UTC (rev 324081)
+++ php/php-src/trunk/ext/spl/spl_array.c	2012-03-10 17:19:39 UTC (rev 324082)
@@ -862,6 +862,30 @@
 	std_object_handlers.unset_property(object, member, key TSRMLS_CC);
 } /* }}} */

+static int spl_array_compare_objects(zval *o1, zval *o2 TSRMLS_DC) /* {{{ */
+{
+	HashTable			*ht1,
+						*ht2;
+	spl_array_object	*intern1,
+						*intern2;
+	int					result	= 0;
+	zval				temp_zv;
+
+	intern1	= (spl_array_object*)zend_object_store_get_object(o1 TSRMLS_CC);
+	intern2	= (spl_array_object*)zend_object_store_get_object(o2 TSRMLS_CC);
+	ht1		= spl_array_get_hash_table(intern1, 0 TSRMLS_CC);
+	ht2		= spl_array_get_hash_table(intern2, 0 TSRMLS_CC);
+
+	zend_compare_symbol_tables(&temp_zv, ht1, ht2 TSRMLS_CC);
+	result = (int)Z_LVAL(temp_zv);
+	/* if we just compared std.properties, don't do it again */
+	if (result == 0 &&
+			!(ht1 == intern1->std.properties && ht2 == intern2->std.properties)) {
+		result = std_object_handlers.compare_objects(o1, o2 TSRMLS_CC);
+	}
+	return result;
+} /* }}} */
+
 static int spl_array_skip_protected(spl_array_object *intern, HashTable *aht TSRMLS_DC) /* {{{ */
 {
 	char *string_key;
@@ -1939,6 +1963,8 @@
 	spl_handler_ArrayObject.has_property = spl_array_has_property;
 	spl_handler_ArrayObject.unset_property = spl_array_unset_property;

+	spl_handler_ArrayObject.compare_objects = spl_array_compare_objects;
+
 	REGISTER_SPL_STD_CLASS_EX(ArrayIterator, spl_array_object_new, spl_funcs_ArrayIterator);
 	REGISTER_SPL_IMPLEMENTS(ArrayIterator, Iterator);
 	REGISTER_SPL_IMPLEMENTS(ArrayIterator, ArrayAccess);

Added: php/php-src/trunk/ext/spl/tests/bug61326.phpt
===================================================================
--- php/php-src/trunk/ext/spl/tests/bug61326.phpt	                        (rev 0)
+++ php/php-src/trunk/ext/spl/tests/bug61326.phpt	2012-03-10 17:19:39 UTC (rev 324082)
@@ -0,0 +1,17 @@
+--TEST--
+Bug #61326: ArrayObject comparison
+--FILE--
+<?php
+$aobj1 = new ArrayObject(array(0));
+$aobj2 = new ArrayObject(array(1));
+var_dump($aobj1 == $aobj2);
+
+$aobj3 = new ArrayObject(array(0));
+var_dump($aobj1 == $aobj3);
+
+$aobj3->foo = 'bar';
+var_dump($aobj1 == $aobj3);
+--EXPECT--
+bool(false)
+bool(true)
+bool(false)


Property changes on: php/php-src/trunk/ext/spl/tests/bug61326.phpt
___________________________________________________________________
Added: svn:keywords
   + Id Rev Revision
Added: svn:eol-style
   + native
-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to