From: Arnaud Le Blanc Date: Fri, 22 May 2009 11:23:11 +0000 (+0000) Subject: MFH: Use zend_get_property_info() in get_class_vars() (fixes #46812) X-Git-Tag: php-5.2.10RC1~31 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=80f98df54ec2e3bf88fde6274dfc016f55d7e66a;p=php MFH: Use zend_get_property_info() in get_class_vars() (fixes #46812) --- diff --git a/Zend/tests/get_class_vars_003.phpt b/Zend/tests/get_class_vars_003.phpt index f9dab77c2f..d2c82bb593 100644 --- a/Zend/tests/get_class_vars_003.phpt +++ b/Zend/tests/get_class_vars_003.phpt @@ -33,7 +33,7 @@ new C; ?> --EXPECT-- -array(5) { +array(6) { ["aaa"]=> int(7) ["ccc"]=> @@ -42,6 +42,8 @@ array(5) { int(1) ["aa"]=> int(4) + ["bb"]=> + int(5) ["cc"]=> int(6) } diff --git a/Zend/tests/get_class_vars_006.phpt b/Zend/tests/get_class_vars_006.phpt index 73de66ba98..d1c2844aeb 100644 --- a/Zend/tests/get_class_vars_006.phpt +++ b/Zend/tests/get_class_vars_006.phpt @@ -44,5 +44,7 @@ array(1) { ["a"]=> int(1) } -array(0) { +array(1) { + ["a"]=> + int(1) } diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index 0dde8b1bc5..90e46a3544 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -706,27 +706,22 @@ static void add_class_vars(zend_class_entry *ce, HashTable *properties, zval *re while (zend_hash_get_current_data_ex(properties, (void **) &prop, &pos) == SUCCESS) { char *key, *class_name, *prop_name; uint key_len; - ulong num_index, h; + ulong num_index; int prop_name_len = 0; zval *prop_copy; zend_property_info *property_info; + zval zprop_name; zend_hash_get_current_key_ex(properties, &key, &key_len, &num_index, 0, &pos); zend_hash_move_forward_ex(properties, &pos); zend_unmangle_property_name(key, key_len-1, &class_name, &prop_name); prop_name_len = strlen(prop_name); - - h = zend_get_hash_value(prop_name, prop_name_len+1); - if (zend_hash_quick_find(&ce->properties_info, prop_name, prop_name_len+1, h, (void **) &property_info) == FAILURE) { - continue; - } - - if (property_info->flags & ZEND_ACC_SHADOW) { - continue; - } else if ((property_info->flags & ZEND_ACC_PRIVATE) && EG(scope) != ce) { - continue; - } else if ((property_info->flags & ZEND_ACC_PROTECTED) && zend_check_protected(ce, EG(scope)) == 0) { + + ZVAL_STRINGL(&zprop_name, prop_name, prop_name_len, 0); + property_info = zend_get_property_info(ce, &zprop_name, 1 TSRMLS_CC); + + if (!property_info || property_info == &EG(std_property_info)) { continue; }