Here's a patch for the ZE which shortcuts the recursive comparisions
if the object properties hash tables are at the same address (therefore,
the objects are the same object).
This should save a few cycles for non-recursive objects too.
Additionally, when comparing hash tables, this patch changes the
recursion protection to return indicating that the tables are not the
same rather than raising a fatal error. I'd feel happier if we could
control this behaviour via a flag, as it is not always the best thing
to do. (Perhaps we should only enable this when checking for identity for
objects?).
--Wez.
On 09/29/02, "Wez Furlong" <[EMAIL PROTECTED]> wrote:
> The code below produces:
>
> Fatal error: Nesting level too deep - recursive dependency?
> in test.php on line 24
>
> This is should not happen since the objects being compared are
> the same object, so there should be no need to recusively compare the
> objects.
> Additionally, I think the comparison should bail out (without a fatal
> error) when the objects are not the same and when a recursive dependency
> is found.
>
> IMHO, this is a critical problem that should be fixed for 4.3, since it
> prevents anyone from using OO with references in a reasonable way.
>
>
> <?php
> class A {
> var $b;
>
> function A()
> {
> $this->b =& new B($this);
> }
> }
>
> class B {
> var $a;
>
> function B(&$a)
> {
> $this->a =& $a;
> }
> }
>
> $one =& new A;
> $two =& $one;
>
> if ($one == $two) { // <-- fatal error here
> echo "Same object\n";
> } else {
> echo "not the same object\n";
> }
> ?>
>
> --
> Wez Furlong
> The Brain Room Ltd.
>
>
> --
> PHP Development Mailing List <http://www.php.net/>
> To unsubscribe, visit: http://www.php.net/unsub.php
Index: zend_operators.c
===================================================================
RCS file: /repository/Zend/zend_operators.c,v
retrieving revision 1.125
diff -u -r1.125 zend_operators.c
--- zend_operators.c 26 Sep 2002 18:39:28 -0000 1.125
+++ zend_operators.c 29 Sep 2002 11:34:19 -0000
@@ -1245,7 +1245,7 @@
if (Z_OBJCE_P(op1) != Z_OBJCE_P(op2)) {
result->value.lval = 0;
} else {
- if (zend_hash_compare(Z_OBJPROP_P(op1),
Z_OBJPROP_P(op2), (compare_func_t) hash_zval_identical_function, 1 TSRMLS_CC)==0) {
+ if (Z_OBJPROP_P(op1) == Z_OBJPROP_P(op2) ||
+zend_hash_compare(Z_OBJPROP_P(op1), Z_OBJPROP_P(op2), (compare_func_t)
+hash_zval_identical_function, 1 TSRMLS_CC)==0) {
result->value.lval = 1;
} else {
result->value.lval = 0;
@@ -1725,7 +1725,11 @@
ZEND_API void zend_compare_symbol_tables(zval *result, HashTable *ht1, HashTable *ht2
TSRMLS_DC)
{
result->type = IS_LONG;
- result->value.lval = zend_hash_compare(ht1, ht2, (compare_func_t)
hash_zval_compare_function, 0 TSRMLS_CC);
+ if (ht1 == ht2) {
+ result->value.lval = 0;
+ } else {
+ result->value.lval = zend_hash_compare(ht1, ht2, (compare_func_t)
+hash_zval_compare_function, 0 TSRMLS_CC);
+ }
}
--
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php