]> granicus.if.org Git - php/commitdiff
Merge branch 'PHP-7.1'
authorNikita Popov <nikita.ppv@gmail.com>
Thu, 2 Feb 2017 17:35:35 +0000 (18:35 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Thu, 2 Feb 2017 17:35:35 +0000 (18:35 +0100)
1  2 
Zend/zend_builtin_functions.c
Zend/zend_hash.h

index 0f3e321ba37010c874efffa5804f6b4fa296fea9,12f9f2963639c9a0c10ac141b6765e95938d208c..4ba9dc4189b59503ddef696b36cf333a73aab8dc
@@@ -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;
                                }
-                               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);
-                               }
 +                              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 {
++                              zend_symbtable_add_new(Z_ARRVAL_P(return_value), key, value);
                        }
                } ZEND_HASH_FOREACH_END();
        }
Simple merge