Skip to content

Commit 7352213

Browse files
committed
Early return if variadic type check fails
Don't check all the remaining arguments after one check failed. I don't think this makes an observable behavior difference, because we already suppress duplicate exceptions in argument type error reporting.
1 parent 7574823 commit 7352213

File tree

3 files changed

+15
-3
lines changed

3 files changed

+15
-3
lines changed

Zend/zend_hash.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1112,13 +1112,17 @@ static zend_always_inline void *zend_hash_get_current_data_ptr_ex(HashTable *ht,
11121112
ZEND_HASH_FILL_NEXT(); \
11131113
} while (0)
11141114

1115-
#define ZEND_HASH_FILL_END() \
1115+
#define ZEND_HASH_FILL_FINISH() do { \
11161116
__fill_ht->nNumUsed = __fill_idx; \
11171117
__fill_ht->nNumOfElements = __fill_idx; \
11181118
__fill_ht->nNextFreeElement = __fill_idx; \
11191119
__fill_ht->nInternalPointer = 0; \
11201120
} while (0)
11211121

1122+
#define ZEND_HASH_FILL_END() \
1123+
ZEND_HASH_FILL_FINISH(); \
1124+
} while (0)
1125+
11221126
static zend_always_inline zval *_zend_hash_append_ex(HashTable *ht, zend_string *key, zval *zv, int interned)
11231127
{
11241128
uint32_t idx = ht->nNumUsed++;

Zend/zend_vm_def.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5162,7 +5162,11 @@ ZEND_VM_HANDLER(164, ZEND_RECV_VARIADIC, NUM, UNUSED, CACHE_SLOT)
51625162
param = EX_VAR_NUM(EX(func)->op_array.last_var + EX(func)->op_array.T);
51635163
if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
51645164
do {
5165-
zend_verify_variadic_arg_type(EX(func), arg_num, param, CACHE_ADDR(opline->extended_value));
5165+
if (UNEXPECTED(!zend_verify_variadic_arg_type(EX(func), arg_num, param, CACHE_ADDR(opline->extended_value)))) {
5166+
ZEND_HASH_FILL_FINISH();
5167+
HANDLE_EXCEPTION();
5168+
}
5169+
51665170
if (Z_OPT_REFCOUNTED_P(param)) Z_ADDREF_P(param);
51675171
ZEND_HASH_FILL_ADD(param);
51685172
param++;

Zend/zend_vm_execute.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3134,7 +3134,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RECV_VARIADIC_SPEC_UNUSED_HAND
31343134
param = EX_VAR_NUM(EX(func)->op_array.last_var + EX(func)->op_array.T);
31353135
if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
31363136
do {
3137-
zend_verify_variadic_arg_type(EX(func), arg_num, param, CACHE_ADDR(opline->extended_value));
3137+
if (UNEXPECTED(!zend_verify_variadic_arg_type(EX(func), arg_num, param, CACHE_ADDR(opline->extended_value)))) {
3138+
ZEND_HASH_FILL_FINISH();
3139+
HANDLE_EXCEPTION();
3140+
}
3141+
31383142
if (Z_OPT_REFCOUNTED_P(param)) Z_ADDREF_P(param);
31393143
ZEND_HASH_FILL_ADD(param);
31403144
param++;

0 commit comments

Comments
 (0)