]> granicus.if.org Git - php/commitdiff
MFH: Fix #47045 (Correctly compare splobjectstorages with ==)
authorEtienne Kneuss <colder@php.net>
Wed, 14 Jan 2009 15:53:03 +0000 (15:53 +0000)
committerEtienne Kneuss <colder@php.net>
Wed, 14 Jan 2009 15:53:03 +0000 (15:53 +0000)
NEWS
ext/spl/spl_observer.c
ext/spl/tests/observer_007.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 77a1a9b0a7767037e728be670016f543afcc83f9..3c5a8e3f2c46d87f3f0fc34f9381a547fe3b9cbf 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -41,6 +41,7 @@ PHP                                                                        NEWS
 - Fixed building of pdo_sqlite without sqlite3. (Scott)
 
 - Fixed bug #47050 (mysqli_poll() modifies improper variables). (Johannes)
+- Fixed bug #47045 (SplObjectStorage instances compared with ==). (Etienne)
 - Fixed bug #46979 (use with non-compound name *has* effect). (Dmitry)
 - Fixed bug #46957 (The tokenizer returns deprecated values). (Felipe)
 - Fixed bug #46944 (UTF-8 characters outside the BMP aren't encoded correctly).
index 0f60502b004725da4d5a07ea3f73705608094ac7..5b0eb71b69b98407d1636a79591d38fe4ffc95b1 100755 (executable)
@@ -169,6 +169,31 @@ static HashTable* spl_object_storage_debug_info(zval *obj, int *is_temp TSRMLS_D
 }
 /* }}} */
 
+static int spl_object_storage_compare_info(spl_SplObjectStorageElement *e1, spl_SplObjectStorageElement *e2 TSRMLS_DC) /* {{{ */
+{
+       zval result;
+
+       if (compare_function(&result, e1->inf, e2->inf TSRMLS_CC) == FAILURE) {
+               return 1;
+       }
+
+       return Z_LVAL(result);
+}
+/* }}} */
+
+static int spl_object_storage_compare_objects(zval *o1, zval *o2 TSRMLS_DC) /* {{{ */
+{
+       zend_object *zo1 = (zend_object *)zend_object_store_get_object(o1 TSRMLS_CC);
+       zend_object *zo2 = (zend_object *)zend_object_store_get_object(o2 TSRMLS_CC);
+
+       if (zo1->ce != spl_ce_SplObjectStorage || zo2->ce != spl_ce_SplObjectStorage) {
+               return 1;
+       }
+
+       return zend_hash_compare(&((spl_SplObjectStorage *)zo1)->storage, &((spl_SplObjectStorage *)zo2)->storage, (compare_func_t) spl_object_storage_compare_info, 0 TSRMLS_CC);
+}
+/* }}} */
+
 /* {{{ spl_array_object_new */
 static zend_object_value spl_SplObjectStorage_new(zend_class_entry *class_type TSRMLS_DC)
 {
@@ -910,7 +935,9 @@ PHP_MINIT_FUNCTION(spl_observer)
 
        REGISTER_SPL_STD_CLASS_EX(SplObjectStorage, spl_SplObjectStorage_new, spl_funcs_SplObjectStorage);
        memcpy(&spl_handler_SplObjectStorage, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
-       spl_handler_SplObjectStorage.get_debug_info = spl_object_storage_debug_info;
+
+       spl_handler_SplObjectStorage.get_debug_info  = spl_object_storage_debug_info;
+       spl_handler_SplObjectStorage.compare_objects = spl_object_storage_compare_objects;
 
        REGISTER_SPL_IMPLEMENTS(SplObjectStorage, Countable);
        REGISTER_SPL_IMPLEMENTS(SplObjectStorage, Iterator);
diff --git a/ext/spl/tests/observer_007.phpt b/ext/spl/tests/observer_007.phpt
new file mode 100644 (file)
index 0000000..e494f19
--- /dev/null
@@ -0,0 +1,22 @@
+--TEST--
+SPL: SplObjectStorage comapred with ==
+--FILE--
+<?php
+$a = new SplObjectStorage;
+$b = new SplObjectStorage;
+var_dump($a == $b);
+$b[$b] = 2;
+var_dump($a == $b);
+$a[$b] = 2;
+var_dump($a == $b);
+$a[$b] = 3;
+var_dump($a == $b);
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+===DONE===