summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/standard/basic_functions.c15
1 files changed, 5 insertions, 10 deletions
diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c
index 43bc22b0c3..56f8f39ad5 100644
--- a/ext/standard/basic_functions.c
+++ b/ext/standard/basic_functions.c
@@ -2571,6 +2571,7 @@ static void _phpi_pop(INTERNAL_FUNCTION_PARAMETERS, int off_the_end)
{
zval *stack, /* Input stack */
**val; /* Value to be popped */
+ HashTable *new_hash; /* New stack */
char *string_key;
ulong num_key;
@@ -2600,16 +2601,10 @@ static void _phpi_pop(INTERNAL_FUNCTION_PARAMETERS, int off_the_end)
return_value->is_ref=0;
/* Delete the first or last value */
- switch (zend_hash_get_current_key(stack->value.ht, &string_key, &num_key)) {
- case HASH_KEY_IS_STRING:
- zend_hash_del(stack->value.ht, string_key, strlen(string_key)+1);
- efree(string_key);
- break;
-
- case HASH_KEY_IS_LONG:
- zend_hash_index_del(stack->value.ht, num_key);
- break;
- }
+ new_hash = _phpi_splice(stack->value.ht, (off_the_end) ? -1 : 0, 1, NULL, 0, NULL);
+ zend_hash_destroy(stack->value.ht);
+ efree(stack->value.ht);
+ stack->value.ht = new_hash;
}
/* }}} */