com php-src: Merge branch 'PHP-7.1': Zend/zend_builtin_func tions.c Zend/zend_hash.h
[email protected] (Nikita Popov)
| Newsgroups | php.cvs |
|---|---|
| Message-ID | <[email protected]> |
Commit: 795a4c1bb384a7e0d56705d43e95b9bfcc3265b5 Author: Nikita Popov <[email protected]> Thu, 2 Feb 2017 18:35:35 +0100 Parents: b2a4af7b58d2b06177fb4ea451056a8d9a28fbd0 e81f30ad1d003c5250b1025c963ed0a178d4c51a Branches: master Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=795a4c1bb384a7e0d56705d43e95b9bfcc3265b5 Log: Merge branch 'PHP-7.1' Changed paths: MM Zend/zend_builtin_functions.c MM Zend/zend_hash.h Diff: diff --cc Zend/zend_builtin_functions.c index 0f3e321,12f9f29..4ba9dc4 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@@ -1250,45 -1264,24 +1250,41 @@@ ZEND_FUNCTION(get_object_vars } else { array_init_size(return_value, zend_hash_num_elements(properties)); - ZEND_HASH_FOREACH_STR_KEY_VAL_IND(properties, key, value) { - if (key) { - if (zend_check_property_access(zobj, key) == SUCCESS) { - if (Z_ISREF_P(value) && Z_REFCOUNT_P(value) == 1) { - value = Z_REFVAL_P(value); - } - if (Z_REFCOUNTED_P(value)) { - Z_ADDREF_P(value); - } - if (ZSTR_VAL(key)[0] == 0) { - const char *prop_name, *class_name; - size_t prop_len; - zend_unmangle_property_name_ex(key, &class_name, &prop_name, &prop_len); - zend_hash_str_add_new(Z_ARRVAL_P(return_value), prop_name, prop_len, value); - } else { - zend_symbtable_add_new(Z_ARRVAL_P(return_value), key, value); - } + ZEND_HASH_FOREACH_KEY_VAL(properties, num_key, key, value) { + zend_bool unmangle = 0; + if (Z_TYPE_P(value) == IS_INDIRECT) { + value = Z_INDIRECT_P(value); + if (UNEXPECTED(Z_ISUNDEF_P(value))) { + continue; + } + + ZEND_ASSERT(key); + if (zend_check_property_access(zobj, key) == FAILURE) { + continue; } + unmangle = 1; + } + + if (Z_ISREF_P(value) && Z_REFCOUNT_P(value) == 1) { + value = Z_REFVAL_P(value); + } + Z_TRY_ADDREF_P(value); + + if (UNEXPECTED(!key)) { + /* This case is only possible due to loopholes, e.g. ArrayObject */ + zend_hash_index_add(Z_ARRVAL_P(return_value), num_key, value); + } else if (unmangle && ZSTR_VAL(key)[0] == 0) { + const char *prop_name, *class_name; + size_t prop_len; + zend_unmangle_property_name_ex(key, &class_name, &prop_name, &prop_len); + /* We assume here that a mangled property name is never + * numeric. This is probably a safe assumption, but + * theoretically someone might write an extension with + * private, numeric properties. Well, too bad. + */ + zend_hash_str_add_new(Z_ARRVAL_P(return_value), prop_name, prop_len, value); + } else { - if (ZEND_HANDLE_NUMERIC(key, num_key)) { - zend_hash_index_add(Z_ARRVAL_P(return_value), num_key, value); - } else { - zend_hash_add_new(Z_ARRVAL_P(return_value), key, value); - } ++ zend_symbtable_add_new(Z_ARRVAL_P(return_value), key, value); } } ZEND_HASH_FOREACH_END(); }