Skip to content

Commit 9057477

Browse files
committed
Zend: add VM spec for ZEND_VERIFY_TYPE_RETURN for integer values
1 parent c22c4c8 commit 9057477

3 files changed

Lines changed: 880 additions & 554 deletions

File tree

Zend/zend_vm_def.h

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

0 commit comments

Comments
 (0)