com php-src: Merge branch 'PHP-7.1': Zend/zend_builtin_func tions.c Zend/zend_hash.h
| From: | Nikita Popov | Date: | Thu, 02 Feb 2017 17:35:35 +0000 |
| Subject: | com php-src: Merge branch 'PHP-7.1': Zend/zend_builtin_func tions.c Zend/zend_hash.h | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-96991@lists.php.net to get a copy of this message | ||
Commit: 795a4c1bb384a7e0d56705d43e95b9bfcc3265b5
Author: Nikita Popov <nikita.ppv@gmail.com> 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();
}