cvs: ZendEngine2 / zend_builtin_functions.c /tests 011.phpt bug42211.phpt
"Felipe Pena" <[email protected]>
| Newsgroups | gmane.comp.php.cvs.zend |
|---|---|
| Message-ID | <cvsfelipe1219081214@cvsserver> |
felipe Mon Aug 18 17:40:14 2008 UTC
Modified files:
/ZendEngine2 zend_builtin_functions.c
/ZendEngine2/tests 011.phpt bug42211.phpt
Log:
- Fixed bug #45743 (property_exists fails to find static protected member in child class)
In general, now property_exists() behave like method_exists() (ie. independs of context/visibibility)
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_builtin_functions.c?r1=1.382&r2=1.383&diff_format=u
Index: ZendEngine2/zend_builtin_functions.c
diff -u ZendEngine2/zend_builtin_functions.c:1.382 ZendEngine2/zend_builtin_functions.c:1.383
--- ZendEngine2/zend_builtin_functions.c:1.382 Sun Aug 10 21:52:05 2008
+++ ZendEngine2/zend_builtin_functions.c Mon Aug 18 17:40:14 2008
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_builtin_functions.c,v 1.382 2008/08/10 21:52:05 helly Exp $ */
+/* $Id: zend_builtin_functions.c,v 1.383 2008/08/18 17:40:14 felipe Exp $ */
#include "zend.h"
#include "zend_API.h"
@@ -1214,8 +1214,8 @@
zend_uchar property_type;
zend_class_entry *ce, **pce;
zend_property_info *property_info;
- zstr prop_name, class_name;
zval property_z;
+ ulong h;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zt", &object, &property, &property_len, &property_type) == FAILURE) {
return;
@@ -1225,53 +1225,34 @@
RETURN_FALSE;
}
- ZVAL_ZSTRL(&property_z, property_type, property, property_len, 0);
-
- switch(Z_TYPE_P(object)) {
- case IS_STRING:
- case IS_UNICODE:
- if (!Z_UNILEN_P(object)) {
- RETURN_FALSE;
- }
- if (zend_u_lookup_class(Z_TYPE_P(object), Z_UNIVAL_P(object), Z_UNILEN_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 || Z_TYPE_P(object) == IS_UNICODE) {
+ if (zend_u_lookup_class(Z_TYPE_P(object), Z_UNIVAL_P(object), Z_UNILEN_P(object), &pce TSRMLS_CC) == FAILURE) {
RETURN_FALSE;
}
- if (property_info->flags & ZEND_ACC_PUBLIC) {
- RETURN_TRUE;
- }
- zend_u_unmangle_property_name(property_type, property_info->name, property_info->name_length, &class_name, &prop_name);
- if (class_name.s[0] == '*') {
- if (instanceof_function(EG(scope), ce TSRMLS_CC) ||
- (EG(This) && instanceof_function(Z_OBJCE_P(EG(This)), ce TSRMLS_CC))) {
- RETURN_TRUE;
- }
- RETURN_FALSE;
- }
- if (zend_u_lookup_class(Z_TYPE_P(object), Z_UNIVAL_P(object), Z_UNILEN_P(object), &pce TSRMLS_CC) == SUCCESS) {
- ce = *pce;
- } else {
- RETURN_FALSE; /* shouldn't happen */
- }
- RETURN_BOOL(EG(scope) == ce);
-
- 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;
-
- default:
+ 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_u_get_hash_value(property_type, property, property_len+1);
+ if (zend_u_hash_quick_find(&ce->properties_info, property_type, property, property_len+1, h, (void **) &property_info) == SUCCESS) {
+ if (property_info->flags & ZEND_ACC_SHADOW) {
+ RETURN_FALSE;
+ }
+ RETURN_TRUE;
+ }
+
+ ZVAL_ZSTRL(&property_z, property_type, property, property_len, 0);
+
+ 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;
}
/* }}} */
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/011.phpt?r1=1.3&r2=1.4&diff_format=u
Index: ZendEngine2/tests/011.phpt
diff -u ZendEngine2/tests/011.phpt:1.3 ZendEngine2/tests/011.phpt:1.4
--- ZendEngine2/tests/011.phpt:1.3 Sun Jul 27 17:37:07 2008
+++ ZendEngine2/tests/011.phpt Mon Aug 18 17:40:14 2008
@@ -59,16 +59,16 @@
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(false)
+bool(true)
bool(true)
Done
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/bug42211.phpt?r1=1.3&r2=1.4&diff_format=u
Index: ZendEngine2/tests/bug42211.phpt
diff -u ZendEngine2/tests/bug42211.phpt:1.3 ZendEngine2/tests/bug42211.phpt:1.4
--- ZendEngine2/tests/bug42211.phpt:1.3 Mon May 26 14:33:43 2008
+++ ZendEngine2/tests/bug42211.phpt Mon Aug 18 17:40:14 2008
@@ -22,8 +22,8 @@
$b->foo();
--EXPECT--
bool(true)
-bool(false)
-bool(false)
bool(true)
bool(true)
-bool(false)
+bool(true)
+bool(true)
+bool(true)
--
Zend Engine CVS Mailing List (http://cvs.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php