@@ -5534,17 +5534,15 @@ interp_exec_method (InterpFrame *frame, ThreadContext *context, FrameClauseArgs
5534
5534
}
5535
5535
MINT_IN_CASE (MINT_CONV_OVF_U8_R4 ) {
5536
5536
float val = LOCAL_VAR (ip [2 ], float );
5537
- if (mono_isnan (val ) || mono_trunc ( val ) != ( guint64 ) val )
5537
+ if (! mono_try_trunc_u64 (val , ( guint64 * )( locals + ip [ 1 ])) )
5538
5538
THROW_EX (mono_get_exception_overflow (), ip );
5539
- LOCAL_VAR (ip [1 ], guint64 ) = (guint64 )val ;
5540
5539
ip + = 3 ;
5541
5540
MINT_IN_BREAK ;
5542
5541
}
5543
5542
MINT_IN_CASE (MINT_CONV_OVF_U8_R8 ) {
5544
5543
double val = LOCAL_VAR (ip [2 ], double );
5545
- if (mono_isnan (val ) || mono_trunc ( val ) != ( guint64 ) val )
5544
+ if (! mono_try_trunc_u64 (val , ( guint64 * )( locals + ip [ 1 ])) )
5546
5545
THROW_EX (mono_get_exception_overflow (), ip );
5547
- LOCAL_VAR (ip [1 ], guint64 ) = (guint64 )val ;
5548
5546
ip + = 3 ;
5549
5547
MINT_IN_BREAK ;
5550
5548
}
@@ -5566,17 +5564,15 @@ interp_exec_method (InterpFrame *frame, ThreadContext *context, FrameClauseArgs
5566
5564
}
5567
5565
MINT_IN_CASE (MINT_CONV_OVF_I8_R4 ) {
5568
5566
float val = LOCAL_VAR (ip [2 ], float );
5569
- if (mono_isnan (val ) || mono_trunc ( val ) != ( gint64 ) val )
5567
+ if (! mono_try_trunc_i64 (val , ( gint64 * )( locals + ip [ 1 ])) )
5570
5568
THROW_EX (mono_get_exception_overflow (), ip );
5571
- LOCAL_VAR (ip [1 ], gint64 ) = (gint64 )val ;
5572
5569
ip + = 3 ;
5573
5570
MINT_IN_BREAK ;
5574
5571
}
5575
5572
MINT_IN_CASE (MINT_CONV_OVF_I8_R8 ) {
5576
5573
double val = LOCAL_VAR (ip [2 ], double );
5577
- if (mono_isnan (val ) || mono_trunc ( val ) != ( gint64 ) val )
5574
+ if (! mono_try_trunc_i64 (val , ( gint64 * )( locals + ip [ 1 ])) )
5578
5575
THROW_EX (mono_get_exception_overflow (), ip );
5579
- LOCAL_VAR (ip [1 ], gint64 ) = (gint64 )val ;
5580
5576
ip + = 3 ;
5581
5577
MINT_IN_BREAK ;
5582
5578
}
@@ -5878,17 +5874,20 @@ interp_exec_method (InterpFrame *frame, ThreadContext *context, FrameClauseArgs
5878
5874
}
5879
5875
MINT_IN_CASE (MINT_CONV_OVF_I4_R4 ) {
5880
5876
float val = LOCAL_VAR (ip [2 ], float );
5881
- if (mono_isnan (val ) || mono_trunc (val ) != (gint32 )val )
5877
+ double val_r8 = (double )val ;
5878
+ if (val_r8 > ((double )G_MININT32 - 1 ) && val_r8 < ((double )G_MAXINT32 + 1 ))
5879
+ LOCAL_VAR (ip [1 ], gint32 ) = (gint32 ) val ;
5880
+ else
5882
5881
THROW_EX (mono_get_exception_overflow (), ip );
5883
- LOCAL_VAR (ip [1 ], gint32 ) = (gint32 ) val ;
5884
5882
ip + = 3 ;
5885
5883
MINT_IN_BREAK ;
5886
5884
}
5887
5885
MINT_IN_CASE (MINT_CONV_OVF_I4_R8 ) {
5888
5886
double val = LOCAL_VAR (ip [2 ], double );
5889
- if (val < G_MININT32 || val > G_MAXINT32 || isnan (val ))
5887
+ if (val > ((double )G_MININT32 - 1 ) && val < ((double )G_MAXINT32 + 1 ))
5888
+ LOCAL_VAR (ip [1 ], gint32 ) = (gint32 ) val ;
5889
+ else
5890
5890
THROW_EX (mono_get_exception_overflow (), ip );
5891
- LOCAL_VAR (ip [1 ], gint32 ) = (gint32 )val ;
5892
5891
ip + = 3 ;
5893
5892
MINT_IN_BREAK ;
5894
5893
}
@@ -5910,17 +5909,20 @@ interp_exec_method (InterpFrame *frame, ThreadContext *context, FrameClauseArgs
5910
5909
}
5911
5910
MINT_IN_CASE (MINT_CONV_OVF_U4_R4 ) {
5912
5911
float val = LOCAL_VAR (ip [2 ], float );
5913
- if (mono_isnan (val ) || mono_trunc (val ) != (guint32 )val )
5912
+ double val_r8 = val ;
5913
+ if (val_r8 > -1.0 && val_r8 < ((double )G_MAXUINT32 + 1 ))
5914
+ LOCAL_VAR (ip [1 ], gint32 ) = (guint32 )val ;
5915
+ else
5914
5916
THROW_EX (mono_get_exception_overflow (), ip );
5915
- LOCAL_VAR (ip [1 ], gint32 ) = (guint32 )val ;
5916
5917
ip + = 3 ;
5917
5918
MINT_IN_BREAK ;
5918
5919
}
5919
5920
MINT_IN_CASE (MINT_CONV_OVF_U4_R8 ) {
5920
5921
double val = LOCAL_VAR (ip [2 ], double );
5921
- if (val < 0 || val > G_MAXUINT32 || isnan (val ))
5922
+ if (val > -1.0 && val < ((double )G_MAXUINT32 + 1 ))
5923
+ LOCAL_VAR (ip [1 ], gint32 ) = (guint32 )val ;
5924
+ else
5922
5925
THROW_EX (mono_get_exception_overflow (), ip );
5923
- LOCAL_VAR (ip [1 ], gint32 ) = (guint32 ) val ;
5924
5926
ip + = 3 ;
5925
5927
MINT_IN_BREAK ;
5926
5928
}
@@ -5958,17 +5960,19 @@ interp_exec_method (InterpFrame *frame, ThreadContext *context, FrameClauseArgs
5958
5960
}
5959
5961
MINT_IN_CASE (MINT_CONV_OVF_I2_R4 ) {
5960
5962
float val = LOCAL_VAR (ip [2 ], float );
5961
- if (val < G_MININT16 || val > G_MAXINT16 || isnan (val ))
5963
+ if (val > (G_MININT16 - 1 ) && val < (G_MAXINT16 + 1 ))
5964
+ LOCAL_VAR (ip [1 ], gint32 ) = (gint16 ) val ;
5965
+ else
5962
5966
THROW_EX (mono_get_exception_overflow (), ip );
5963
- LOCAL_VAR (ip [1 ], gint32 ) = (gint16 ) val ;
5964
5967
ip + = 3 ;
5965
5968
MINT_IN_BREAK ;
5966
5969
}
5967
5970
MINT_IN_CASE (MINT_CONV_OVF_I2_R8 ) {
5968
5971
double val = LOCAL_VAR (ip [2 ], double );
5969
- if (val < G_MININT16 || val > G_MAXINT16 || isnan (val ))
5972
+ if (val > (G_MININT16 - 1 ) && val < (G_MAXINT16 + 1 ))
5973
+ LOCAL_VAR (ip [1 ], gint32 ) = (gint16 ) val ;
5974
+ else
5970
5975
THROW_EX (mono_get_exception_overflow (), ip );
5971
- LOCAL_VAR (ip [1 ], gint32 ) = (gint16 ) val ;
5972
5976
ip + = 3 ;
5973
5977
MINT_IN_BREAK ;
5974
5978
}
@@ -6005,17 +6009,19 @@ interp_exec_method (InterpFrame *frame, ThreadContext *context, FrameClauseArgs
6005
6009
}
6006
6010
MINT_IN_CASE (MINT_CONV_OVF_U2_R4 ) {
6007
6011
float val = LOCAL_VAR (ip [2 ], float );
6008
- if (val < 0 || val > G_MAXUINT16 || isnan (val ))
6012
+ if (val > -1.0f && val < (G_MAXUINT16 + 1 ))
6013
+ LOCAL_VAR (ip [1 ], gint32 ) = (guint16 ) val ;
6014
+ else
6009
6015
THROW_EX (mono_get_exception_overflow (), ip );
6010
- LOCAL_VAR (ip [1 ], gint32 ) = (guint16 ) val ;
6011
6016
ip + = 3 ;
6012
6017
MINT_IN_BREAK ;
6013
6018
}
6014
6019
MINT_IN_CASE (MINT_CONV_OVF_U2_R8 ) {
6015
6020
double val = LOCAL_VAR (ip [2 ], double );
6016
- if (val < 0 || val > G_MAXUINT16 || isnan (val ))
6021
+ if (val > -1.0 && val < (G_MAXUINT16 + 1 ))
6022
+ LOCAL_VAR (ip [1 ], gint32 ) = (guint16 ) val ;
6023
+ else
6017
6024
THROW_EX (mono_get_exception_overflow (), ip );
6018
- LOCAL_VAR (ip [1 ], gint32 ) = (guint16 ) val ;
6019
6025
ip + = 3 ;
6020
6026
MINT_IN_BREAK ;
6021
6027
}
@@ -6053,17 +6059,19 @@ interp_exec_method (InterpFrame *frame, ThreadContext *context, FrameClauseArgs
6053
6059
}
6054
6060
MINT_IN_CASE (MINT_CONV_OVF_I1_R4 ) {
6055
6061
float val = LOCAL_VAR (ip [2 ], float );
6056
- if (val < G_MININT8 || val > G_MAXINT8 || isnan (val ))
6062
+ if (val > (G_MININT8 - 1 ) && val < (G_MAXINT8 + 1 ))
6063
+ LOCAL_VAR (ip [1 ], gint32 ) = (gint8 ) val ;
6064
+ else
6057
6065
THROW_EX (mono_get_exception_overflow (), ip );
6058
- LOCAL_VAR (ip [1 ], gint32 ) = (gint8 ) val ;
6059
6066
ip + = 3 ;
6060
6067
MINT_IN_BREAK ;
6061
6068
}
6062
6069
MINT_IN_CASE (MINT_CONV_OVF_I1_R8 ) {
6063
6070
double val = LOCAL_VAR (ip [2 ], double );
6064
- if (val < G_MININT8 || val > G_MAXINT8 || isnan (val ))
6071
+ if (val > (G_MININT8 - 1 ) && val < (G_MAXINT8 + 1 ))
6072
+ LOCAL_VAR (ip [1 ], gint32 ) = (gint8 ) val ;
6073
+ else
6065
6074
THROW_EX (mono_get_exception_overflow (), ip );
6066
- LOCAL_VAR (ip [1 ], gint32 ) = (gint8 ) val ;
6067
6075
ip + = 3 ;
6068
6076
MINT_IN_BREAK ;
6069
6077
}
@@ -6101,17 +6109,19 @@ interp_exec_method (InterpFrame *frame, ThreadContext *context, FrameClauseArgs
6101
6109
}
6102
6110
MINT_IN_CASE (MINT_CONV_OVF_U1_R4 ) {
6103
6111
float val = LOCAL_VAR (ip [2 ], float );
6104
- if (val < 0 || val > G_MAXUINT8 || isnan (val ))
6112
+ if (val > -1.0f && val < (G_MAXUINT8 + 1 ))
6113
+ LOCAL_VAR (ip [1 ], gint32 ) = (guint8 )val ;
6114
+ else
6105
6115
THROW_EX (mono_get_exception_overflow (), ip );
6106
- LOCAL_VAR (ip [1 ], gint32 ) = (guint8 ) val ;
6107
6116
ip + = 3 ;
6108
6117
MINT_IN_BREAK ;
6109
6118
}
6110
6119
MINT_IN_CASE (MINT_CONV_OVF_U1_R8 ) {
6111
6120
double val = LOCAL_VAR (ip [2 ], double );
6112
- if (val < 0 || val > G_MAXUINT8 || isnan (val ))
6121
+ if (val > -1.0 && val < (G_MAXUINT8 + 1 ))
6122
+ LOCAL_VAR (ip [1 ], gint32 ) = (guint8 )val ;
6123
+ else
6113
6124
THROW_EX (mono_get_exception_overflow (), ip );
6114
- LOCAL_VAR (ip [1 ], gint32 ) = (guint8 ) val ;
6115
6125
ip + = 3 ;
6116
6126
MINT_IN_BREAK ;
6117
6127
}
0 commit comments