@@ -4531,6 +4531,45 @@ 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 * op = GET_OP1_ZVAL_PTR_UNDEF (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+ /* Need to prevent possible array key conversion with ArrayAccess */
4562+ ZVAL_STR (OP1_TYPE == IS_CONST ? result : op , zend_long_to_str (Z_LVAL_P (op )));
4563+ } else if (pure_type_mask & MAY_BE_BOOL ) {
4564+ ZVAL_BOOL (result , Z_LVAL_P (op ));
4565+ } else {
4566+ SAVE_OPLINE ();
4567+ zend_verify_return_error (EX (func ), op );
4568+ HANDLE_EXCEPTION ();
4569+ }
4570+ ZEND_VM_NEXT_OPCODE ();
4571+ }
4572+
45344573ZEND_VM_COLD_HANDLER (201 , ZEND_VERIFY_NEVER_TYPE , UNUSED , UNUSED )
45354574{
45364575 SAVE_OPLINE ();
0 commit comments