Kaynağa Gözat

bigint: Create the parsing error better for nested `+`

If a `+` is encountered in the middle of parsing a BigUint, this should
generate an `ParseIntError::InvalidDigit`.  Since we can't create that
directly, we get it by trying to parse a `u64` from this point, but of
course `+` is a perfectly valid prefix to a `u64`.

Now we include the previous character in the string passed to `u64`, so
it has proper parsing context to understand what's in error.

Fixes #268.
Josh Stone 8 yıl önce
ebeveyn
işleme
0b6cae0dc7
2 değiştirilmiş dosya ile 5 ekleme ve 1 silme
  1. 3 1
      bigint/src/biguint.rs
  2. 2 0
      bigint/src/tests/biguint.rs

+ 3 - 1
bigint/src/biguint.rs

@@ -242,7 +242,9 @@ impl Num for BigUint {
                 v.push(d);
             } else {
                 // create ParseIntError::InvalidDigit
-                let e = u64::from_str_radix(&s[v.len()..], radix).unwrap_err();
+                // Include the previous character for context.
+                let i = cmp::max(v.len(), 1) - 1;
+                let e = u64::from_str_radix(&s[i..], radix).unwrap_err();
                 return Err(e.into());
             }
         }

+ 2 - 0
bigint/src/tests/biguint.rs

@@ -1041,6 +1041,8 @@ fn test_from_str_radix() {
     assert_eq!(plus_plus_one, None);
     let minus_one = BigUint::from_str_radix("-1", 10).ok();
     assert_eq!(minus_one, None);
+    let zero_plus_two = BigUint::from_str_radix("0+2", 10).ok();
+    assert_eq!(zero_plus_two, None);
 }
 
 #[test]