Skip to content

Commit da65b90

Browse files
authored
Rollup merge of #128641 - Konippi:standardize-duplicate-processes-in-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
2 parents a073004 + 341511a commit da65b90

File tree

1 file changed

+24
-32
lines changed

1 file changed

+24
-32
lines changed

library/core/src/net/parser.rs

+24-32
Original file line numberDiff line numberDiff line change
@@ -112,18 +112,18 @@ impl<'a> Parser<'a> {
112112
max_digits: Option<usize>,
113113
allow_zero_prefix: bool,
114114
) -> Option<T> {
115-
// If max_digits.is_some(), then we are parsing a `u8` or `u16` and
116-
// don't need to use checked arithmetic since it fits within a `u32`.
117-
if let Some(max_digits) = max_digits {
118-
// u32::MAX = 4_294_967_295u32, which is 10 digits long.
119-
// `max_digits` must be less than 10 to not overflow a `u32`.
120-
debug_assert!(max_digits < 10);
121-
122-
self.read_atomically(move |p| {
123-
let mut result = 0_u32;
124-
let mut digit_count = 0;
125-
let has_leading_zero = p.peek_char() == Some('0');
115+
self.read_atomically(move |p| {
116+
let mut digit_count = 0;
117+
let has_leading_zero = p.peek_char() == Some('0');
118+
119+
// If max_digits.is_some(), then we are parsing a `u8` or `u16` and
120+
// don't need to use checked arithmetic since it fits within a `u32`.
121+
let result = if let Some(max_digits) = max_digits {
122+
// u32::MAX = 4_294_967_295u32, which is 10 digits long.
123+
// `max_digits` must be less than 10 to not overflow a `u32`.
124+
debug_assert!(max_digits < 10);
126125

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

137-
if digit_count == 0 {
138-
None
139-
} else if !allow_zero_prefix && has_leading_zero && digit_count > 1 {
140-
None
141-
} else {
142-
result.try_into().ok()
143-
}
144-
})
145-
} else {
146-
self.read_atomically(move |p| {
137+
result.try_into().ok()
138+
} else {
147139
let mut result = T::ZERO;
148-
let mut digit_count = 0;
149-
let has_leading_zero = p.peek_char() == Some('0');
150140

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

157-
if digit_count == 0 {
158-
None
159-
} else if !allow_zero_prefix && has_leading_zero && digit_count > 1 {
160-
None
161-
} else {
162-
Some(result)
163-
}
164-
})
165-
}
147+
Some(result)
148+
};
149+
150+
if digit_count == 0 {
151+
None
152+
} else if !allow_zero_prefix && has_leading_zero && digit_count > 1 {
153+
None
154+
} else {
155+
result
156+
}
157+
})
166158
}
167159

168160
/// Reads an IPv4 address.

0 commit comments

Comments
 (0)