summaryrefslogtreecommitdiff
path: root/Zend
diff options
context:
space:
mode:
authorFelipe Pena <felipe@php.net>2008-08-18 17:44:02 +0000
committerFelipe Pena <felipe@php.net>2008-08-18 17:44:02 +0000
commit9c787d8c972b4927953e1f9a2eaccdaab103c252 (patch)
tree45b238c4d43cc2bf74ee979c21006d3f08bb7007 /Zend
parentcfca5be40f9a67af214b7710edc1876c875e65a6 (diff)
downloadphp-git-9c787d8c972b4927953e1f9a2eaccdaab103c252.tar.gz
- MFH: Fixed bug #45743 (property_exists fails to find static protected member in child class)
Diffstat (limited to 'Zend')
-rw-r--r--Zend/tests/011.phpt10
-rw-r--r--Zend/tests/bug42211.phpt7
-rw-r--r--Zend/zend_builtin_functions.c62
3 files changed, 30 insertions, 49 deletions
diff --git a/Zend/tests/011.phpt b/Zend/tests/011.phpt
index 24bd8f460c..57c6214916 100644
--- a/Zend/tests/011.phpt
+++ b/Zend/tests/011.phpt
@@ -59,16 +59,16 @@ NULL
Warning: property_exists() expects exactly 2 parameters, 1 given in %s on line %d
NULL
bool(true)
-bool(false)
-bool(false)
+bool(true)
+bool(true)
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
bool(true)
-bool(false)
-bool(false)
+bool(true)
+bool(true)
bool(false)
bool(false)
@@ -84,6 +84,6 @@ bool(true)
bool(true)
bool(true)
bool(true)
-bool(false)
+bool(true)
bool(true)
Done
diff --git a/Zend/tests/bug42211.phpt b/Zend/tests/bug42211.phpt
index e9f2a1e212..c6ea10652a 100644
--- a/Zend/tests/bug42211.phpt
+++ b/Zend/tests/bug42211.phpt
@@ -22,9 +22,8 @@ $b = new B();
$b->foo();
--EXPECT--
bool(true)
-bool(false)
-bool(false)
bool(true)
bool(true)
-bool(false)
-
+bool(true)
+bool(true)
+bool(true)
diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c
index 48fb99f940..d7392fbe85 100644
--- a/Zend/zend_builtin_functions.c
+++ b/Zend/zend_builtin_functions.c
@@ -1215,8 +1215,8 @@ ZEND_FUNCTION(property_exists)
int property_len;
zend_class_entry *ce, **pce;
zend_property_info *property_info;
- char *prop_name, *class_name;
zval property_z;
+ ulong h;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zs", &object, &property, &property_len) == FAILURE) {
return;
@@ -1226,52 +1226,34 @@ ZEND_FUNCTION(property_exists)
RETURN_FALSE;
}
- ZVAL_STRINGL(&property_z, property, property_len, 0);
-
- switch(Z_TYPE_P(object)) {
- case IS_STRING:
- if (!Z_STRLEN_P(object)) {
- RETURN_FALSE;
- }
- if (zend_lookup_class(Z_STRVAL_P(object), Z_STRLEN_P(object), &pce TSRMLS_CC) == SUCCESS) {
- ce = *pce;
- } else {
- RETURN_FALSE;
- }
- if (!ce) {
- RETURN_NULL();
- }
- if (!(property_info = zend_get_property_info(ce, &property_z, 1 TSRMLS_CC)) || property_info == &EG(std_property_info)) {
+ if (Z_TYPE_P(object) == IS_STRING) {
+ if (zend_lookup_class(Z_STRVAL_P(object), Z_STRLEN_P(object), &pce TSRMLS_CC) == FAILURE) {
RETURN_FALSE;
}
- if (property_info->flags & ZEND_ACC_PUBLIC) {
- RETURN_TRUE;
- }
- zend_unmangle_property_name(property_info->name, property_info->name_length, &class_name, &prop_name);
- if (!strncmp(class_name, "*", 1)) {
- if (instanceof_function(EG(scope), ce TSRMLS_CC) ||
- (EG(This) && instanceof_function(Z_OBJCE_P(EG(This)), ce TSRMLS_CC))) {
- RETURN_TRUE;
- }
+ ce = *pce;
+ } else if (Z_TYPE_P(object) == IS_OBJECT) {
+ ce = Z_OBJCE_P(object);
+ } else {
+ zend_error(E_WARNING, "First parameter must either be an object or the name of an existing class");
+ RETURN_NULL();
+ }
+
+ h = zend_get_hash_value(property, property_len+1);
+ if (zend_hash_quick_find(&ce->properties_info, property, property_len+1, h, (void **) &property_info) == SUCCESS) {
+ if (property_info->flags & ZEND_ACC_SHADOW) {
RETURN_FALSE;
}
- if (zend_lookup_class(Z_STRVAL_P(object), Z_STRLEN_P(object), &pce TSRMLS_CC) == SUCCESS) {
- ce = *pce;
- } else {
- RETURN_FALSE; /* shouldn't happen */
- }
- RETURN_BOOL(EG(scope) == ce);
+ RETURN_TRUE;
+ }
- case IS_OBJECT:
- if (Z_OBJ_HANDLER_P(object, has_property) && Z_OBJ_HANDLER_P(object, has_property)(object, &property_z, 2 TSRMLS_CC)) {
- RETURN_TRUE;
- }
- RETURN_FALSE;
+ ZVAL_STRINGL(&property_z, property, property_len, 0);
- default:
- zend_error(E_WARNING, "First parameter must either be an object or the name of an existing class");
- RETURN_NULL();
+ if (Z_TYPE_P(object) == IS_OBJECT &&
+ Z_OBJ_HANDLER_P(object, has_property) &&
+ Z_OBJ_HANDLER_P(object, has_property)(object, &property_z, 2 TSRMLS_CC)) {
+ RETURN_TRUE;
}
+ RETURN_FALSE;
}
/* }}} */