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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.