summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2005-05-02 16:18:02 +0000
committerMarcus Boerger <helly@php.net>2005-05-02 16:18:02 +0000
commit56d543c161ab6df9f52930881d96486865cd452a (patch)
treee5c62bc117ff9bcd8619901a561a4f0fcff60ecd
parent138c5457ac35047c63be6608c35a4e2798c0bc12 (diff)
downloadphp-git-56d543c161ab6df9f52930881d96486865cd452a.tar.gz
- Extend API to support real existance test without the need to add any new
functions or change any behavior
-rw-r--r--Zend/zend_builtin_functions.c2
-rw-r--r--Zend/zend_object_handlers.c15
-rw-r--r--Zend/zend_object_handlers.h7
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);