Skip to content

Commit

Permalink
Rollup merge of #128641 - Konippi:standardize-duplicate-processes-in-…
Browse files Browse the repository at this point in the history
…parser, r=scottmcm

refactor: standardize duplicate processes in parser

## Summary
This PR refactors the `read_number` function to standardize duplicate code, improve readability, and enhance efficiency.

## Changes
- Merged the logic for both `max_digits` cases into a single `read_atomically` closure
- Simplified control flow and reduced code duplication
  • Loading branch information
matthiaskrgr authored Sep 1, 2024
2 parents a073004 + 341511a commit da65b90
Showing 1 changed file with 24 additions and 32 deletions.
56 changes: 24 additions & 32 deletions library/core/src/net/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -112,18 +112,18 @@ impl<'a> Parser<'a> {
max_digits: Option<usize>,
allow_zero_prefix: bool,
) -> Option<T> {
// If max_digits.is_some(), then we are parsing a `u8` or `u16` and
// don't need to use checked arithmetic since it fits within a `u32`.
if let Some(max_digits) = max_digits {
// u32::MAX = 4_294_967_295u32, which is 10 digits long.
// `max_digits` must be less than 10 to not overflow a `u32`.
debug_assert!(max_digits < 10);

self.read_atomically(move |p| {
let mut result = 0_u32;
let mut digit_count = 0;
let has_leading_zero = p.peek_char() == Some('0');
self.read_atomically(move |p| {
let mut digit_count = 0;
let has_leading_zero = p.peek_char() == Some('0');

// If max_digits.is_some(), then we are parsing a `u8` or `u16` and
// don't need to use checked arithmetic since it fits within a `u32`.
let result = if let Some(max_digits) = max_digits {
// u32::MAX = 4_294_967_295u32, which is 10 digits long.
// `max_digits` must be less than 10 to not overflow a `u32`.
debug_assert!(max_digits < 10);

let mut result = 0_u32;
while let Some(digit) = p.read_atomically(|p| p.read_char()?.to_digit(radix)) {
result *= radix;
result += digit;
Expand All @@ -134,35 +134,27 @@ impl<'a> Parser<'a> {
}
}

if digit_count == 0 {
None
} else if !allow_zero_prefix && has_leading_zero && digit_count > 1 {
None
} else {
result.try_into().ok()
}
})
} else {
self.read_atomically(move |p| {
result.try_into().ok()
} else {
let mut result = T::ZERO;
let mut digit_count = 0;
let has_leading_zero = p.peek_char() == Some('0');

while let Some(digit) = p.read_atomically(|p| p.read_char()?.to_digit(radix)) {
result = result.checked_mul(radix)?;
result = result.checked_add(digit)?;
digit_count += 1;
}

if digit_count == 0 {
None
} else if !allow_zero_prefix && has_leading_zero && digit_count > 1 {
None
} else {
Some(result)
}
})
}
Some(result)
};

if digit_count == 0 {
None
} else if !allow_zero_prefix && has_leading_zero && digit_count > 1 {
None
} else {
result
}
})
}

/// Reads an IPv4 address.
Expand Down

0 comments on commit da65b90

Please sign in to comment.