@@ -237,13 +237,18 @@ impl<'tcx, Tag> Scalar<Tag> {
237
237
}
238
238
239
239
#[ inline]
240
- pub fn from_uint ( i : impl Into < u128 > , size : Size ) -> Self {
240
+ pub fn try_from_uint ( i : impl Into < u128 > , size : Size ) -> InterpResult < ' tcx , Self > {
241
241
let i = i. into ( ) ;
242
- assert_eq ! (
243
- truncate( i, size) , i,
244
- "Unsigned value {:#x} does not fit in {} bits" , i, size. bits( )
245
- ) ;
246
- Scalar :: Raw { data : i, size : size. bytes ( ) as u8 }
242
+ if truncate ( i, size) == i {
243
+ Ok ( Scalar :: Raw { data : i, size : size. bytes ( ) as u8 } )
244
+ } else {
245
+ throw_unsup_format ! ( "Unsigned value {:#x} does not fit in {} bits" , i, size. bits( ) )
246
+ }
247
+ }
248
+
249
+ #[ inline]
250
+ pub fn from_uint ( i : impl Into < u128 > , size : Size ) -> Self {
251
+ Self :: try_from_uint ( i, size) . unwrap ( )
247
252
}
248
253
249
254
#[ inline]
@@ -267,15 +272,20 @@ impl<'tcx, Tag> Scalar<Tag> {
267
272
}
268
273
269
274
#[ inline]
270
- pub fn from_int ( i : impl Into < i128 > , size : Size ) -> Self {
275
+ pub fn try_from_int ( i : impl Into < i128 > , size : Size ) -> InterpResult < ' tcx , Self > {
271
276
let i = i. into ( ) ;
272
277
// `into` performed sign extension, we have to truncate
273
278
let truncated = truncate ( i as u128 , size) ;
274
- assert_eq ! (
275
- sign_extend( truncated, size) as i128 , i,
276
- "Signed value {:#x} does not fit in {} bits" , i, size. bits( )
277
- ) ;
278
- Scalar :: Raw { data : truncated, size : size. bytes ( ) as u8 }
279
+ if sign_extend ( truncated, size) as i128 == i {
280
+ Ok ( Scalar :: Raw { data : truncated, size : size. bytes ( ) as u8 } )
281
+ } else {
282
+ throw_unsup_format ! ( "Signed value {:#x} does not fit in {} bits" , i, size. bits( ) )
283
+ }
284
+ }
285
+
286
+ #[ inline]
287
+ pub fn from_int ( i : impl Into < i128 > , size : Size ) -> Self {
288
+ Self :: try_from_int ( i, size) . unwrap ( )
279
289
}
280
290
281
291
#[ inline]
0 commit comments