Skip to content

Commit 20d2b6e

Browse files
committed
Zend: add VM spec for ZEND_VERIFY_TYPE_RETURN for scalar values
1 parent 0a318ef commit 20d2b6e

File tree

3 files changed

+737
-554
lines changed

3 files changed

+737
-554
lines changed

Zend/zend_vm_def.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4572,6 +4572,27 @@ ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_VERIFY_RETURN_TYPE, (((res_info & MAY_BE_REF)
45724572
ZEND_VM_NEXT_OPCODE();
45734573
}
45744574

4575+
ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_VERIFY_RETURN_TYPE, (((res_info & MAY_BE_REF) == 0) && (op1_info == MAY_BE_DOUBLE || op1_info == MAY_BE_STRING)), ZEND_VERIFY_RETURN_TYPE_FOR_STRING_AND_DOUBLE, CONST|TMPVAR|CV, UNUSED)
4576+
{
4577+
USE_OPLINE
4578+
zval *retval_ptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
4579+
if (OP1_TYPE == IS_CONST) {
4580+
ZVAL_COPY(EX_VAR(opline->result.var), retval_ptr);
4581+
retval_ptr = EX_VAR(opline->result.var);
4582+
}
4583+
uint32_t pure_type_mask = opline->extended_value;
4584+
4585+
if (EXPECTED(ZEND_TYPE_MASK_CONTAINS_CODE(pure_type_mask, Z_TYPE_P(retval_ptr)))) {
4586+
ZEND_VM_NEXT_OPCODE();
4587+
} else if (EXPECTED(zend_verify_scalar_type_hint(pure_type_mask, retval_ptr, EX_USES_STRICT_TYPES(), /* is_internal*/ false))) {
4588+
ZEND_VM_NEXT_OPCODE();
4589+
} else {
4590+
SAVE_OPLINE();
4591+
zend_verify_return_error(EX(func), retval_ptr);
4592+
HANDLE_EXCEPTION();
4593+
}
4594+
}
4595+
45754596
ZEND_VM_COLD_HANDLER(201, ZEND_VERIFY_NEVER_TYPE, UNUSED, UNUSED)
45764597
{
45774598
SAVE_OPLINE();

0 commit comments

Comments
 (0)