@@ -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+
45344575ZEND_VM_COLD_HANDLER (201 , ZEND_VERIFY_NEVER_TYPE , UNUSED , UNUSED )
45354576{
45364577 SAVE_OPLINE ();
0 commit comments