summaryrefslogtreecommitdiff
path: root/ext/standard/array.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/standard/array.c')
-rw-r--r--ext/standard/array.c321
1 files changed, 108 insertions, 213 deletions
diff --git a/ext/standard/array.c b/ext/standard/array.c
index 3967d83242..e0b52ca169 100644
--- a/ext/standard/array.c
+++ b/ext/standard/array.c
@@ -345,64 +345,25 @@ static zend_always_inline int php_array_key_compare_string_locale_unstable_i(Buc
static zend_always_inline int php_array_data_compare_unstable_i(Bucket *f, Bucket *s) /* {{{ */
{
- zval *first = &f->val;
- zval *second = &s->val;
-
- if (UNEXPECTED(Z_TYPE_P(first) == IS_INDIRECT)) {
- first = Z_INDIRECT_P(first);
- }
- if (UNEXPECTED(Z_TYPE_P(second) == IS_INDIRECT)) {
- second = Z_INDIRECT_P(second);
- }
- return zend_compare(first, second);
+ return zend_compare(&f->val, &s->val);
}
/* }}} */
static zend_always_inline int php_array_data_compare_numeric_unstable_i(Bucket *f, Bucket *s) /* {{{ */
{
- zval *first = &f->val;
- zval *second = &s->val;
-
- if (UNEXPECTED(Z_TYPE_P(first) == IS_INDIRECT)) {
- first = Z_INDIRECT_P(first);
- }
- if (UNEXPECTED(Z_TYPE_P(second) == IS_INDIRECT)) {
- second = Z_INDIRECT_P(second);
- }
-
- return numeric_compare_function(first, second);
+ return numeric_compare_function(&f->val, &s->val);
}
/* }}} */
static zend_always_inline int php_array_data_compare_string_case_unstable_i(Bucket *f, Bucket *s) /* {{{ */
{
- zval *first = &f->val;
- zval *second = &s->val;
-
- if (UNEXPECTED(Z_TYPE_P(first) == IS_INDIRECT)) {
- first = Z_INDIRECT_P(first);
- }
- if (UNEXPECTED(Z_TYPE_P(second) == IS_INDIRECT)) {
- second = Z_INDIRECT_P(second);
- }
-
- return string_case_compare_function(first, second);
+ return string_case_compare_function(&f->val, &s->val);
}
/* }}} */
static zend_always_inline int php_array_data_compare_string_unstable_i(Bucket *f, Bucket *s) /* {{{ */
{
- zval *first = &f->val;
- zval *second = &s->val;
-
- if (UNEXPECTED(Z_TYPE_P(first) == IS_INDIRECT)) {
- first = Z_INDIRECT_P(first);
- }
- if (UNEXPECTED(Z_TYPE_P(second) == IS_INDIRECT)) {
- second = Z_INDIRECT_P(second);
- }
-
- return string_compare_function(first, second);
+ return string_compare_function(&f->val, &s->val);
}
/* }}} */
@@ -434,17 +395,7 @@ static zend_always_inline int php_array_natural_case_compare_unstable_i(Bucket *
static int php_array_data_compare_string_locale_unstable_i(Bucket *f, Bucket *s) /* {{{ */
{
- zval *first = &f->val;
- zval *second = &s->val;
-
- if (UNEXPECTED(Z_TYPE_P(first) == IS_INDIRECT)) {
- first = Z_INDIRECT_P(first);
- }
- if (UNEXPECTED(Z_TYPE_P(second) == IS_INDIRECT)) {
- second = Z_INDIRECT_P(second);
- }
-
- return string_locale_compare_function(first, second);
+ return string_locale_compare_function(&f->val, &s->val);
}
/* }}} */
@@ -708,7 +659,7 @@ PHPAPI zend_long php_count_recursive(HashTable *ht) /* {{{ */
GC_PROTECT_RECURSION(ht);
}
- cnt = zend_array_count(ht);
+ cnt = zend_hash_num_elements(ht);
ZEND_HASH_FOREACH_VAL(ht, element) {
ZVAL_DEREF(element);
if (Z_TYPE_P(element) == IS_ARRAY) {
@@ -742,7 +693,7 @@ PHP_FUNCTION(count)
switch (Z_TYPE_P(array)) {
case IS_ARRAY:
if (mode != COUNT_RECURSIVE) {
- cnt = zend_array_count(Z_ARRVAL_P(array));
+ cnt = zend_hash_num_elements(Z_ARRVAL_P(array));
} else {
cnt = php_count_recursive(Z_ARRVAL_P(array));
}
@@ -898,7 +849,7 @@ static inline int php_array_user_compare_unstable(Bucket *f, Bucket *s) /* {{{ *
{
zval args[2];
zval retval;
- zend_bool call_failed;
+ bool call_failed;
ZVAL_COPY(&args[0], &f->val);
ZVAL_COPY(&args[1], &s->val);
@@ -964,7 +915,7 @@ static int php_array_user_compare(Bucket *a, Bucket *b) /* {{{ */
BG(user_compare_fci) = old_user_compare_fci; \
BG(user_compare_fci_cache) = old_user_compare_fci_cache; \
-static void php_usort(INTERNAL_FUNCTION_PARAMETERS, bucket_compare_func_t compare_func, zend_bool renumber) /* {{{ */
+static void php_usort(INTERNAL_FUNCTION_PARAMETERS, bucket_compare_func_t compare_func, bool renumber) /* {{{ */
{
zval *array;
zend_array *arr;
@@ -1014,7 +965,7 @@ static inline int php_array_user_key_compare_unstable(Bucket *f, Bucket *s) /* {
{
zval args[2];
zval retval;
- zend_bool call_failed;
+ bool call_failed;
if (f->key == NULL) {
ZVAL_LONG(&args[0], f->h);
@@ -1321,7 +1272,13 @@ PHP_FUNCTION(max)
}
/* }}} */
-static int php_array_walk(zval *array, zval *userdata, int recursive) /* {{{ */
+typedef struct {
+ zend_fcall_info fci;
+ zend_fcall_info_cache fci_cache;
+} php_array_walk_context;
+
+static int php_array_walk(
+ php_array_walk_context *context, zval *array, zval *userdata, int recursive)
{
zval args[3], /* Arguments to userland function */
retval, /* Return value - unused */
@@ -1331,15 +1288,19 @@ static int php_array_walk(zval *array, zval *userdata, int recursive) /* {{{ */
uint32_t ht_iter;
int result = SUCCESS;
+ /* Create a local copy of fci, as we want to use different arguments at different
+ * levels of recursion. */
+ zend_fcall_info fci = context->fci;
+
/* Set up known arguments */
ZVAL_UNDEF(&args[1]);
if (userdata) {
ZVAL_COPY(&args[2], userdata);
}
- BG(array_walk_fci).retval = &retval;
- BG(array_walk_fci).param_count = userdata ? 3 : 2;
- BG(array_walk_fci).params = args;
+ fci.retval = &retval;
+ fci.param_count = userdata ? 3 : 2;
+ fci.params = args;
zend_hash_internal_pointer_reset_ex(target_hash, &pos);
ht_iter = zend_hash_iterator_add(target_hash, pos);
@@ -1386,8 +1347,6 @@ static int php_array_walk(zval *array, zval *userdata, int recursive) /* {{{ */
if (recursive && Z_TYPE_P(Z_REFVAL_P(zv)) == IS_ARRAY) {
HashTable *thash;
- zend_fcall_info orig_array_walk_fci;
- zend_fcall_info_cache orig_array_walk_fci_cache;
zval ref;
ZVAL_COPY_VALUE(&ref, zv);
@@ -1400,28 +1359,20 @@ static int php_array_walk(zval *array, zval *userdata, int recursive) /* {{{ */
break;
}
- /* backup the fcall info and cache */
- orig_array_walk_fci = BG(array_walk_fci);
- orig_array_walk_fci_cache = BG(array_walk_fci_cache);
-
Z_ADDREF(ref);
GC_PROTECT_RECURSION(thash);
- result = php_array_walk(zv, userdata, recursive);
+ result = php_array_walk(context, zv, userdata, recursive);
if (Z_TYPE_P(Z_REFVAL(ref)) == IS_ARRAY && thash == Z_ARRVAL_P(Z_REFVAL(ref))) {
/* If the hashtable changed in the meantime, we'll "leak" this apply count
* increment -- our reference to thash is no longer valid. */
GC_UNPROTECT_RECURSION(thash);
}
zval_ptr_dtor(&ref);
-
- /* restore the fcall info and cache */
- BG(array_walk_fci) = orig_array_walk_fci;
- BG(array_walk_fci_cache) = orig_array_walk_fci_cache;
} else {
ZVAL_COPY(&args[0], zv);
/* Call the userland function */
- result = zend_call_function(&BG(array_walk_fci), &BG(array_walk_fci_cache));
+ result = zend_call_function(&fci, &context->fci_cache);
if (result == SUCCESS) {
zval_ptr_dtor(&retval);
}
@@ -1458,33 +1409,22 @@ static int php_array_walk(zval *array, zval *userdata, int recursive) /* {{{ */
zend_hash_iterator_del(ht_iter);
return result;
}
-/* }}} */
/* {{{ Apply a user function to every member of an array */
PHP_FUNCTION(array_walk)
{
zval *array;
zval *userdata = NULL;
- zend_fcall_info orig_array_walk_fci;
- zend_fcall_info_cache orig_array_walk_fci_cache;
-
- orig_array_walk_fci = BG(array_walk_fci);
- orig_array_walk_fci_cache = BG(array_walk_fci_cache);
+ php_array_walk_context context;
ZEND_PARSE_PARAMETERS_START(2, 3)
Z_PARAM_ARRAY_OR_OBJECT_EX(array, 0, 1)
- Z_PARAM_FUNC(BG(array_walk_fci), BG(array_walk_fci_cache))
+ Z_PARAM_FUNC(context.fci, context.fci_cache)
Z_PARAM_OPTIONAL
Z_PARAM_ZVAL(userdata)
- ZEND_PARSE_PARAMETERS_END_EX(
- BG(array_walk_fci) = orig_array_walk_fci;
- BG(array_walk_fci_cache) = orig_array_walk_fci_cache;
- return
- );
-
- php_array_walk(array, userdata, 0);
- BG(array_walk_fci) = orig_array_walk_fci;
- BG(array_walk_fci_cache) = orig_array_walk_fci_cache;
+ ZEND_PARSE_PARAMETERS_END();
+
+ php_array_walk(&context, array, userdata, 0);
RETURN_TRUE;
}
/* }}} */
@@ -1494,26 +1434,16 @@ PHP_FUNCTION(array_walk_recursive)
{
zval *array;
zval *userdata = NULL;
- zend_fcall_info orig_array_walk_fci;
- zend_fcall_info_cache orig_array_walk_fci_cache;
-
- orig_array_walk_fci = BG(array_walk_fci);
- orig_array_walk_fci_cache = BG(array_walk_fci_cache);
+ php_array_walk_context context;
ZEND_PARSE_PARAMETERS_START(2, 3)
Z_PARAM_ARRAY_OR_OBJECT_EX(array, 0, 1)
- Z_PARAM_FUNC(BG(array_walk_fci), BG(array_walk_fci_cache))
+ Z_PARAM_FUNC(context.fci, context.fci_cache)
Z_PARAM_OPTIONAL
Z_PARAM_ZVAL(userdata)
- ZEND_PARSE_PARAMETERS_END_EX(
- BG(array_walk_fci) = orig_array_walk_fci;
- BG(array_walk_fci_cache) = orig_array_walk_fci_cache;
- return
- );
-
- php_array_walk(array, userdata, 1);
- BG(array_walk_fci) = orig_array_walk_fci;
- BG(array_walk_fci_cache) = orig_array_walk_fci_cache;
+ ZEND_PARSE_PARAMETERS_END();
+
+ php_array_walk(&context, array, userdata, 1);
RETURN_TRUE;
}
/* }}} */
@@ -1529,7 +1459,7 @@ static inline void php_search_array(INTERNAL_FUNCTION_PARAMETERS, int behavior)
*entry; /* pointer to array entry */
zend_ulong num_idx;
zend_string *str_idx;
- zend_bool strict = 0; /* strict comparison or not */
+ bool strict = 0; /* strict comparison or not */
ZEND_PARSE_PARAMETERS_START(2, 3)
Z_PARAM_ZVAL(value)
@@ -1540,81 +1470,76 @@ static inline void php_search_array(INTERNAL_FUNCTION_PARAMETERS, int behavior)
if (strict) {
if (Z_TYPE_P(value) == IS_LONG) {
- ZEND_HASH_FOREACH_KEY_VAL_IND(Z_ARRVAL_P(array), num_idx, str_idx, entry) {
+ ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(array), num_idx, str_idx, entry) {
ZVAL_DEREF(entry);
if (Z_TYPE_P(entry) == IS_LONG && Z_LVAL_P(entry) == Z_LVAL_P(value)) {
if (behavior == 0) {
RETURN_TRUE;
} else {
if (str_idx) {
- RETVAL_STR_COPY(str_idx);
+ RETURN_STR_COPY(str_idx);
} else {
- RETVAL_LONG(num_idx);
+ RETURN_LONG(num_idx);
}
- return;
}
}
} ZEND_HASH_FOREACH_END();
} else {
- ZEND_HASH_FOREACH_KEY_VAL_IND(Z_ARRVAL_P(array), num_idx, str_idx, entry) {
+ ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(array), num_idx, str_idx, entry) {
ZVAL_DEREF(entry);
if (fast_is_identical_function(value, entry)) {
if (behavior == 0) {
RETURN_TRUE;
} else {
if (str_idx) {
- RETVAL_STR_COPY(str_idx);
+ RETURN_STR_COPY(str_idx);
} else {
- RETVAL_LONG(num_idx);
+ RETURN_LONG(num_idx);
}
- return;
}
}
} ZEND_HASH_FOREACH_END();
}
} else {
if (Z_TYPE_P(value) == IS_LONG) {
- ZEND_HASH_FOREACH_KEY_VAL_IND(Z_ARRVAL_P(array), num_idx, str_idx, entry) {
+ ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(array), num_idx, str_idx, entry) {
if (fast_equal_check_long(value, entry)) {
if (behavior == 0) {
RETURN_TRUE;
} else {
if (str_idx) {
- RETVAL_STR_COPY(str_idx);
+ RETURN_STR_COPY(str_idx);
} else {
- RETVAL_LONG(num_idx);
+ RETURN_LONG(num_idx);
}
- return;
}
}
} ZEND_HASH_FOREACH_END();
} else if (Z_TYPE_P(value) == IS_STRING) {
- ZEND_HASH_FOREACH_KEY_VAL_IND(Z_ARRVAL_P(array), num_idx, str_idx, entry) {
+ ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(array), num_idx, str_idx, entry) {
if (fast_equal_check_string(value, entry)) {
if (behavior == 0) {
RETURN_TRUE;
} else {
if (str_idx) {
- RETVAL_STR_COPY(str_idx);
+ RETURN_STR_COPY(str_idx);
} else {
- RETVAL_LONG(num_idx);
+ RETURN_LONG(num_idx);
}
- return;
}
}
} ZEND_HASH_FOREACH_END();
} else {
- ZEND_HASH_FOREACH_KEY_VAL_IND(Z_ARRVAL_P(array), num_idx, str_idx, entry) {
+ ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(array), num_idx, str_idx, entry) {
if (fast_equal_check_function(value, entry)) {
if (behavior == 0) {
RETURN_TRUE;
} else {
if (str_idx) {
- RETVAL_STR_COPY(str_idx);
+ RETURN_STR_COPY(str_idx);
} else {
- RETVAL_LONG(num_idx);
+ RETURN_LONG(num_idx);
}
- return;
}
}
} ZEND_HASH_FOREACH_END();
@@ -1696,7 +1621,7 @@ static zend_always_inline int php_valid_var_name(const char *var_name, size_t va
}
/* }}} */
-PHPAPI int php_prefix_varname(zval *result, zend_string *prefix, const char *var_name, size_t var_name_len, zend_bool add_underscore) /* {{{ */
+PHPAPI int php_prefix_varname(zval *result, zend_string *prefix, const char *var_name, size_t var_name_len, bool add_underscore) /* {{{ */
{
ZVAL_NEW_STR(result, zend_string_alloc(ZSTR_LEN(prefix) + (add_underscore ? 1 : 0) + var_name_len, 0));
memcpy(Z_STRVAL_P(result), ZSTR_VAL(prefix), ZSTR_LEN(prefix));
@@ -1717,7 +1642,7 @@ static zend_long php_extract_ref_if_exists(zend_array *arr, zend_array *symbol_t
zend_string *var_name;
zval *entry, *orig_var;
- ZEND_HASH_FOREACH_STR_KEY_VAL_IND(arr, var_name, entry) {
+ ZEND_HASH_FOREACH_STR_KEY_VAL(arr, var_name, entry) {
if (!var_name) {
continue;
}
@@ -1760,7 +1685,7 @@ static zend_long php_extract_if_exists(zend_array *arr, zend_array *symbol_table
zend_string *var_name;
zval *entry, *orig_var;
- ZEND_HASH_FOREACH_STR_KEY_VAL_IND(arr, var_name, entry) {
+ ZEND_HASH_FOREACH_STR_KEY_VAL(arr, var_name, entry) {
if (!var_name) {
continue;
}
@@ -1801,7 +1726,7 @@ static zend_long php_extract_ref_overwrite(zend_array *arr, zend_array *symbol_t
zend_string *var_name;
zval *entry, *orig_var;
- ZEND_HASH_FOREACH_STR_KEY_VAL_IND(arr, var_name, entry) {
+ ZEND_HASH_FOREACH_STR_KEY_VAL(arr, var_name, entry) {
if (!var_name) {
continue;
}
@@ -1848,7 +1773,7 @@ static zend_long php_extract_overwrite(zend_array *arr, zend_array *symbol_table
zend_string *var_name;
zval *entry, *orig_var;
- ZEND_HASH_FOREACH_STR_KEY_VAL_IND(arr, var_name, entry) {
+ ZEND_HASH_FOREACH_STR_KEY_VAL(arr, var_name, entry) {
if (!var_name) {
continue;
}
@@ -1890,7 +1815,7 @@ static zend_long php_extract_ref_prefix_if_exists(zend_array *arr, zend_array *s
zend_string *var_name;
zval *entry, *orig_var, final_name;
- ZEND_HASH_FOREACH_STR_KEY_VAL_IND(arr, var_name, entry) {
+ ZEND_HASH_FOREACH_STR_KEY_VAL(arr, var_name, entry) {
if (!var_name) {
continue;
}
@@ -1946,7 +1871,7 @@ static zend_long php_extract_prefix_if_exists(zend_array *arr, zend_array *symbo
zend_string *var_name;
zval *entry, *orig_var, final_name;
- ZEND_HASH_FOREACH_STR_KEY_VAL_IND(arr, var_name, entry) {
+ ZEND_HASH_FOREACH_STR_KEY_VAL(arr, var_name, entry) {
if (!var_name) {
continue;
}
@@ -1997,7 +1922,7 @@ static zend_long php_extract_ref_prefix_same(zend_array *arr, zend_array *symbol
zend_string *var_name;
zval *entry, *orig_var, final_name;
- ZEND_HASH_FOREACH_STR_KEY_VAL_IND(arr, var_name, entry) {
+ ZEND_HASH_FOREACH_STR_KEY_VAL(arr, var_name, entry) {
if (!var_name) {
continue;
}
@@ -2071,7 +1996,7 @@ static zend_long php_extract_prefix_same(zend_array *arr, zend_array *symbol_tab
zend_string *var_name;
zval *entry, *orig_var, final_name;
- ZEND_HASH_FOREACH_STR_KEY_VAL_IND(arr, var_name, entry) {
+ ZEND_HASH_FOREACH_STR_KEY_VAL(arr, var_name, entry) {
if (!var_name) {
continue;
}
@@ -2138,7 +2063,7 @@ static zend_long php_extract_ref_prefix_all(zend_array *arr, zend_array *symbol_
zend_ulong num_key;
zval *entry, *orig_var, final_name;
- ZEND_HASH_FOREACH_KEY_VAL_IND(arr, num_key, var_name, entry) {
+ ZEND_HASH_FOREACH_KEY_VAL(arr, num_key, var_name, entry) {
if (var_name) {
if (ZSTR_LEN(var_name) == 0) {
continue;
@@ -2185,7 +2110,7 @@ static zend_long php_extract_prefix_all(zend_array *arr, zend_array *symbol_tabl
zend_ulong num_key;
zval *entry, *orig_var, final_name;
- ZEND_HASH_FOREACH_KEY_VAL_IND(arr, num_key, var_name, entry) {
+ ZEND_HASH_FOREACH_KEY_VAL(arr, num_key, var_name, entry) {
if (var_name) {
if (ZSTR_LEN(var_name) == 0) {
continue;
@@ -2232,7 +2157,7 @@ static zend_long php_extract_ref_prefix_invalid(zend_array *arr, zend_array *sym
zend_ulong num_key;
zval *entry, *orig_var, final_name;
- ZEND_HASH_FOREACH_KEY_VAL_IND(arr, num_key, var_name, entry) {
+ ZEND_HASH_FOREACH_KEY_VAL(arr, num_key, var_name, entry) {
if (var_name) {
if (!php_valid_var_name(ZSTR_VAL(var_name), ZSTR_LEN(var_name))
|| zend_string_equals_literal(var_name, "this")) {
@@ -2287,7 +2212,7 @@ static zend_long php_extract_prefix_invalid(zend_array *arr, zend_array *symbol_
zend_ulong num_key;
zval *entry, *orig_var, final_name;
- ZEND_HASH_FOREACH_KEY_VAL_IND(arr, num_key, var_name, entry) {
+ ZEND_HASH_FOREACH_KEY_VAL(arr, num_key, var_name, entry) {
if (var_name) {
if (!php_valid_var_name(ZSTR_VAL(var_name), ZSTR_LEN(var_name))
|| zend_string_equals_literal(var_name, "this")) {
@@ -2341,7 +2266,7 @@ static zend_long php_extract_ref_skip(zend_array *arr, zend_array *symbol_table)
zend_string *var_name;
zval *entry, *orig_var;
- ZEND_HASH_FOREACH_STR_KEY_VAL_IND(arr, var_name, entry) {
+ ZEND_HASH_FOREACH_STR_KEY_VAL(arr, var_name, entry) {
if (!var_name) {
continue;
}
@@ -2386,7 +2311,7 @@ static zend_long php_extract_skip(zend_array *arr, zend_array *symbol_table) /*
zend_string *var_name;
zval *entry, *orig_var;
- ZEND_HASH_FOREACH_STR_KEY_VAL_IND(arr, var_name, entry) {
+ ZEND_HASH_FOREACH_STR_KEY_VAL(arr, var_name, entry) {
if (!var_name) {
continue;
}
@@ -2549,7 +2474,7 @@ static void php_compact_var(HashTable *eg_active_symbol_table, zval *return_valu
}
Z_PROTECT_RECURSION_P(entry);
}
- ZEND_HASH_FOREACH_VAL_IND(Z_ARRVAL_P(entry), value_ptr) {
+ ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(entry), value_ptr) {
php_compact_var(eg_active_symbol_table, return_value, value_ptr);
} ZEND_HASH_FOREACH_END();
if (Z_REFCOUNTED_P(entry)) {
@@ -3033,7 +2958,6 @@ static void php_splice(HashTable *in_hash, zend_long offset, zend_long length, H
for (pos = 0, idx = 0; pos < offset && idx < in_hash->nNumUsed; idx++) {
p = in_hash->arData + idx;
if (Z_TYPE(p->val) == IS_UNDEF) continue;
- /* Get entry and increase reference count */
entry = &p->val;
/* Update output hash depending on key type */
@@ -3061,15 +2985,10 @@ static void php_splice(HashTable *in_hash, zend_long offset, zend_long length, H
Z_TRY_ADDREF_P(entry);
if (p->key == NULL) {
zend_hash_next_index_insert_new(removed, entry);
- zend_hash_del_bucket(in_hash, p);
} else {
zend_hash_add_new(removed, p->key, entry);
- if (in_hash == &EG(symbol_table)) {
- zend_delete_global_variable(p->key);
- } else {
- zend_hash_del_bucket(in_hash, p);
- }
}
+ zend_hash_del_bucket(in_hash, p);
}
} else { /* otherwise just skip those entries */
int pos2 = pos;
@@ -3078,18 +2997,14 @@ static void php_splice(HashTable *in_hash, zend_long offset, zend_long length, H
p = in_hash->arData + idx;
if (Z_TYPE(p->val) == IS_UNDEF) continue;
pos2++;
- if (p->key && in_hash == &EG(symbol_table)) {
- zend_delete_global_variable(p->key);
- } else {
- zend_hash_del_bucket(in_hash, p);
- }
+ zend_hash_del_bucket(in_hash, p);
}
}
iter_pos = zend_hash_iterators_lower_pos(in_hash, iter_pos);
/* If there are entries to insert.. */
if (replace) {
- ZEND_HASH_FOREACH_VAL_IND(replace, entry) {
+ ZEND_HASH_FOREACH_VAL(replace, entry) {
Z_TRY_ADDREF_P(entry);
zend_hash_next_index_insert_new(&out_hash, entry);
pos++;
@@ -3190,9 +3105,6 @@ PHP_FUNCTION(array_pop)
idx--;
p = Z_ARRVAL_P(stack)->arData + idx;
val = &p->val;
- if (Z_TYPE_P(val) == IS_INDIRECT) {
- val = Z_INDIRECT_P(val);
- }
if (Z_TYPE_P(val) != IS_UNDEF) {
break;
}
@@ -3204,12 +3116,7 @@ PHP_FUNCTION(array_pop)
}
/* Delete the last value */
- if (p->key && Z_ARRVAL_P(stack) == &EG(symbol_table)) {
- zend_delete_global_variable(p->key);
- } else {
- zend_hash_del_bucket(Z_ARRVAL_P(stack), p);
- }
-
+ zend_hash_del_bucket(Z_ARRVAL_P(stack), p);
zend_hash_internal_pointer_reset(Z_ARRVAL_P(stack));
}
/* }}} */
@@ -3238,9 +3145,6 @@ PHP_FUNCTION(array_shift)
}
p = Z_ARRVAL_P(stack)->arData + idx;
val = &p->val;
- if (Z_TYPE_P(val) == IS_INDIRECT) {
- val = Z_INDIRECT_P(val);
- }
if (Z_TYPE_P(val) != IS_UNDEF) {
break;
}
@@ -3249,11 +3153,7 @@ PHP_FUNCTION(array_shift)
ZVAL_COPY_DEREF(return_value, val);
/* Delete the first value */
- if (p->key && Z_ARRVAL_P(stack) == &EG(symbol_table)) {
- zend_delete_global_variable(p->key);
- } else {
- zend_hash_del_bucket(Z_ARRVAL_P(stack), p);
- }
+ zend_hash_del_bucket(Z_ARRVAL_P(stack), p);
/* re-index like it did before */
if (HT_FLAGS(Z_ARRVAL_P(stack)) & HASH_FLAG_PACKED) {
@@ -3384,7 +3284,7 @@ PHP_FUNCTION(array_splice)
HashTable *rem_hash = NULL;
zend_long offset,
length = 0;
- zend_bool length_is_null = 1;
+ bool length_is_null = 1;
int num_in; /* Number of elements in the input array */
ZEND_PARSE_PARAMETERS_START(2, 4)
@@ -3403,7 +3303,7 @@ PHP_FUNCTION(array_splice)
if (ZEND_NUM_ARGS() == 4) {
/* Make sure the last argument, if passed, is an array */
- convert_to_array_ex(repl_array);
+ convert_to_array(repl_array);
}
/* Don't create the array of removed elements if it's not going
@@ -3472,8 +3372,8 @@ PHP_FUNCTION(array_slice)
zval *entry; /* An array entry */
zend_long offset; /* Offset to get elements from */
zend_long length = 0; /* How many elements to get */
- zend_bool length_is_null = 1; /* Whether an explicit length has been omitted */
- zend_bool preserve_keys = 0; /* Whether to preserve keys while copying to the new array */
+ bool length_is_null = 1; /* Whether an explicit length has been omitted */
+ bool preserve_keys = 0; /* Whether to preserve keys while copying to the new array */
uint32_t num_in; /* Number of elements in the input array */
zend_string *string_key;
zend_ulong num_key;
@@ -3601,10 +3501,10 @@ PHPAPI int php_array_merge_recursive(HashTable *dest, HashTable *src) /* {{{ */
dest_zval = dest_entry;
if (Z_TYPE_P(dest_zval) == IS_NULL) {
- convert_to_array_ex(dest_zval);
+ convert_to_array(dest_zval);
add_next_index_null(dest_zval);
} else {
- convert_to_array_ex(dest_zval);
+ convert_to_array(dest_zval);
}
ZVAL_UNDEF(&tmp);
if (Z_TYPE_P(src_zval) == IS_OBJECT) {
@@ -3827,7 +3727,7 @@ static zend_always_inline void php_array_merge_wrapper(INTERNAL_FUNCTION_PARAMET
return;
}
} else {
- zend_bool copy = 1;
+ bool copy = 1;
zend_string *string_key;
ZEND_HASH_FOREACH_STR_KEY(Z_ARRVAL_P(ret), string_key) {
@@ -3926,7 +3826,7 @@ PHP_FUNCTION(array_keys)
*search_value = NULL, /* Value to search for */
*entry, /* An entry in the input array */
new_val; /* New value */
- zend_bool strict = 0; /* do strict comparison */
+ bool strict = 0; /* do strict comparison */
zend_ulong num_idx;
zend_string *str_idx;
zend_array *arrval;
@@ -3951,7 +3851,7 @@ PHP_FUNCTION(array_keys)
array_init(return_value);
if (strict) {
- ZEND_HASH_FOREACH_KEY_VAL_IND(arrval, num_idx, str_idx, entry) {
+ ZEND_HASH_FOREACH_KEY_VAL(arrval, num_idx, str_idx, entry) {
ZVAL_DEREF(entry);
if (fast_is_identical_function(search_value, entry)) {
if (str_idx) {
@@ -3963,7 +3863,7 @@ PHP_FUNCTION(array_keys)
}
} ZEND_HASH_FOREACH_END();
} else {
- ZEND_HASH_FOREACH_KEY_VAL_IND(arrval, num_idx, str_idx, entry) {
+ ZEND_HASH_FOREACH_KEY_VAL(arrval, num_idx, str_idx, entry) {
if (fast_equal_check_function(search_value, entry)) {
if (str_idx) {
ZVAL_STR_COPY(&new_val, str_idx);
@@ -3988,7 +3888,7 @@ PHP_FUNCTION(array_keys)
}
} else {
/* Go through input array and add keys to the return array */
- ZEND_HASH_FOREACH_KEY_VAL_IND(Z_ARRVAL_P(input), num_idx, str_idx, entry) {
+ ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(input), num_idx, str_idx, entry) {
if (str_idx) {
ZEND_HASH_FILL_SET_STR_COPY(str_idx);
} else {
@@ -4169,10 +4069,10 @@ PHP_FUNCTION(array_column)
zval *colval, *data, rv;
zend_string *column_str = NULL;
zend_long column_long;
- zend_bool column_is_null = 0;
+ bool column_is_null = 0;
zend_string *index_str = NULL;
zend_long index_long;
- zend_bool index_is_null = 1;
+ bool index_is_null = 1;
ZEND_PARSE_PARAMETERS_START(2, 3)
Z_PARAM_ARRAY_HT(input)
@@ -4229,7 +4129,7 @@ PHP_FUNCTION(array_reverse)
*entry; /* An entry in the input array */
zend_string *string_key;
zend_ulong num_key;
- zend_bool preserve_keys = 0; /* whether to preserve keys */
+ bool preserve_keys = 0; /* whether to preserve keys */
ZEND_PARSE_PARAMETERS_START(1, 2)
Z_PARAM_ARRAY(input)
@@ -4339,7 +4239,7 @@ PHP_FUNCTION(array_pad)
}
}
- ZEND_HASH_FOREACH_STR_KEY_VAL_IND(Z_ARRVAL_P(input), key, value) {
+ ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(input), key, value) {
Z_TRY_ADDREF_P(value);
if (key) {
zend_hash_add_new(Z_ARRVAL_P(return_value), key, value);
@@ -4473,7 +4373,7 @@ PHP_FUNCTION(array_unique)
zend_hash_init(&seen, zend_hash_num_elements(Z_ARRVAL_P(array)), NULL, NULL, 0);
array_init(return_value);
- ZEND_HASH_FOREACH_KEY_VAL_IND(Z_ARRVAL_P(array), num_key, str_key, val) {
+ ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(array), num_key, str_key, val) {
zval *retval;
if (Z_TYPE_P(val) == IS_STRING) {
retval = zend_hash_add_empty_element(&seen, Z_STR_P(val));
@@ -4512,7 +4412,6 @@ PHP_FUNCTION(array_unique)
for (i = 0, idx = 0; idx < Z_ARRVAL_P(array)->nNumUsed; idx++) {
p = Z_ARRVAL_P(array)->arData + idx;
if (Z_TYPE(p->val) == IS_UNDEF) continue;
- if (Z_TYPE(p->val) == IS_INDIRECT && Z_TYPE_P(Z_INDIRECT(p->val)) == IS_UNDEF) continue;
arTmp[i].b = *p;
arTmp[i].i = i;
i++;
@@ -4535,11 +4434,7 @@ PHP_FUNCTION(array_unique)
if (p->key == NULL) {
zend_hash_index_del(Z_ARRVAL_P(return_value), p->h);
} else {
- if (Z_ARRVAL_P(return_value) == &EG(symbol_table)) {
- zend_delete_global_variable(p->key);
- } else {
- zend_hash_del(Z_ARRVAL_P(return_value), p->key);
- }
+ zend_hash_del(Z_ARRVAL_P(return_value), p->key);
}
}
}
@@ -4580,7 +4475,7 @@ static void php_array_intersect_key(INTERNAL_FUNCTION_PARAMETERS, int data_compa
int argc, i;
zval *args;
int (*intersect_data_compare_func)(zval *, zval *) = NULL;
- zend_bool ok;
+ bool ok;
zval *val, *data;
char *param_spec;
zend_string *key;
@@ -4615,8 +4510,8 @@ static void php_array_intersect_key(INTERNAL_FUNCTION_PARAMETERS, int data_compa
array_init(return_value);
- /* Iterate over keys of the first array (handling possibility of indirects such as in $GLOBALS), to compute keys that are in all of the other arrays. */
- ZEND_HASH_FOREACH_KEY_VAL_IND(Z_ARRVAL(args[0]), h, key, val) {
+ /* Iterate over keys of the first array, to compute keys that are in all of the other arrays. */
+ ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL(args[0]), h, key, val) {
if (Z_ISREF_P(val) && Z_REFCOUNT_P(val) == 1) {
val = Z_REFVAL_P(val);
}
@@ -4638,7 +4533,7 @@ static void php_array_intersect_key(INTERNAL_FUNCTION_PARAMETERS, int data_compa
} else {
ok = 1;
for (i = 1; i < argc; i++) {
- if ((data = zend_hash_find_ex_ind(Z_ARRVAL(args[i]), key, 1)) == NULL ||
+ if ((data = zend_hash_find_ex(Z_ARRVAL(args[i]), key, 1)) == NULL ||
(intersect_data_compare_func &&
intersect_data_compare_func(val, data) != 0)
) {
@@ -4959,7 +4854,7 @@ static void php_array_diff_key(INTERNAL_FUNCTION_PARAMETERS, int data_compare_ty
int argc, i;
zval *args;
int (*diff_data_compare_func)(zval *, zval *) = NULL;
- zend_bool ok;
+ bool ok;
zval *val, *data;
zend_string *key;
zend_ulong h;
@@ -4989,8 +4884,8 @@ static void php_array_diff_key(INTERNAL_FUNCTION_PARAMETERS, int data_compare_ty
array_init(return_value);
- /* Iterate over keys of the first array (handling possibility of indirects such as in $GLOBALS), to compute keys that aren't in the other arrays. */
- ZEND_HASH_FOREACH_KEY_VAL_IND(Z_ARRVAL(args[0]), h, key, val) {
+ /* Iterate over keys of the first array, to compute keys that aren't in the other arrays. */
+ ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL(args[0]), h, key, val) {
if (Z_ISREF_P(val) && Z_REFCOUNT_P(val) == 1) {
val = Z_REFVAL_P(val);
}
@@ -5012,7 +4907,7 @@ static void php_array_diff_key(INTERNAL_FUNCTION_PARAMETERS, int data_compare_ty
} else {
ok = 1;
for (i = 1; i < argc; i++) {
- if ((data = zend_hash_find_ex_ind(Z_ARRVAL(args[i]), key, 1)) != NULL &&
+ if ((data = zend_hash_find_ex(Z_ARRVAL(args[i]), key, 1)) != NULL &&
(!diff_data_compare_func ||
diff_data_compare_func(val, data) == 0)
) {
@@ -5319,7 +5214,7 @@ PHP_FUNCTION(array_diff)
zend_string *search_str, *tmp_search_str;
value = NULL;
- ZEND_HASH_FOREACH_VAL_IND(Z_ARRVAL(args[0]), value) {
+ ZEND_HASH_FOREACH_VAL(Z_ARRVAL(args[0]), value) {
break;
} ZEND_HASH_FOREACH_END();
@@ -5341,7 +5236,7 @@ PHP_FUNCTION(array_diff)
RETURN_THROWS();
}
if (!found) {
- ZEND_HASH_FOREACH_VAL_IND(Z_ARRVAL(args[i]), value) {
+ ZEND_HASH_FOREACH_VAL(Z_ARRVAL(args[i]), value) {
str = zval_get_tmp_string(value, &tmp_str);
if (zend_string_equals(search_str, str)) {
zend_tmp_string_release(tmp_str);
@@ -5382,7 +5277,7 @@ PHP_FUNCTION(array_diff)
/* create exclude map */
zend_hash_init(&exclude, num, NULL, NULL, 0);
for (i = 1; i < argc; i++) {
- ZEND_HASH_FOREACH_VAL_IND(Z_ARRVAL(args[i]), value) {
+ ZEND_HASH_FOREACH_VAL(Z_ARRVAL(args[i]), value) {
str = zval_get_tmp_string(value, &tmp_str);
zend_hash_add(&exclude, str, &dummy);
zend_tmp_string_release(tmp_str);
@@ -5391,7 +5286,7 @@ PHP_FUNCTION(array_diff)
/* copy all elements of first array that are not in exclude set */
array_init_size(return_value, zend_hash_num_elements(Z_ARRVAL(args[0])));
- ZEND_HASH_FOREACH_KEY_VAL_IND(Z_ARRVAL(args[0]), idx, key, value) {
+ ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL(args[0]), idx, key, value) {
str = zval_get_tmp_string(value, &tmp_str);
if (!zend_hash_exists(&exclude, str)) {
if (key) {
@@ -5894,7 +5789,7 @@ PHP_FUNCTION(array_filter)
zval *key;
zval args[2];
zval retval;
- zend_bool have_callback = 0;
+ bool have_callback = 0;
zend_long use_type = 0;
zend_string *string_key;
zend_fcall_info fci = empty_fcall_info;
@@ -5926,7 +5821,7 @@ PHP_FUNCTION(array_filter)
}
}
- ZEND_HASH_FOREACH_KEY_VAL_IND(Z_ARRVAL_P(array), num_key, string_key, operand) {
+ ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(array), num_key, string_key, operand) {
if (have_callback) {
if (use_type) {
/* Set up the key */
@@ -6011,7 +5906,7 @@ PHP_FUNCTION(array_map)
array_init_size(return_value, maxlen);
zend_hash_real_init(Z_ARRVAL_P(return_value), HT_FLAGS(Z_ARRVAL(arrays[0])) & HASH_FLAG_PACKED);
- ZEND_HASH_FOREACH_KEY_VAL_IND(Z_ARRVAL(arrays[0]), num_key, str_key, zv) {
+ ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL(arrays[0]), num_key, str_key, zv) {
fci.retval = &result;
fci.param_count = 1;
fci.params = &arg;
@@ -6139,13 +6034,13 @@ PHP_FUNCTION(array_key_exists)
switch (Z_TYPE_P(key)) {
case IS_STRING:
- RETVAL_BOOL(zend_symtable_exists_ind(ht, Z_STR_P(key)));
+ RETVAL_BOOL(zend_symtable_exists(ht, Z_STR_P(key)));
break;
case IS_LONG:
RETVAL_BOOL(zend_hash_index_exists(ht, Z_LVAL_P(key)));
break;
case IS_NULL:
- RETVAL_BOOL(zend_hash_exists_ind(ht, ZSTR_EMPTY_ALLOC()));
+ RETVAL_BOOL(zend_hash_exists(ht, ZSTR_EMPTY_ALLOC()));
break;
case IS_DOUBLE:
RETVAL_BOOL(zend_hash_index_exists(ht, zend_dval_to_lval(Z_DVAL_P(key))));
@@ -6174,7 +6069,7 @@ PHP_FUNCTION(array_chunk)
zend_long size, current = 0;
zend_string *str_key;
zend_ulong num_key;
- zend_bool preserve_keys = 0;
+ bool preserve_keys = 0;
zval *input = NULL;
zval chunk;
zval *entry;