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