colder          Wed Jan 14 15:51:54 2009 UTC

  Added files:                 
    /php-src/ext/spl/tests      observer_007.phpt 

  Modified files:              
    /php-src/ext/spl    spl_observer.c 
  Log:
  Fix #47045 (Correctly compare splobjectstorages with ==)
  
http://cvs.php.net/viewvc.cgi/php-src/ext/spl/spl_observer.c?r1=1.30&r2=1.31&diff_format=u
Index: php-src/ext/spl/spl_observer.c
diff -u php-src/ext/spl/spl_observer.c:1.30 php-src/ext/spl/spl_observer.c:1.31
--- php-src/ext/spl/spl_observer.c:1.30 Wed Dec 31 11:12:36 2008
+++ php-src/ext/spl/spl_observer.c      Wed Jan 14 15:51:54 2009
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: spl_observer.c,v 1.30 2008/12/31 11:12:36 sebastian Exp $ */
+/* $Id: spl_observer.c,v 1.31 2009/01/14 15:51:54 colder Exp $ */
 
 #ifdef HAVE_CONFIG_H
 # include "config.h"
@@ -169,6 +169,31 @@
 }
 /* }}} */
 
+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)
 {
@@ -911,7 +936,9 @@
 
        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);

http://cvs.php.net/viewvc.cgi/php-src/ext/spl/tests/observer_007.phpt?view=markup&rev=1.1
Index: php-src/ext/spl/tests/observer_007.phpt
+++ php-src/ext/spl/tests/observer_007.phpt
--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===



-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to