Skip to content

Commit 481cace

Browse files
committed
Zend: add VM spec for ZEND_VERIFY_TYPE_RETURN for integer values
1 parent bbd4833 commit 481cace

3 files changed

Lines changed: 941 additions & 554 deletions

File tree

Zend/zend_vm_def.h

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4531,6 +4531,43 @@ ZEND_VM_COLD_CONST_HANDLER(124, ZEND_VERIFY_RETURN_TYPE, CONST|TMP|VAR|UNUSED|CV
45314531
}
45324532
}
45334533

4534+
ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_VERIFY_RETURN_TYPE, (((res_info & MAY_BE_REF) == 0) && op1_info == MAY_BE_LONG), ZEND_VERIFY_RETURN_TYPE_FOR_LONG, CONST|TMP|VAR|CV, UNUSED)
4535+
{
4536+
USE_OPLINE
4537+
zval *op, *result;
4538+
4539+
op = GET_OP1_ZVAL_PTR(BP_VAR_R);
4540+
result = EX_VAR(opline->result.var);
4541+
4542+
uint32_t pure_type_mask = opline->extended_value;
4543+
/* Would have been elided by optimizer */
4544+
ZEND_ASSERT((pure_type_mask & MAY_BE_LONG) == 0);
4545+
4546+
/* Type preference order: float -> string -> bool */
4547+
/* int to float is always valid even with strict types */
4548+
if (pure_type_mask & MAY_BE_DOUBLE) {
4549+
ZVAL_DOUBLE(result, (double)Z_LVAL_P(op));
4550+
ZEND_VM_NEXT_OPCODE();
4551+
}
4552+
4553+
if (UNEXPECTED(EX_USES_STRICT_TYPES())) {
4554+
SAVE_OPLINE();
4555+
zend_verify_return_error(EX(func), result);
4556+
HANDLE_EXCEPTION();
4557+
}
4558+
4559+
if (pure_type_mask & MAY_BE_STRING) {
4560+
ZVAL_STR(result, zend_long_to_str(Z_LVAL_P(op)));
4561+
} else if (pure_type_mask & MAY_BE_BOOL) {
4562+
ZVAL_BOOL(result, Z_LVAL_P(op));
4563+
} else {
4564+
SAVE_OPLINE();
4565+
zend_verify_return_error(EX(func), op);
4566+
HANDLE_EXCEPTION();
4567+
}
4568+
ZEND_VM_NEXT_OPCODE();
4569+
}
4570+
45344571
ZEND_VM_COLD_HANDLER(201, ZEND_VERIFY_NEVER_TYPE, UNUSED, UNUSED)
45354572
{
45364573
SAVE_OPLINE();

0 commit comments

Comments
 (0)