Skip to content

Commit 809eec7

Browse files
authored
Remove all direct uses of unwrap_or_return! (#598)
In modern rust this macro can easily be replaced by let-else expressions. Some uses inside other macros remain, those are not as easy to remove. Signed-off-by: Simon Wülker <[email protected]>
1 parent cb63d4f commit 809eec7

File tree

3 files changed

+81
-67
lines changed

3 files changed

+81
-67
lines changed

html5ever/src/tokenizer/char_ref/mod.rs

+22-16
Original file line numberDiff line numberDiff line change
@@ -137,19 +137,19 @@ impl CharRefTokenizer {
137137
tokenizer: &Tokenizer<Sink>,
138138
input: &BufferQueue,
139139
) -> Status {
140-
match unwrap_or_return!(tokenizer.peek(input), Stuck) {
141-
'a'..='z' | 'A'..='Z' | '0'..='9' => {
140+
match tokenizer.peek(input) {
141+
Some('a'..='z' | 'A'..='Z' | '0'..='9') => {
142142
self.state = Named;
143143
self.name_buf_opt = Some(StrTendril::new());
144144
Progress
145145
},
146-
147-
'#' => {
146+
Some('#') => {
148147
tokenizer.discard_char(input);
149148
self.state = Octothorpe;
150149
Progress
151150
},
152-
_ => self.finish_none(),
151+
Some(_) => self.finish_none(),
152+
None => Stuck,
153153
}
154154
}
155155

@@ -158,18 +158,17 @@ impl CharRefTokenizer {
158158
tokenizer: &Tokenizer<Sink>,
159159
input: &BufferQueue,
160160
) -> Status {
161-
let c = unwrap_or_return!(tokenizer.peek(input), Stuck);
162-
match c {
163-
'x' | 'X' => {
161+
match tokenizer.peek(input) {
162+
Some(c @ ('x' | 'X')) => {
164163
tokenizer.discard_char(input);
165164
self.hex_marker = Some(c);
166165
self.state = Numeric(16);
167166
},
168-
169-
_ => {
167+
Some(_) => {
170168
self.hex_marker = None;
171169
self.state = Numeric(10);
172170
},
171+
None => return Stuck,
173172
}
174173
Progress
175174
}
@@ -180,7 +179,9 @@ impl CharRefTokenizer {
180179
input: &BufferQueue,
181180
base: u32,
182181
) -> Status {
183-
let c = unwrap_or_return!(tokenizer.peek(input), Stuck);
182+
let Some(c) = tokenizer.peek(input) else {
183+
return Stuck;
184+
};
184185
match c.to_digit(base) {
185186
Some(n) => {
186187
tokenizer.discard_char(input);
@@ -209,11 +210,12 @@ impl CharRefTokenizer {
209210
tokenizer: &Tokenizer<Sink>,
210211
input: &BufferQueue,
211212
) -> Status {
212-
match unwrap_or_return!(tokenizer.peek(input), Stuck) {
213-
';' => tokenizer.discard_char(input),
214-
_ => tokenizer.emit_error(Borrowed(
213+
match tokenizer.peek(input) {
214+
Some(';') => tokenizer.discard_char(input),
215+
Some(_) => tokenizer.emit_error(Borrowed(
215216
"Semicolon missing after numeric character reference",
216217
)),
218+
None => return Stuck,
217219
};
218220
self.finish_numeric(tokenizer)
219221
}
@@ -274,7 +276,9 @@ impl CharRefTokenizer {
274276
) -> Status {
275277
// peek + discard skips over newline normalization, therefore making it easier to
276278
// un-consume
277-
let c = unwrap_or_return!(tokenizer.peek(input), Stuck);
279+
let Some(c) = tokenizer.peek(input) else {
280+
return Stuck;
281+
};
278282
tokenizer.discard_char(input);
279283
self.name_buf_mut().push_char(c);
280284
match data::NAMED_ENTITIES.get(&self.name_buf()[..]) {
@@ -399,7 +403,9 @@ impl CharRefTokenizer {
399403
) -> Status {
400404
// peek + discard skips over newline normalization, therefore making it easier to
401405
// un-consume
402-
let c = unwrap_or_return!(tokenizer.peek(input), Stuck);
406+
let Some(c) = tokenizer.peek(input) else {
407+
return Stuck;
408+
};
403409
tokenizer.discard_char(input);
404410
self.name_buf_mut().push_char(c);
405411
match c {

html5ever/src/tree_builder/mod.rs

+56-50
Original file line numberDiff line numberDiff line change
@@ -350,16 +350,16 @@ where
350350
self.sink
351351
.parse_error(Borrowed("Unacknowledged self-closing tag"));
352352
}
353-
token = unwrap_or_return!(
354-
more_tokens.pop_front(),
355-
tokenizer::TokenSinkResult::Continue
356-
);
353+
let Some(new_token) = more_tokens.pop_front() else {
354+
return tokenizer::TokenSinkResult::Continue;
355+
};
356+
token = new_token;
357357
},
358358
ProcessResult::DoneAckSelfClosing => {
359-
token = unwrap_or_return!(
360-
more_tokens.pop_front(),
361-
tokenizer::TokenSinkResult::Continue
362-
);
359+
let Some(new_token) = more_tokens.pop_front() else {
360+
return tokenizer::TokenSinkResult::Continue;
361+
};
362+
token = new_token;
363363
},
364364
ProcessResult::Reprocess(m, t) => {
365365
self.mode.set(m);
@@ -370,7 +370,9 @@ where
370370
},
371371
ProcessResult::SplitWhitespace(mut buf) => {
372372
let p = buf.pop_front_char_run(|c| c.is_ascii_whitespace());
373-
let (first, is_ws) = unwrap_or_return!(p, tokenizer::TokenSinkResult::Continue);
373+
let Some((first, is_ws)) = p else {
374+
return tokenizer::TokenSinkResult::Continue;
375+
};
374376
let status = if is_ws {
375377
SplitStatus::Whitespace
376378
} else {
@@ -714,33 +716,33 @@ where
714716
// 2. 3. 4.
715717
for _ in 0..8 {
716718
// 5.
717-
let (fmt_elem_index, fmt_elem, fmt_elem_tag) = unwrap_or_return!(
718-
// We clone the Handle and Tag so they don't cause an immutable borrow of self.
719-
self.active_formatting_end_to_marker()
720-
.iter()
721-
.find(|&(_, _, tag)| tag.name == subject)
722-
.map(|(i, h, t)| (i, h.clone(), t.clone())),
723-
{
724-
self.process_end_tag_in_body(Tag {
725-
kind: EndTag,
726-
name: subject,
727-
self_closing: false,
728-
attrs: vec![],
729-
});
730-
}
731-
);
719+
// We clone the Handle and Tag so they don't cause an immutable borrow of self.
720+
let maybe_fmt_entry = self
721+
.active_formatting_end_to_marker()
722+
.iter()
723+
.find(|&(_, _, tag)| tag.name == subject)
724+
.map(|(i, h, t)| (i, h.clone(), t.clone()));
725+
726+
let Some((fmt_elem_index, fmt_elem, fmt_elem_tag)) = maybe_fmt_entry else {
727+
return self.process_end_tag_in_body(Tag {
728+
kind: EndTag,
729+
name: subject,
730+
self_closing: false,
731+
attrs: vec![],
732+
});
733+
};
732734

733-
let fmt_elem_stack_index = unwrap_or_return!(
734-
self.open_elems
735-
.borrow()
736-
.iter()
737-
.rposition(|n| self.sink.same_node(n, &fmt_elem)),
738-
{
739-
self.sink
740-
.parse_error(Borrowed("Formatting element not open"));
741-
self.active_formatting.borrow_mut().remove(fmt_elem_index);
742-
}
743-
);
735+
let Some(fmt_elem_stack_index) = self
736+
.open_elems
737+
.borrow()
738+
.iter()
739+
.rposition(|n| self.sink.same_node(n, &fmt_elem))
740+
else {
741+
self.sink
742+
.parse_error(Borrowed("Formatting element not open"));
743+
self.active_formatting.borrow_mut().remove(fmt_elem_index);
744+
return;
745+
};
744746

745747
// 7.
746748
if !self.in_scope(default_scope, |n| self.sink.same_node(&n, &fmt_elem)) {
@@ -756,20 +758,21 @@ where
756758
}
757759

758760
// 9.
759-
let (furthest_block_index, furthest_block) = unwrap_or_return!(
760-
self.open_elems
761-
.borrow()
762-
.iter()
763-
.enumerate()
764-
.skip(fmt_elem_stack_index)
765-
.find(|&(_, open_element)| self.elem_in(open_element, special_tag))
766-
.map(|(i, h)| (i, h.clone())),
761+
let maybe_furthest_block = self
762+
.open_elems
763+
.borrow()
764+
.iter()
765+
.enumerate()
766+
.skip(fmt_elem_stack_index)
767+
.find(|&(_, open_element)| self.elem_in(open_element, special_tag))
768+
.map(|(i, h)| (i, h.clone()));
769+
770+
let Some((furthest_block_index, furthest_block)) = maybe_furthest_block else {
767771
// 10.
768-
{
769-
self.open_elems.borrow_mut().truncate(fmt_elem_stack_index);
770-
self.active_formatting.borrow_mut().remove(fmt_elem_index);
771-
}
772-
);
772+
self.open_elems.borrow_mut().truncate(fmt_elem_stack_index);
773+
self.active_formatting.borrow_mut().remove(fmt_elem_index);
774+
return;
775+
};
773776

774777
// 11.
775778
let common_ancestor = self.open_elems.borrow()[fmt_elem_stack_index - 1].clone();
@@ -1569,11 +1572,14 @@ where
15691572
}
15701573

15711574
fn handle_misnested_a_tags(&self, tag: &Tag) {
1572-
let node = unwrap_or_return!(self
1575+
let Some(node) = self
15731576
.active_formatting_end_to_marker()
15741577
.iter()
15751578
.find(|&(_, n, _)| self.html_elem_named(n, local_name!("a")))
1576-
.map(|(_, n, _)| n.clone()));
1579+
.map(|(_, n, _)| n.clone())
1580+
else {
1581+
return;
1582+
};
15771583

15781584
self.unexpected(tag);
15791585
self.adoption_agency(local_name!("a"));

html5ever/src/tree_builder/rules.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,9 @@ where
329329
self.unexpected(&tag);
330330
if !self.frameset_ok.get() { return ProcessResult::Done; }
331331

332-
let body = unwrap_or_return!(self.body_elem(), ProcessResult::Done).clone();
332+
let Some(body) = self.body_elem().map(|b| b.clone()) else {
333+
return ProcessResult::Done;
334+
};
333335
self.sink.remove_from_parent(&body);
334336

335337
// FIXME: can we get here in the fragment case?

0 commit comments

Comments
 (0)