mirror of
https://github.com/php/php-src.git
synced 2024-11-24 18:34:21 +08:00
MFH: Fix #47045 (Correctly compare splobjectstorages with ==)
This commit is contained in:
parent
582b32c426
commit
cd63e52c0b
1
NEWS
1
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).
|
||||
|
@ -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);
|
||||
|
22
ext/spl/tests/observer_007.phpt
Normal file
22
ext/spl/tests/observer_007.phpt
Normal file
@ -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===
|
Loading…
Reference in New Issue
Block a user