Skip to content

Commit 6ed1ff3

Browse files
committed
1 parent 62df412 commit 6ed1ff3

File tree

2 files changed

+32
-18
lines changed

2 files changed

+32
-18
lines changed

src/tree_builder/actions.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ pub enum PushFlag {
5252
// These go in a trait so that we can control visibility.
5353
pub trait TreeBuilderActions<Handle> {
5454
fn unexpected<T: Show>(&mut self, thing: &T) -> ProcessResult;
55+
fn assert_named(&mut self, node: Handle, name: Atom);
5556
fn clear_active_formatting_to_marker(&mut self);
5657
fn create_formatting_element_for(&mut self, tag: Tag) -> Handle;
5758
fn append_text(&mut self, text: String) -> ProcessResult;
@@ -111,6 +112,10 @@ impl<'sink, Handle: Clone, Sink: TreeSink<Handle>>
111112
Done
112113
}
113114

115+
fn assert_named(&mut self, node: Handle, name: Atom) {
116+
assert!(self.html_elem_named(node, name));
117+
}
118+
114119
/// Iterate over the active formatting elements (with index in the list) from the end
115120
/// to the last marker, or the beginning if there are no markers.
116121
fn active_formatting_end_to_marker<'a>(&'a self) -> ActiveFormattingIter<'a, Handle> {

src/tree_builder/rules.rs

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,11 @@ impl<'sink, Handle: Clone, Sink: TreeSink<Handle>>
280280
self.unexpected(&tag);
281281
if !self.frameset_ok { return Done; }
282282

283-
let body = unwrap_or_return!(self.body_elem(), Done);
283+
// Can't use unwrap_or_return!() due to rust-lang/rust#16617.
284+
let body = match self.body_elem() {
285+
None => return Done,
286+
Some(x) => x,
287+
};
284288
self.sink.remove_from_parent(body);
285289

286290
// FIXME: can we get here in the fragment case?
@@ -428,10 +432,14 @@ impl<'sink, Handle: Clone, Sink: TreeSink<Handle>>
428432

429433
</form> => {
430434
// FIXME: <template>
431-
let node = unwrap_or_return!(self.form_elem.take(), {
432-
self.sink.parse_error(Slice("Null form element pointer on </form>"));
433-
Done
434-
});
435+
// Can't use unwrap_or_return!() due to rust-lang/rust#16617.
436+
let node = match self.form_elem.take() {
437+
None => {
438+
self.sink.parse_error(Slice("Null form element pointer on </form>"));
439+
return Done;
440+
}
441+
Some(x) => x,
442+
};
435443
if !self.in_scope(default_scope,
436444
|n| self.sink.same_node(node.clone(), n)) {
437445
self.sink.parse_error(Slice("Form element not in scope on </form>"));
@@ -464,10 +472,7 @@ impl<'sink, Handle: Clone, Sink: TreeSink<Handle>>
464472
self.generate_implied_end_except(tag.name.clone());
465473
self.expect_to_close(tag.name);
466474
} else {
467-
self.sink.parse_error(format_if!(
468-
self.opts.exact_errors,
469-
"No tag to close",
470-
"No {} tag to close", tag.name));
475+
self.sink.parse_error(Slice("No matching tag to close"));
471476
}
472477
Done
473478
}
@@ -703,12 +708,16 @@ impl<'sink, Handle: Clone, Sink: TreeSink<Handle>>
703708
}
704709
}
705710

706-
let match_idx = unwrap_or_return!(match_idx, {
707-
// I believe this is impossible, because the root
708-
// <html> element is in special_tag.
709-
self.unexpected(&tag);
710-
Done
711-
});
711+
// Can't use unwrap_or_return!() due to rust-lang/rust#16617.
712+
let match_idx = match match_idx {
713+
None => {
714+
// I believe this is impossible, because the root
715+
// <html> element is in special_tag.
716+
self.unexpected(&tag);
717+
return Done;
718+
}
719+
Some(x) => x,
720+
};
712721

713722
self.generate_implied_end_except(tag.name.clone());
714723

@@ -1012,7 +1021,7 @@ impl<'sink, Handle: Clone, Sink: TreeSink<Handle>>
10121021
if self.in_scope_named(table_scope, atom!(tr)) {
10131022
self.pop_until_current(table_row_context);
10141023
let node = self.pop();
1015-
assert!(self.html_elem_named(node, atom!(tr)));
1024+
self.assert_named(node, atom!(tr));
10161025
self.mode = InTableBody;
10171026
} else {
10181027
self.unexpected(&token);
@@ -1024,7 +1033,7 @@ impl<'sink, Handle: Clone, Sink: TreeSink<Handle>>
10241033
if self.in_scope_named(table_scope, atom!(tr)) {
10251034
self.pop_until_current(table_row_context);
10261035
let node = self.pop();
1027-
assert!(self.html_elem_named(node, atom!(tr)));
1036+
self.assert_named(node, atom!(tr));
10281037
Reprocess(InTableBody, token)
10291038
} else {
10301039
self.unexpected(&token)
@@ -1036,7 +1045,7 @@ impl<'sink, Handle: Clone, Sink: TreeSink<Handle>>
10361045
if self.in_scope_named(table_scope, atom!(tr)) {
10371046
self.pop_until_current(table_row_context);
10381047
let node = self.pop();
1039-
assert!(self.html_elem_named(node, atom!(tr)));
1048+
self.assert_named(node, atom!(tr));
10401049
Reprocess(InTableBody, TagToken(tag))
10411050
} else {
10421051
Done

0 commit comments

Comments
 (0)