From 56d543c161ab6df9f52930881d96486865cd452a Mon Sep 17 00:00:00 2001 From: Marcus Boerger Date: Mon, 2 May 2005 16:18:02 +0000 Subject: [PATCH] - Extend API to support real existance test without the need to add any new functions or change any behavior --- Zend/zend_builtin_functions.c | 2 +- Zend/zend_object_handlers.c | 15 ++++++++++----- Zend/zend_object_handlers.h | 7 ++++++- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index d5604c447b..abd5996623 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -953,7 +953,7 @@ ZEND_FUNCTION(property_exists) RETURN_FALSE; case IS_OBJECT: - if (Z_OBJ_HANDLER_PP(object, has_property) && Z_OBJ_HANDLER_PP(object, has_property)(*object, *property, 0 TSRMLS_CC)) { + if (Z_OBJ_HANDLER_PP(object, has_property) && Z_OBJ_HANDLER_PP(object, has_property)(*object, *property, 2 TSRMLS_CC)) { RETURN_TRUE; } RETURN_FALSE; diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 91faa67cfa..dc9a1b9106 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -806,8 +806,7 @@ static int zend_std_compare_objects(zval *o1, zval *o2 TSRMLS_DC) return zend_compare_symbol_tables_i(zobj1->properties, zobj2->properties TSRMLS_CC); } - -static int zend_std_has_property(zval *object, zval *member, int check_empty TSRMLS_DC) +static int zend_std_has_property(zval *object, zval *member, int has_set_exists TSRMLS_DC) { zend_object *zobj; int result; @@ -833,10 +832,16 @@ static int zend_std_has_property(zval *object, zval *member, int check_empty TSR } if (zend_hash_find(zobj->properties, property_info->name, property_info->name_length+1, (void **) &value) == SUCCESS) { - if (check_empty) { - result = zend_is_true(*value); - } else { + switch (has_set_exists) { + case 0: result = (Z_TYPE_PP(value) != IS_NULL); + break; + default: + result = zend_is_true(*value); + break; + case 2: + result = 1; + break; } } else { result = 0; diff --git a/Zend/zend_object_handlers.h b/Zend/zend_object_handlers.h index 5284ba2efd..106e404144 100644 --- a/Zend/zend_object_handlers.h +++ b/Zend/zend_object_handlers.h @@ -61,7 +61,12 @@ typedef void (*zend_object_set_t)(zval **property, zval *value TSRMLS_DC); typedef zval* (*zend_object_get_t)(zval *property TSRMLS_DC); /* Used to check if a property of the object exists */ -typedef int (*zend_object_has_property_t)(zval *object, zval *member, int check_empty TSRMLS_DC); +/* param has_set_exists: + * 0 (has) whetehr property exists and is not NULL + * 1 (set) whether property exists and is true + * 2 (exists) whether property exists + */ +typedef int (*zend_object_has_property_t)(zval *object, zval *member, int has_set_exists TSRMLS_DC); /* Used to check if a dimension of the object exists */ typedef int (*zend_object_has_dimension_t)(zval *object, zval *member, int check_empty TSRMLS_DC); -- 2.50.1