@@ -250,7 +250,7 @@ impl<'de> Deserializer<'de> {
250250 . parse_decimal_number ( neg, start, offset)
251251 . map ( |n| ( start, n) ) ,
252252 Some ( ( _, '0' ..='9' ) ) => Err ( self . err_at ( start, ErrorCode :: LeadingZero ) ) ,
253- _ => Ok ( ( start, NumberResult :: U64 ( 0 ) ) ) ,
253+ _ => Ok ( ( start, NumberResult :: U128 ( 0 ) ) ) ,
254254 } ,
255255 ( offset, '.' | '1' ..='9' ) => self
256256 . parse_decimal_number ( neg, start, offset)
@@ -279,10 +279,10 @@ impl<'de> Deserializer<'de> {
279279 Ok ( NumberResult :: F64 ( self . parse_from_str ( start, offset) ?) )
280280 } else if neg {
281281 // https://doc.rust-lang.org/std/primitive.i64.html#method.from_str
282- Ok ( NumberResult :: I64 ( self . parse_from_str ( start, offset) ?) )
282+ Ok ( NumberResult :: I128 ( self . parse_from_str ( start, offset) ?) )
283283 } else {
284284 // https://doc.rust-lang.org/std/primitive.u64.html#method.from_str
285- Ok ( NumberResult :: U64 ( self . parse_from_str ( start, offset) ?) )
285+ Ok ( NumberResult :: U128 ( self . parse_from_str ( start, offset) ?) )
286286 }
287287 }
288288
@@ -301,7 +301,7 @@ impl<'de> Deserializer<'de> {
301301 if !c. is_ascii_hexdigit ( ) {
302302 return Err ( self . err_at ( offset, ErrorCode :: ExpectedNumber ) ) ;
303303 }
304- let mut n = u64 :: from ( c. to_digit ( 16 ) . expect ( "c is ascii hexdigit" ) ) ;
304+ let mut n = u128 :: from ( c. to_digit ( 16 ) . expect ( "c is ascii hexdigit" ) ) ;
305305
306306 while let Some ( ( offset, c) ) = self . peek ( )
307307 && c. is_ascii_hexdigit ( )
@@ -310,22 +310,22 @@ impl<'de> Deserializer<'de> {
310310 n = n
311311 . checked_mul ( 16 )
312312 . and_then ( |n| {
313- n. checked_add ( u64 :: from ( c. to_digit ( 16 ) . expect ( "c is ascii hexdigit" ) ) )
313+ n. checked_add ( u128 :: from ( c. to_digit ( 16 ) . expect ( "c is ascii hexdigit" ) ) )
314314 } )
315315 . ok_or ( self . err_at ( offset, ErrorCode :: OverflowParsingNumber ) ) ?;
316316 }
317317
318318 if neg {
319- // Special case for i64 ::MIN because -i64 ::MIN = i64 ::MAX + 1 doesn't fit in an i64 .
320- if n == 0x8000_0000_0000_0000 {
321- Ok ( NumberResult :: I64 ( i64 :: MIN ) )
319+ // Special case for i128 ::MIN because -i128 ::MIN = i128 ::MAX + 1 doesn't fit in an i128 .
320+ if n == 0x8000_0000_0000_0000_0000_0000_0000_0000 {
321+ Ok ( NumberResult :: I128 ( i128 :: MIN ) )
322322 } else {
323- Ok ( NumberResult :: I64 (
324- -i64 :: try_from ( n) . map_err ( |err| self . custom_err_at ( start, err) ) ?,
323+ Ok ( NumberResult :: I128 (
324+ -i128 :: try_from ( n) . map_err ( |err| self . custom_err_at ( start, err) ) ?,
325325 ) )
326326 }
327327 } else {
328- Ok ( NumberResult :: U64 ( n) )
328+ Ok ( NumberResult :: U128 ( n) )
329329 }
330330 }
331331
@@ -509,8 +509,20 @@ macro_rules! deserialize_number {
509509 fn $method<V : Visitor <' de>>( self , visitor: V ) -> Result <V :: Value > {
510510 let ( offset, number) = self . parse_number( ) ?;
511511 match number {
512- NumberResult :: U64 ( u) => visitor. visit_u64( u) ,
513- NumberResult :: I64 ( i) => visitor. visit_i64( i) ,
512+ NumberResult :: U128 ( u) => {
513+ if let Ok ( u) = u64 :: try_from( u) {
514+ visitor. visit_u64( u)
515+ } else {
516+ visitor. visit_u128( u)
517+ }
518+ }
519+ NumberResult :: I128 ( i) => {
520+ if let Ok ( i) = i64 :: try_from( i) {
521+ visitor. visit_i64( i)
522+ } else {
523+ visitor. visit_i128( i)
524+ }
525+ }
514526 NumberResult :: F64 ( f) => visitor. visit_f64( f) ,
515527 }
516528 . map_err( |err| self . with_position( err, offset) )
@@ -575,10 +587,12 @@ impl<'de> serde::de::Deserializer<'de> for &mut Deserializer<'de> {
575587 deserialize_number ! ( deserialize_u16) ;
576588 deserialize_number ! ( deserialize_u32) ;
577589 deserialize_number ! ( deserialize_u64) ;
590+ deserialize_number ! ( deserialize_u128) ;
578591 deserialize_number ! ( deserialize_i8) ;
579592 deserialize_number ! ( deserialize_i16) ;
580593 deserialize_number ! ( deserialize_i32) ;
581594 deserialize_number ! ( deserialize_i64) ;
595+ deserialize_number ! ( deserialize_i128) ;
582596 deserialize_number ! ( deserialize_f32) ;
583597 deserialize_number ! ( deserialize_f64) ;
584598
@@ -844,10 +858,12 @@ impl<'de> serde::de::Deserializer<'de> for MapKey<'_, 'de> {
844858 deserialize_key_from_str ! ( deserialize_u16, visit_u16) ;
845859 deserialize_key_from_str ! ( deserialize_u32, visit_u32) ;
846860 deserialize_key_from_str ! ( deserialize_u64, visit_u64) ;
861+ deserialize_key_from_str ! ( deserialize_u128, visit_u128) ;
847862 deserialize_key_from_str ! ( deserialize_i8, visit_i8) ;
848863 deserialize_key_from_str ! ( deserialize_i16, visit_i16) ;
849864 deserialize_key_from_str ! ( deserialize_i32, visit_i32) ;
850865 deserialize_key_from_str ! ( deserialize_i64, visit_i64) ;
866+ deserialize_key_from_str ! ( deserialize_i128, visit_i128) ;
851867 deserialize_key_from_str ! ( deserialize_f32, visit_f32) ;
852868 deserialize_key_from_str ! ( deserialize_f64, visit_f64) ;
853869
@@ -1031,7 +1047,7 @@ impl Deref for StringResult<'_> {
10311047}
10321048
10331049enum NumberResult {
1034- U64 ( u64 ) ,
1035- I64 ( i64 ) ,
1050+ U128 ( u128 ) ,
1051+ I128 ( i128 ) ,
10361052 F64 ( f64 ) ,
10371053}
0 commit comments