summaryrefslogtreecommitdiff
path: root/Zend/zend_object_handlers.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_object_handlers.c')
-rw-r--r--Zend/zend_object_handlers.c44
1 files changed, 20 insertions, 24 deletions
diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c
index a11664ff0e..f1412ef0d2 100644
--- a/Zend/zend_object_handlers.c
+++ b/Zend/zend_object_handlers.c
@@ -44,18 +44,6 @@
#define IN_UNSET (1<<2)
#define IN_ISSET (1<<3)
-#define Z_OBJ_PROTECT_RECURSION(zval_p) \
- do { \
- if (Z_OBJ_APPLY_COUNT_P(zval_p) >= 3) { \
- zend_error_noreturn(E_ERROR, "Nesting level too deep - recursive dependency?"); \
- } \
- Z_OBJ_INC_APPLY_COUNT_P(zval_p); \
- } while (0)
-
-
-#define Z_OBJ_UNPROTECT_RECURSION(zval_p) \
- Z_OBJ_DEC_APPLY_COUNT_P(zval_p)
-
/*
__X accessors explanation:
@@ -1444,6 +1432,9 @@ static int zend_std_compare_objects(zval *o1, zval *o2) /* {{{ */
zobj1 = Z_OBJ_P(o1);
zobj2 = Z_OBJ_P(o2);
+ if (zobj1 == zobj2) {
+ return 0; /* the same object */
+ }
if (zobj1->ce != zobj2->ce) {
return 1; /* different classes */
}
@@ -1456,40 +1447,45 @@ static int zend_std_compare_objects(zval *o1, zval *o2) /* {{{ */
p1 = zobj1->properties_table;
p2 = zobj2->properties_table;
end = p1 + zobj1->ce->default_properties_count;
- Z_OBJ_PROTECT_RECURSION(o1);
- Z_OBJ_PROTECT_RECURSION(o2);
+
+ /* use bitwise OR to make only one conditional jump */
+ if (UNEXPECTED(Z_IS_RECURSIVE_P(o1) | Z_IS_RECURSIVE_P(o2))) {
+ zend_error_noreturn(E_ERROR, "Nesting level too deep - recursive dependency?");
+ }
+ Z_PROTECT_RECURSION_P(o1);
+ Z_PROTECT_RECURSION_P(o2);
do {
if (Z_TYPE_P(p1) != IS_UNDEF) {
if (Z_TYPE_P(p2) != IS_UNDEF) {
zval result;
if (compare_function(&result, p1, p2)==FAILURE) {
- Z_OBJ_UNPROTECT_RECURSION(o1);
- Z_OBJ_UNPROTECT_RECURSION(o2);
+ Z_UNPROTECT_RECURSION_P(o1);
+ Z_UNPROTECT_RECURSION_P(o2);
return 1;
}
if (Z_LVAL(result) != 0) {
- Z_OBJ_UNPROTECT_RECURSION(o1);
- Z_OBJ_UNPROTECT_RECURSION(o2);
+ Z_UNPROTECT_RECURSION_P(o1);
+ Z_UNPROTECT_RECURSION_P(o2);
return Z_LVAL(result);
}
} else {
- Z_OBJ_UNPROTECT_RECURSION(o1);
- Z_OBJ_UNPROTECT_RECURSION(o2);
+ Z_UNPROTECT_RECURSION_P(o1);
+ Z_UNPROTECT_RECURSION_P(o2);
return 1;
}
} else {
if (Z_TYPE_P(p2) != IS_UNDEF) {
- Z_OBJ_UNPROTECT_RECURSION(o1);
- Z_OBJ_UNPROTECT_RECURSION(o2);
+ Z_UNPROTECT_RECURSION_P(o1);
+ Z_UNPROTECT_RECURSION_P(o2);
return 1;
}
}
p1++;
p2++;
} while (p1 != end);
- Z_OBJ_UNPROTECT_RECURSION(o1);
- Z_OBJ_UNPROTECT_RECURSION(o2);
+ Z_UNPROTECT_RECURSION_P(o1);
+ Z_UNPROTECT_RECURSION_P(o2);
return 0;
} else {
if (!zobj1->properties) {