Skip to content

Commit c4492c1

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

File tree

3 files changed

+940
-554
lines changed

3 files changed

+940
-554
lines changed

Zend/zend_vm_def.h

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4531,6 +4531,44 @@ 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+
4538+
zval *op = GET_OP1_ZVAL_PTR(BP_VAR_R);
4539+
zval *result = EX_VAR(opline->result.var);
4540+
4541+
uint32_t pure_type_mask = opline->extended_value;
4542+
if (pure_type_mask & MAY_BE_LONG) {
4543+
ZVAL_LONG(result, Z_LVAL_P(op));
4544+
ZEND_VM_NEXT_OPCODE();
4545+
}
4546+
4547+
/* Type preference order: float -> string -> bool */
4548+
/* int to float is always valid even with strict types */
4549+
if (pure_type_mask & MAY_BE_DOUBLE) {
4550+
ZVAL_DOUBLE(result, (double)Z_LVAL_P(op));
4551+
ZEND_VM_NEXT_OPCODE();
4552+
}
4553+
4554+
if (UNEXPECTED(EX_USES_STRICT_TYPES())) {
4555+
SAVE_OPLINE();
4556+
zend_verify_return_error(EX(func), op);
4557+
HANDLE_EXCEPTION();
4558+
}
4559+
4560+
if (pure_type_mask & MAY_BE_STRING) {
4561+
ZVAL_STR(result, zend_long_to_str(Z_LVAL_P(op)));
4562+
} else if (pure_type_mask & MAY_BE_BOOL) {
4563+
ZVAL_BOOL(result, Z_LVAL_P(op));
4564+
} else {
4565+
SAVE_OPLINE();
4566+
zend_verify_return_error(EX(func), op);
4567+
HANDLE_EXCEPTION();
4568+
}
4569+
ZEND_VM_NEXT_OPCODE();
4570+
}
4571+
45344572
ZEND_VM_COLD_HANDLER(201, ZEND_VERIFY_NEVER_TYPE, UNUSED, UNUSED)
45354573
{
45364574
SAVE_OPLINE();

0 commit comments

Comments
 (0)