Skip to content

Commit f16dd94

Browse files
authored
Remove dependency on mac crate (#639)
* Replace mac::format_if * Replace mac::test_eq * Move macros to markup5ever - Use xml5ever version of time! macro - Replace mac::unwrap_or_return with version from html5ever * Remove mac dependency Signed-off-by: Nico Burns <[email protected]> * Use ? operator instead of unwrap_or_return where possible Signed-off-by: Nico Burns <[email protected]> * Duplicate macros rather than exposing publicly Signed-off-by: Nico Burns <[email protected]> --------- Signed-off-by: Nico Burns <[email protected]>
1 parent 466cd81 commit f16dd94

File tree

14 files changed

+168
-142
lines changed

14 files changed

+168
-142
lines changed

html5ever/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ trace_tokenizer = []
1717

1818
[dependencies]
1919
log = "0.4"
20-
mac = "0.1"
2120
markup5ever = { version = "0.17", path = "../markup5ever" }
2221
match_token = { workspace = true }
2322

html5ever/src/lib.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,12 @@ pub use markup5ever::*;
1818

1919
pub use serialize::serialize;
2020

21-
#[macro_use]
22-
mod macros;
23-
2421
mod util {
2522
pub(crate) mod str;
2623
}
2724

25+
pub(crate) mod macros;
26+
2827
pub mod driver;
2928
pub mod serialize;
3029
pub mod tokenizer;

html5ever/src/macros.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,14 @@ macro_rules! unwrap_or_return {
2121
x
2222
}};
2323
}
24+
pub(crate) use unwrap_or_return;
2425

2526
macro_rules! time {
2627
($e:expr) => {{
27-
let now = ::std::time::Instant::now();
28+
let t0 = ::std::time::Instant::now();
2829
let result = $e;
29-
let d = now.elapsed();
30-
let dt = d.as_secs() * 1_000_000_000 + u64::from(d.subsec_nanos());
30+
let dt = t0.elapsed().as_nanos() as u64;
3131
(result, dt)
3232
}};
3333
}
34+
pub(crate) use time;

html5ever/src/tokenizer/char_ref/mod.rs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ use crate::data;
1313
use crate::tendril::StrTendril;
1414

1515
use log::debug;
16-
use mac::format_if;
17-
use std::borrow::Cow::Borrowed;
16+
use std::borrow::Cow::{self, Borrowed};
1817
use std::char::from_u32;
1918

2019
use self::State::*;
@@ -257,12 +256,14 @@ impl CharRefTokenizer {
257256
};
258257

259258
if error {
260-
let msg = format_if!(
261-
tokenizer.opts.exact_errors,
262-
"Invalid numeric character reference",
263-
"Invalid numeric character reference value 0x{:06X}",
264-
self.num
265-
);
259+
let msg = if tokenizer.opts.exact_errors {
260+
Cow::from(format!(
261+
"Invalid numeric character reference value 0x{:06X}",
262+
self.num
263+
))
264+
} else {
265+
Cow::from("Invalid numeric character reference")
266+
};
266267
tokenizer.emit_error(msg);
267268
}
268269

@@ -299,12 +300,11 @@ impl CharRefTokenizer {
299300
}
300301

301302
fn emit_name_error<Sink: TokenSink>(&mut self, tokenizer: &Tokenizer<Sink>) {
302-
let msg = format_if!(
303-
tokenizer.opts.exact_errors,
304-
"Invalid character reference",
305-
"Invalid character reference &{}",
306-
self.name_buf()
307-
);
303+
let msg = if tokenizer.opts.exact_errors {
304+
Cow::from(format!("Invalid character reference &{}", self.name_buf()))
305+
} else {
306+
Cow::from("Invalid character reference")
307+
};
308308
tokenizer.emit_error(msg);
309309
}
310310

html5ever/src/tokenizer/mod.rs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,14 @@ use self::char_ref::{CharRef, CharRefTokenizer};
2424
use crate::util::str::lower_ascii_letter;
2525

2626
use log::{debug, trace};
27-
use mac::format_if;
2827
use markup5ever::{ns, small_char_set, TokenizerResult};
2928
use std::borrow::Cow::{self, Borrowed};
3029
use std::cell::{Cell, RefCell, RefMut};
3130
use std::collections::BTreeMap;
3231
use std::mem;
3332

3433
pub use crate::buffer_queue::{BufferQueue, FromSet, NotFromSet, SetResult};
34+
use crate::macros::{time, unwrap_or_return};
3535
use crate::tendril::StrTendril;
3636
use crate::{Attribute, LocalName, QualName, SmallCharSet};
3737

@@ -376,13 +376,13 @@ impl<Sink: TokenSink> Tokenizer<Sink> {
376376
#[cfg(feature = "trace_tokenizer")]
377377
trace!(" error");
378378

379-
let msg = format_if!(
380-
self.opts.exact_errors,
381-
"Bad character",
382-
"Saw {} in state {:?}",
383-
self.current_char.get(),
384-
self.state.get()
385-
);
379+
let msg = if self.opts.exact_errors {
380+
Cow::from("Bad character")
381+
} else {
382+
let c = self.current_char.get();
383+
let state = self.state.get();
384+
Cow::from(format!("Saw {c} in state {state:?}"))
385+
};
386386
self.emit_error(msg);
387387
}
388388

@@ -391,12 +391,12 @@ impl<Sink: TokenSink> Tokenizer<Sink> {
391391
#[cfg(feature = "trace_tokenizer")]
392392
trace!(" error_eof");
393393

394-
let msg = format_if!(
395-
self.opts.exact_errors,
396-
"Unexpected EOF",
397-
"Saw EOF in state {:?}",
398-
self.state.get()
399-
);
394+
let msg = if self.opts.exact_errors {
395+
Cow::from("Unexpected EOF")
396+
} else {
397+
let state = self.state.get();
398+
Cow::from(format!("Saw EOF in state {state:?}"))
399+
};
400400
self.emit_error(msg);
401401
}
402402

html5ever/src/tree_builder/mod.rs

Lines changed: 46 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use crate::tokenizer;
2222
use crate::tokenizer::states as tok_state;
2323
use crate::tokenizer::{Doctype, EndTag, StartTag, Tag, TokenSink, TokenSinkResult};
2424

25-
use std::borrow::Cow::Borrowed;
25+
use std::borrow::Cow::{self, Borrowed};
2626
use std::cell::{Cell, Ref, RefCell};
2727
use std::collections::VecDeque;
2828
use std::iter::{Enumerate, Rev};
@@ -32,7 +32,6 @@ use crate::tokenizer::states::RawKind;
3232
use crate::tree_builder::tag_sets::*;
3333
use crate::util::str::to_escaped_string;
3434
use log::{debug, log_enabled, warn, Level};
35-
use mac::format_if;
3635
use markup5ever::{expanded_name, local_name, namespace_prefix, ns};
3736

3837
#[macro_use]
@@ -488,12 +487,11 @@ where
488487
if self.mode.get() == InsertionMode::Initial {
489488
let (err, quirk) = data::doctype_error_and_quirks(&dt, self.opts.iframe_srcdoc);
490489
if err {
491-
self.sink.parse_error(format_if!(
492-
self.opts.exact_errors,
493-
"Bad DOCTYPE",
494-
"Bad DOCTYPE: {:?}",
495-
dt
496-
));
490+
self.sink.parse_error(if self.opts.exact_errors {
491+
Cow::from(format!("Bad DOCTYPE: {dt:?}"))
492+
} else {
493+
Cow::from("Bad DOCTYPE")
494+
});
497495
}
498496
let Doctype {
499497
name,
@@ -513,12 +511,11 @@ where
513511
self.mode.set(InsertionMode::BeforeHtml);
514512
return tokenizer::TokenSinkResult::Continue;
515513
} else {
516-
self.sink.parse_error(format_if!(
517-
self.opts.exact_errors,
518-
"DOCTYPE in body",
519-
"DOCTYPE in insertion mode {:?}",
520-
self.mode.get()
521-
));
514+
self.sink.parse_error(if self.opts.exact_errors {
515+
Cow::from(format!("DOCTYPE in insertion mode {:?}", self.mode.get()))
516+
} else {
517+
Cow::from("DOCTYPE in body")
518+
});
522519
return tokenizer::TokenSinkResult::Continue;
523520
}
524521
},
@@ -618,13 +615,15 @@ where
618615
Sink: TreeSink<Handle = Handle>,
619616
{
620617
fn unexpected<T: fmt::Debug>(&self, _thing: &T) -> ProcessResult<Handle> {
621-
self.sink.parse_error(format_if!(
622-
self.opts.exact_errors,
623-
"Unexpected token",
624-
"Unexpected token {} in insertion mode {:?}",
625-
to_escaped_string(_thing),
626-
self.mode.get()
627-
));
618+
self.sink.parse_error(if self.opts.exact_errors {
619+
Cow::from(format!(
620+
"Unexpected token {} in insertion mode {:?}",
621+
to_escaped_string(_thing),
622+
self.mode.get()
623+
))
624+
} else {
625+
Cow::from("Unexpected token")
626+
});
628627
ProcessResult::Done
629628
}
630629

@@ -1053,20 +1052,19 @@ where
10531052
"thead" "tr" "body" "html");
10541053

10551054
for elem in self.open_elems.borrow().iter() {
1056-
let error;
1057-
{
1055+
let error = {
10581056
let elem_name = self.sink.elem_name(elem);
10591057
let name = elem_name.expanded();
10601058
if body_end_ok(name) {
10611059
continue;
10621060
}
1063-
error = format_if!(
1064-
self.opts.exact_errors,
1065-
"Unexpected open tag at end of body",
1066-
"Unexpected open tag {:?} at end of body",
1067-
name
1068-
);
1069-
}
1061+
1062+
if self.opts.exact_errors {
1063+
Cow::from(format!("Unexpected open tag {name:?} at end of body"))
1064+
} else {
1065+
Cow::from("Unexpected open tag at end of body")
1066+
}
1067+
};
10701068
self.sink.parse_error(error);
10711069
// FIXME: Do we keep checking after finding one bad tag?
10721070
// The spec suggests not.
@@ -1193,12 +1191,11 @@ where
11931191
/// Signal an error if it was not the first one.
11941192
fn expect_to_close(&self, name: LocalName) {
11951193
if self.pop_until_named(name.clone()) != 1 {
1196-
self.sink.parse_error(format_if!(
1197-
self.opts.exact_errors,
1198-
"Unexpected open element",
1199-
"Unexpected open element while closing {:?}",
1200-
name
1201-
));
1194+
self.sink.parse_error(if self.opts.exact_errors {
1195+
Cow::from(format!("Unexpected open element while closing {name:?}"))
1196+
} else {
1197+
Cow::from("Unexpected open element")
1198+
});
12021199
}
12031200
}
12041201

@@ -1242,12 +1239,14 @@ where
12421239
self.orig_mode.set(Some(self.mode.get()));
12431240
ProcessResult::Reprocess(InsertionMode::InTableText, token)
12441241
} else {
1245-
self.sink.parse_error(format_if!(
1246-
self.opts.exact_errors,
1247-
"Unexpected characters in table",
1248-
"Unexpected characters {} in table",
1249-
to_escaped_string(&token)
1250-
));
1242+
self.sink.parse_error(if self.opts.exact_errors {
1243+
Cow::from(format!(
1244+
"Unexpected characters {} in table",
1245+
to_escaped_string(&token)
1246+
))
1247+
} else {
1248+
Cow::from("Unexpected characters in table")
1249+
});
12511250
self.foster_parent_in_body(token)
12521251
}
12531252
}
@@ -1553,15 +1552,11 @@ where
15531552
}
15541553
}
15551554

1556-
// Can't use unwrap_or_return!() due to rust-lang/rust#16617.
1557-
let match_idx = match match_idx {
1558-
None => {
1559-
// I believe this is impossible, because the root
1560-
// <html> element is in special_tag.
1561-
self.unexpected(&tag);
1562-
return;
1563-
},
1564-
Some(x) => x,
1555+
let Some(match_idx) = match_idx else {
1556+
// I believe this is impossible, because the root
1557+
// <html> element is in special_tag.
1558+
self.unexpected(&tag);
1559+
return;
15651560
};
15661561

15671562
self.generate_implied_end_except(tag.name.clone());

html5ever/src/tree_builder/rules.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -491,13 +491,9 @@ where
491491

492492
</form> => {
493493
if !self.in_html_elem_named(local_name!("template")) {
494-
// Can't use unwrap_or_return!() due to rust-lang/rust#16617.
495-
let node = match self.form_elem.take() {
496-
None => {
497-
self.sink.parse_error(Borrowed("Null form element pointer on </form>"));
498-
return ProcessResult::Done;
499-
}
500-
Some(x) => x,
494+
let Some(node) = self.form_elem.take() else {
495+
self.sink.parse_error(Borrowed("Null form element pointer on </form>"));
496+
return ProcessResult::Done;
501497
};
502498
if !self.in_scope(default_scope, |n| self.sink.same_node(&node, &n)) {
503499
self.sink.parse_error(Borrowed("Form element not in scope on </form>"));

html5ever/src/util/str.rs

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,24 @@ pub(crate) fn lower_ascii_letter(c: char) -> Option<char> {
2929
#[allow(non_snake_case)]
3030
mod test {
3131
use super::lower_ascii_letter;
32-
use mac::test_eq;
33-
34-
test_eq!(lower_letter_a_is_a, lower_ascii_letter('a'), Some('a'));
35-
test_eq!(lower_letter_A_is_a, lower_ascii_letter('A'), Some('a'));
36-
test_eq!(lower_letter_symbol_is_None, lower_ascii_letter('!'), None);
37-
test_eq!(
38-
lower_letter_nonascii_is_None,
39-
lower_ascii_letter('\u{a66e}'),
40-
None
41-
);
32+
33+
#[test]
34+
fn lower_letter_a_is_a() {
35+
assert_eq!(lower_ascii_letter('a'), Some('a'));
36+
}
37+
38+
#[test]
39+
fn lower_letter_A_is_a() {
40+
assert_eq!(lower_ascii_letter('A'), Some('a'));
41+
}
42+
43+
#[test]
44+
fn lower_letter_symbol_is_None() {
45+
assert_eq!(lower_ascii_letter('!'), None);
46+
}
47+
48+
#[test]
49+
fn lower_letter_nonascii_is_None() {
50+
assert_eq!(lower_ascii_letter('\u{a66e}'), None);
51+
}
4252
}

xml5ever/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ trace_tokenizer = []
1919

2020
[dependencies]
2121
log = "0.4"
22-
mac = "0.1"
2322
markup5ever = { version = "0.17", path = "../markup5ever" }
2423

2524
[dev-dependencies]

xml5ever/src/lib.rs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,7 @@
3535

3636
pub use markup5ever::*;
3737

38-
macro_rules! time {
39-
($e:expr) => {{
40-
let t0 = ::std::time::Instant::now();
41-
let result = $e;
42-
let dt = t0.elapsed().as_nanos() as u64;
43-
(result, dt)
44-
}};
45-
}
38+
pub(crate) mod macros;
4639

4740
/// Driver
4841
pub mod driver;

0 commit comments

Comments
 (0)