diff options
author | Felipe Pena <felipe@php.net> | 2008-08-18 17:44:02 +0000 |
---|---|---|
committer | Felipe Pena <felipe@php.net> | 2008-08-18 17:44:02 +0000 |
commit | 9c787d8c972b4927953e1f9a2eaccdaab103c252 (patch) | |
tree | 45b238c4d43cc2bf74ee979c21006d3f08bb7007 /Zend | |
parent | cfca5be40f9a67af214b7710edc1876c875e65a6 (diff) | |
download | php-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.phpt | 10 | ||||
-rw-r--r-- | Zend/tests/bug42211.phpt | 7 | ||||
-rw-r--r-- | Zend/zend_builtin_functions.c | 62 |
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; } /* }}} */ |