Skip to content

Commit f9e124a

Browse files
committed
compact(): return zend_result from php_compact_var()
1 parent 6edb354 commit f9e124a

1 file changed

Lines changed: 16 additions & 8 deletions

File tree

‎ext/standard/array.c‎

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2692,7 +2692,7 @@ PHP_FUNCTION(extract)
26922692
}
26932693
/* }}} */
26942694

2695-
static void php_compact_var(HashTable *eg_active_symbol_table, zval *return_value, zval *entry, uint32_t pos) /* {{{ */
2695+
static zend_result php_compact_var(HashTable *eg_active_symbol_table, zval *return_value, zval *entry, uint32_t pos) /* {{{ */
26962696
{
26972697
zval *value_ptr, data;
26982698

@@ -2710,34 +2710,43 @@ static void php_compact_var(HashTable *eg_active_symbol_table, zval *return_valu
27102710
}
27112711
} else {
27122712
php_error_docref_unchecked(NULL, E_WARNING, "Undefined variable $%S", Z_STR_P(entry));
2713+
/* A user error handler may have thrown. */
2714+
return EG(exception) ? FAILURE : SUCCESS;
27132715
}
27142716
} else if (Z_TYPE_P(entry) == IS_ARRAY) {
2717+
zend_result result = SUCCESS;
2718+
27152719
#ifdef ZEND_CHECK_STACK_LIMIT
27162720
if (UNEXPECTED(zend_call_stack_overflowed(EG(stack_limit)))) {
27172721
zend_call_stack_size_error();
2718-
return;
2722+
return FAILURE;
27192723
}
27202724
#endif
27212725
if (Z_REFCOUNTED_P(entry)) {
27222726
if (Z_IS_RECURSIVE_P(entry)) {
27232727
zend_throw_error(NULL, "Recursion detected");
2724-
return;
2728+
return FAILURE;
27252729
}
27262730
Z_PROTECT_RECURSION_P(entry);
27272731
}
27282732
ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(entry), value_ptr) {
2729-
php_compact_var(eg_active_symbol_table, return_value, value_ptr, pos);
2730-
if (UNEXPECTED(EG(exception))) {
2733+
if (UNEXPECTED(php_compact_var(eg_active_symbol_table, return_value, value_ptr, pos) == FAILURE)) {
2734+
result = FAILURE;
27312735
break;
27322736
}
27332737
} ZEND_HASH_FOREACH_END();
27342738
if (Z_REFCOUNTED_P(entry)) {
27352739
Z_UNPROTECT_RECURSION_P(entry);
27362740
}
2741+
2742+
return result;
27372743
} else {
27382744
php_error_docref(NULL, E_WARNING, "Argument #%d must be string or array of strings, %s given", pos, zend_zval_value_name(entry));
2739-
return;
2745+
/* A user error handler may have thrown. */
2746+
return EG(exception) ? FAILURE : SUCCESS;
27402747
}
2748+
2749+
return SUCCESS;
27412750
}
27422751
/* }}} */
27432752

@@ -2769,8 +2778,7 @@ PHP_FUNCTION(compact)
27692778
}
27702779

27712780
for (i = 0; i < num_args; i++) {
2772-
php_compact_var(symbol_table, return_value, &args[i], i + 1);
2773-
if (UNEXPECTED(EG(exception))) {
2781+
if (UNEXPECTED(php_compact_var(symbol_table, return_value, &args[i], i + 1) == FAILURE)) {
27742782
RETURN_THROWS();
27752783
}
27762784
}

0 commit comments

Comments
 (0)