Skip to content

Commit

Permalink
fix(es/parser): Fix stack overflow due to deeply nested if (#6910)
Browse files Browse the repository at this point in the history
**Related issue:**

 - Closes #6813.
  • Loading branch information
kdy1 committed Feb 7, 2023
1 parent bd00725 commit f36d945
Show file tree
Hide file tree
Showing 8 changed files with 3,243 additions and 15 deletions.
1 change: 1 addition & 0 deletions .github/workflows/CI.yml
Expand Up @@ -660,6 +660,7 @@ jobs:
- name: Run cargo test (plugin)
if: matrix.settings.crate == 'swc_plugin_runner'
run: |
# export CARGO_TARGET_DIR=$(pwd)/target
cargo test -p swc_plugin_runner --release --features plugin_transform_schema_v1 --features rkyv-impl --features ecma --features css
- name: Run cargo test (swc_ecma_minifier)
Expand Down
23 changes: 23 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions crates/swc_ecma_parser/Cargo.toml
Expand Up @@ -37,6 +37,9 @@ swc_ecma_visit = { version = "0.82.3", path = "../swc_ecma_visit", optional = tr
tracing = "0.1.32"
typed-arena = "2.0.1"

[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
stacker = "0.1.15"

[dev-dependencies]
criterion = "0.3"
pretty_assertions = "1.1"
Expand Down
10 changes: 10 additions & 0 deletions crates/swc_ecma_parser/src/lib.rs
Expand Up @@ -446,3 +446,13 @@ expose!(parse_file_as_expr, Box<Expr>, |p| {
expose!(parse_file_as_module, Module, |p| { p.parse_module() });
expose!(parse_file_as_script, Script, |p| { p.parse_script() });
expose!(parse_file_as_program, Program, |p| { p.parse_program() });

#[inline(always)]
#[cfg_attr(target_arch = "wasm32", allow(unused))]
fn maybe_grow<R, F: FnOnce() -> R>(red_zone: usize, stack_size: usize, callback: F) -> R {
#[cfg(target_arch = "wasm32")]
return callback();

#[cfg(not(target_arch = "wasm32"))]
return stacker::maybe_grow(red_zone, stack_size, callback);
}
35 changes: 20 additions & 15 deletions crates/swc_ecma_parser/src/parser/stmt.rs
Expand Up @@ -486,15 +486,18 @@ impl<'a, I: Tokens> Parser<I> {
}

let cons = {
// Annex B
if !self.ctx().strict && is!(self, "function") {
// TODO: report error?
}
let ctx = Context {
ignore_else_clause: false,
..self.ctx()
};
self.with_ctx(ctx).parse_stmt(false).map(Box::new)?
// Prevent stack overflow
crate::maybe_grow(512 * 1024, 2 * 1024 * 1024, || {
// Annex B
if !self.ctx().strict && is!(self, "function") {
// TODO: report error?
}
let ctx = Context {
ignore_else_clause: false,
..self.ctx()
};
self.with_ctx(ctx).parse_stmt(false).map(Box::new)
})?
};

// We parse `else` branch iteratively, to avoid stack overflow
Expand All @@ -516,13 +519,15 @@ impl<'a, I: Tokens> Parser<I> {
}

if !is!(self, "if") {
let ctx = Context {
ignore_else_clause: false,
..self.ctx()
};

// As we eat `else` above, we need to parse statement once.
let last = self.with_ctx(ctx).parse_stmt(false)?;
let last = crate::maybe_grow(512 * 1024, 2 * 1024 * 1024, || {
let ctx = Context {
ignore_else_clause: false,
..self.ctx()
};

self.with_ctx(ctx).parse_stmt(false)
})?;
break Some(last);
}

Expand Down
115 changes: 115 additions & 0 deletions crates/swc_ecma_parser/tests/js.rs
@@ -0,0 +1,115 @@
#![allow(clippy::needless_update)]

use std::{
fs::File,
io::Read,
path::{Path, PathBuf},
};

use swc_common::{comments::SingleThreadedComments, FileName};
use swc_ecma_ast::*;
use swc_ecma_parser::{lexer::Lexer, EsConfig, PResult, Parser, StringInput, Syntax};
use swc_ecma_visit::FoldWith;
use testing::StdErr;

use crate::common::Normalizer;

#[path = "common/mod.rs"]
mod common;

#[testing::fixture("tests/js/**/*.js")]
fn spec(file: PathBuf) {
let output = file.parent().unwrap().join(format!(
"{}.json",
file.file_name().unwrap().to_string_lossy()
));
run_spec(&file, &output);
}

fn run_spec(file: &Path, output_json: &Path) {
let file_name = file
.display()
.to_string()
.replace("\\\\", "/")
.replace('\\', "/");

{
// Drop to reduce memory usage.
//
// Because the test suite contains lots of test cases, it results in oom in
// github actions.
let input = {
let mut buf = String::new();
File::open(file).unwrap().read_to_string(&mut buf).unwrap();
buf
};

eprintln!(
"\n\n========== Running reference test {}\nSource:\n{}\n",
file_name, input
);
}

with_parser(false, file, false, |p, _| {
let program = p.parse_program()?.fold_with(&mut Normalizer {
drop_span: false,
is_test262: false,
});

let json =
serde_json::to_string_pretty(&program).expect("failed to serialize module as json");

if StdErr::from(json).compare_to_file(output_json).is_err() {
panic!()
}

Ok(())
})
.map_err(|_| ())
.unwrap();
}

fn with_parser<F, Ret>(
treat_error_as_bug: bool,
file_name: &Path,
shift: bool,
f: F,
) -> Result<Ret, StdErr>
where
F: FnOnce(&mut Parser<Lexer<StringInput<'_>>>, &SingleThreadedComments) -> PResult<Ret>,
{
::testing::run_test(treat_error_as_bug, |cm, handler| {
if shift {
cm.new_source_file(FileName::Anon, "".into());
}

let comments = SingleThreadedComments::default();

let fm = cm
.load_file(file_name)
.unwrap_or_else(|e| panic!("failed to load {}: {}", file_name.display(), e));

let lexer = Lexer::new(
Syntax::Es(EsConfig {
..Default::default()
}),
EsVersion::Es2015,
(&*fm).into(),
Some(&comments),
);

let mut p = Parser::new_from(lexer);

let res = f(&mut p, &comments).map_err(|e| e.into_diagnostic(handler).emit());

for err in p.take_errors() {
err.into_diagnostic(handler).emit();
}

if handler.has_errors() {
return Err(());
}

res
})
}

1 comment on commit f36d945

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark

Benchmark suite Current: f36d945 Previous: ee3a107 Ratio
es/full/bugs-1 309287 ns/iter (± 14164) 306205 ns/iter (± 13240) 1.01
es/full/minify/libraries/antd 1633625255 ns/iter (± 20685790) 1851189187 ns/iter (± 52025113) 0.88
es/full/minify/libraries/d3 302913635 ns/iter (± 7466048) 328269861 ns/iter (± 9664775) 0.92
es/full/minify/libraries/echarts 1236800329 ns/iter (± 13382637) 1419903093 ns/iter (± 5755748) 0.87
es/full/minify/libraries/jquery 90859245 ns/iter (± 1778756) 98667600 ns/iter (± 2103815) 0.92
es/full/minify/libraries/lodash 108242819 ns/iter (± 1287929) 110108711 ns/iter (± 1523604) 0.98
es/full/minify/libraries/moment 52919020 ns/iter (± 476780) 52982046 ns/iter (± 212560) 1.00
es/full/minify/libraries/react 19144235 ns/iter (± 200164) 19167828 ns/iter (± 96784) 1.00
es/full/minify/libraries/terser 248949955 ns/iter (± 3222789) 253073486 ns/iter (± 2563445) 0.98
es/full/minify/libraries/three 452150873 ns/iter (± 6047803) 453834051 ns/iter (± 10048786) 1.00
es/full/minify/libraries/typescript 3055396594 ns/iter (± 22007704) 3221562487 ns/iter (± 25952346) 0.95
es/full/minify/libraries/victory 694949976 ns/iter (± 14623366) 687251912 ns/iter (± 14295073) 1.01
es/full/minify/libraries/vue 132624240 ns/iter (± 1542048) 132544354 ns/iter (± 1147599) 1.00
es/full/codegen/es3 26526 ns/iter (± 48) 26643 ns/iter (± 43) 1.00
es/full/codegen/es5 26603 ns/iter (± 50) 26657 ns/iter (± 42) 1.00
es/full/codegen/es2015 26622 ns/iter (± 60) 26645 ns/iter (± 28) 1.00
es/full/codegen/es2016 26594 ns/iter (± 69) 26635 ns/iter (± 35) 1.00
es/full/codegen/es2017 26619 ns/iter (± 37) 26605 ns/iter (± 38) 1.00
es/full/codegen/es2018 26540 ns/iter (± 50) 26603 ns/iter (± 49) 1.00
es/full/codegen/es2019 26562 ns/iter (± 44) 26675 ns/iter (± 66) 1.00
es/full/codegen/es2020 26573 ns/iter (± 53) 26661 ns/iter (± 66) 1.00
es/full/all/es3 171159986 ns/iter (± 2291987) 161240977 ns/iter (± 4040625) 1.06
es/full/all/es5 163327762 ns/iter (± 3826570) 159861467 ns/iter (± 4449148) 1.02
es/full/all/es2015 126065368 ns/iter (± 2417458) 120825507 ns/iter (± 810141) 1.04
es/full/all/es2016 124142509 ns/iter (± 1999067) 120577941 ns/iter (± 853732) 1.03
es/full/all/es2017 123411316 ns/iter (± 1891706) 119812569 ns/iter (± 1328621) 1.03
es/full/all/es2018 120938746 ns/iter (± 1702248) 117909596 ns/iter (± 938300) 1.03
es/full/all/es2019 119366006 ns/iter (± 765884) 117353316 ns/iter (± 627040) 1.02
es/full/all/es2020 115078881 ns/iter (± 1112274) 113141290 ns/iter (± 736950) 1.02
es/full/parser 541613 ns/iter (± 8356) 526439 ns/iter (± 8162) 1.03
es/full/base/fixer 22046 ns/iter (± 16) 22095 ns/iter (± 41) 1.00
es/full/base/resolver_and_hygiene 81195 ns/iter (± 134) 81351 ns/iter (± 87) 1.00
serialization of ast node 124 ns/iter (± 0) 123 ns/iter (± 0) 1.01
serialization of serde 129 ns/iter (± 0) 129 ns/iter (± 0) 1
css/minify/libraries/bootstrap 27958224 ns/iter (± 50326) 27924750 ns/iter (± 66149) 1.00
css/visitor/compare/clone 2068976 ns/iter (± 15859) 2080377 ns/iter (± 21109) 0.99
css/visitor/compare/visit_mut_span 2297159 ns/iter (± 3952) 2266544 ns/iter (± 7461) 1.01
css/visitor/compare/visit_mut_span_panic 2321385 ns/iter (± 2352) 2313780 ns/iter (± 7794) 1.00
css/visitor/compare/fold_span 3021487 ns/iter (± 18601) 3014960 ns/iter (± 18826) 1.00
css/visitor/compare/fold_span_panic 3206674 ns/iter (± 14307) 3165992 ns/iter (± 22470) 1.01
css/lexer/bootstrap_5_1_3 5189546 ns/iter (± 40385) 5231548 ns/iter (± 7635) 0.99
css/lexer/foundation_6_7_4 4373376 ns/iter (± 6980) 4368582 ns/iter (± 5184) 1.00
css/lexer/tailwind_3_1_1 830608 ns/iter (± 825) 829956 ns/iter (± 1307) 1.00
css/parser/bootstrap_5_1_3 21742829 ns/iter (± 35847) 21718360 ns/iter (± 48126) 1.00
css/parser/foundation_6_7_4 17400534 ns/iter (± 59488) 17392134 ns/iter (± 25170) 1.00
css/parser/tailwind_3_1_1 3312946 ns/iter (± 4267) 3323127 ns/iter (± 2070) 1.00
es/codegen/colors 331433 ns/iter (± 186926) 320811 ns/iter (± 180881) 1.03
es/codegen/large 1234959 ns/iter (± 637073) 1220442 ns/iter (± 630473) 1.01
es/codegen/with-parser/colors 48287 ns/iter (± 324) 48279 ns/iter (± 392) 1.00
es/codegen/with-parser/large 535761 ns/iter (± 1047) 535377 ns/iter (± 711) 1.00
es/minify/libraries/antd 1419921632 ns/iter (± 22195034) 1483925005 ns/iter (± 10559095) 0.96
es/minify/libraries/d3 256784908 ns/iter (± 5977720) 253390652 ns/iter (± 3163082) 1.01
es/minify/libraries/echarts 1093302308 ns/iter (± 8085611) 1127947210 ns/iter (± 23096477) 0.97
es/minify/libraries/jquery 78895323 ns/iter (± 613188) 78465330 ns/iter (± 1795357) 1.01
es/minify/libraries/lodash 96308086 ns/iter (± 1406139) 96356721 ns/iter (± 889877) 1.00
es/minify/libraries/moment 46245416 ns/iter (± 410348) 45877396 ns/iter (± 182572) 1.01
es/minify/libraries/react 16988764 ns/iter (± 101177) 17007461 ns/iter (± 129470) 1.00
es/minify/libraries/terser 214451846 ns/iter (± 2000340) 212573438 ns/iter (± 3333553) 1.01
es/minify/libraries/three 371656580 ns/iter (± 3764288) 405191292 ns/iter (± 21610579) 0.92
es/minify/libraries/typescript 2627463210 ns/iter (± 14763027) 2792579868 ns/iter (± 20392246) 0.94
es/minify/libraries/victory 595422589 ns/iter (± 9473030) 607815219 ns/iter (± 17000875) 0.98
es/minify/libraries/vue 116765374 ns/iter (± 669943) 119361845 ns/iter (± 1965138) 0.98
es/visitor/compare/clone 2398270 ns/iter (± 22562) 2395009 ns/iter (± 12019) 1.00
es/visitor/compare/visit_mut_span 2793768 ns/iter (± 3460) 2791655 ns/iter (± 5854) 1.00
es/visitor/compare/visit_mut_span_panic 2827465 ns/iter (± 4604) 2824008 ns/iter (± 7966) 1.00
es/visitor/compare/fold_span 3905798 ns/iter (± 9132) 3957316 ns/iter (± 6904) 0.99
es/visitor/compare/fold_span_panic 4073640 ns/iter (± 48245) 4108542 ns/iter (± 10792) 0.99
es/lexer/colors 17250 ns/iter (± 16) 17367 ns/iter (± 22) 0.99
es/lexer/angular 8207086 ns/iter (± 8355) 8257928 ns/iter (± 3436) 0.99
es/lexer/backbone 1072740 ns/iter (± 753) 1080457 ns/iter (± 453) 0.99
es/lexer/jquery 5946749 ns/iter (± 4121) 5978686 ns/iter (± 3042) 0.99
es/lexer/jquery mobile 9146349 ns/iter (± 7458) 9202340 ns/iter (± 12417) 0.99
es/lexer/mootools 4645345 ns/iter (± 3159) 4684544 ns/iter (± 16804) 0.99
es/lexer/underscore 895531 ns/iter (± 713) 900329 ns/iter (± 896) 0.99
es/lexer/three 27615252 ns/iter (± 18022) 27884558 ns/iter (± 29980) 0.99
es/lexer/yui 5035997 ns/iter (± 3111) 5054203 ns/iter (± 2742) 1.00
es/parser/colors 31050 ns/iter (± 158) 30724 ns/iter (± 220) 1.01
es/parser/angular 15534811 ns/iter (± 91838) 15878885 ns/iter (± 152803) 0.98
es/parser/backbone 2314304 ns/iter (± 13855) 2315848 ns/iter (± 13307) 1.00
es/parser/jquery 12523187 ns/iter (± 76020) 12413800 ns/iter (± 59325) 1.01
es/parser/jquery mobile 19963871 ns/iter (± 184042) 19673457 ns/iter (± 145504) 1.01
es/parser/mootools 9611333 ns/iter (± 25103) 9521221 ns/iter (± 26499) 1.01
es/parser/underscore 1977712 ns/iter (± 12683) 1959601 ns/iter (± 18638) 1.01
es/parser/three 58968656 ns/iter (± 823444) 57510556 ns/iter (± 531072) 1.03
es/parser/yui 9594936 ns/iter (± 52603) 9691207 ns/iter (± 135370) 0.99
es/preset-env/usage/builtin_type 144332 ns/iter (± 33819) 142876 ns/iter (± 33464) 1.01
es/preset-env/usage/property 21560 ns/iter (± 91) 21117 ns/iter (± 59) 1.02
es/resolver/typescript 110342706 ns/iter (± 1751028) 121827108 ns/iter (± 4889984) 0.91
es/fixer/typescript 84771889 ns/iter (± 1660213) 96738807 ns/iter (± 7479557) 0.88
es/hygiene/typescript 178688886 ns/iter (± 1124922) 200327275 ns/iter (± 1458717) 0.89
es/resolver_with_hygiene/typescript 308221829 ns/iter (± 1722096) 334983385 ns/iter (± 1640907) 0.92
es/visitor/base-perf/module_clone 76233 ns/iter (± 1649) 74907 ns/iter (± 1179) 1.02
es/visitor/base-perf/fold_empty 86602 ns/iter (± 1499) 85478 ns/iter (± 1454) 1.01
es/visitor/base-perf/fold_noop_impl_all 85770 ns/iter (± 1040) 85429 ns/iter (± 1757) 1.00
es/visitor/base-perf/fold_noop_impl_vec 86345 ns/iter (± 671) 85510 ns/iter (± 1847) 1.01
es/visitor/base-perf/boxing_boxed_clone 56 ns/iter (± 0) 56 ns/iter (± 0) 1
es/visitor/base-perf/boxing_unboxed_clone 60 ns/iter (± 0) 59 ns/iter (± 0) 1.02
es/visitor/base-perf/boxing_boxed 103 ns/iter (± 0) 105 ns/iter (± 0) 0.98
es/visitor/base-perf/boxing_unboxed 102 ns/iter (± 0) 104 ns/iter (± 0) 0.98
es/visitor/base-perf/visit_contains_this 3418 ns/iter (± 54) 3430 ns/iter (± 60) 1.00
es/base/parallel/resolver/typescript 6086070536 ns/iter (± 509601635) 5957359693 ns/iter (± 564846972) 1.02
es/base/parallel/hygiene/typescript 2143588855 ns/iter (± 20807915) 2378353991 ns/iter (± 23512752) 0.90
misc/visitors/time-complexity/time 5 96 ns/iter (± 2) 101 ns/iter (± 0) 0.95
misc/visitors/time-complexity/time 10 318 ns/iter (± 0) 313 ns/iter (± 2) 1.02
misc/visitors/time-complexity/time 15 644 ns/iter (± 4) 674 ns/iter (± 30) 0.96
misc/visitors/time-complexity/time 20 1206 ns/iter (± 39) 1217 ns/iter (± 11) 0.99
misc/visitors/time-complexity/time 40 6104 ns/iter (± 12) 6570 ns/iter (± 1) 0.93
misc/visitors/time-complexity/time 60 15582 ns/iter (± 108) 17021 ns/iter (± 13) 0.92
es/full-target/es2016 188645 ns/iter (± 597) 188451 ns/iter (± 387) 1.00
es/full-target/es2017 183495 ns/iter (± 538) 183895 ns/iter (± 260) 1.00
es/full-target/es2018 172800 ns/iter (± 734) 173080 ns/iter (± 574) 1.00
es2020_nullish_coalescing 66966 ns/iter (± 855) 66950 ns/iter (± 106) 1.00
es2020_optional_chaining 97160 ns/iter (± 5680) 95732 ns/iter (± 227) 1.01
es2022_class_properties 93734 ns/iter (± 156) 93741 ns/iter (± 177) 1.00
es2018_object_rest_spread 71251 ns/iter (± 141) 71101 ns/iter (± 86) 1.00
es2019_optional_catch_binding 61664 ns/iter (± 139) 60758 ns/iter (± 93) 1.01
es2017_async_to_generator 61752 ns/iter (± 93) 61658 ns/iter (± 94) 1.00
es2016_exponentiation 64865 ns/iter (± 116) 64559 ns/iter (± 187) 1.00
es2015_arrow 70625 ns/iter (± 432) 70196 ns/iter (± 190) 1.01
es2015_block_scoped_fn 67437 ns/iter (± 257) 66023 ns/iter (± 158) 1.02
es2015_block_scoping 153920 ns/iter (± 8283) 150384 ns/iter (± 6307) 1.02
es2015_classes 116493 ns/iter (± 401) 116658 ns/iter (± 468) 1.00
es2015_computed_props 61023 ns/iter (± 99) 61092 ns/iter (± 143) 1.00
es2015_destructuring 114849 ns/iter (± 208) 116656 ns/iter (± 337) 0.98
es2015_duplicate_keys 63470 ns/iter (± 99) 63251 ns/iter (± 70) 1.00
es2015_parameters 79323 ns/iter (± 163) 79424 ns/iter (± 165) 1.00
es2015_fn_name 66444 ns/iter (± 338) 67057 ns/iter (± 698) 0.99
es2015_for_of 64182 ns/iter (± 83) 64060 ns/iter (± 85) 1.00
es2015_instanceof 63225 ns/iter (± 67) 63001 ns/iter (± 86) 1.00
es2015_shorthand_property 61090 ns/iter (± 96) 61103 ns/iter (± 103) 1.00
es2015_spread 61017 ns/iter (± 156) 61165 ns/iter (± 118) 1.00
es2015_sticky_regex 62333 ns/iter (± 70) 62108 ns/iter (± 68) 1.00
es2015_typeof_symbol 62127 ns/iter (± 155) 61794 ns/iter (± 150) 1.01
es/transform/baseline/base 51897 ns/iter (± 77) 51557 ns/iter (± 90) 1.01
es/transform/baseline/common_reserved_word 62577 ns/iter (± 58) 62370 ns/iter (± 108) 1.00
es/transform/baseline/common_typescript 142093 ns/iter (± 3505) 151578 ns/iter (± 8989) 0.94
es/target/es3 170508 ns/iter (± 194) 169927 ns/iter (± 264) 1.00
es/target/es2015 628419 ns/iter (± 1420) 624277 ns/iter (± 1020) 1.01
es/target/es2016 64998 ns/iter (± 135) 64731 ns/iter (± 113) 1.00
es/target/es2017 61631 ns/iter (± 155) 61828 ns/iter (± 51) 1.00
es/target/es2018 81259 ns/iter (± 136) 81305 ns/iter (± 194) 1.00
es/target/es2020 133250 ns/iter (± 284) 132879 ns/iter (± 166) 1.00
babelify-only 670894 ns/iter (± 940) 679808 ns/iter (± 1839) 0.99
parse_and_babelify_angular 42929418 ns/iter (± 753322) 47320030 ns/iter (± 736231) 0.91
parse_and_babelify_backbone 5420255 ns/iter (± 68487) 5559263 ns/iter (± 280908) 0.97
parse_and_babelify_jquery 31702368 ns/iter (± 427309) 33518224 ns/iter (± 580194) 0.95
parse_and_babelify_jquery_mobile 54270122 ns/iter (± 721923) 57362256 ns/iter (± 969822) 0.95
parse_and_babelify_mootools 33027633 ns/iter (± 354129) 34842550 ns/iter (± 573625) 0.95
parse_and_babelify_underscore 4390351 ns/iter (± 34815) 4382496 ns/iter (± 19249) 1.00
parse_and_babelify_yui 31751500 ns/iter (± 320788) 35020125 ns/iter (± 759045) 0.91
html/minify/document/css_spec 42204598 ns/iter (± 250063) 42247743 ns/iter (± 244100) 1.00
html/minify/document/github 17567596 ns/iter (± 20729) 17573241 ns/iter (± 78316) 1.00
html/minify/document/stackoverflow 15693481 ns/iter (± 46115) 15813973 ns/iter (± 29949) 0.99
html/minify/document_fragment/css_spec 40168130 ns/iter (± 239549) 40272308 ns/iter (± 321520) 1.00
html/minify/document_fragment/github 16864403 ns/iter (± 25457) 16807605 ns/iter (± 56120) 1.00
html/minify/document_fragment/stackoverflow 15277392 ns/iter (± 26325) 15224902 ns/iter (± 34033) 1.00
html/document/visitor/compare/clone 339035 ns/iter (± 2639) 339460 ns/iter (± 1692) 1.00
html/document/visitor/compare/visit_mut_span 366048 ns/iter (± 1762) 366934 ns/iter (± 1880) 1.00
html/document/visitor/compare/visit_mut_span_panic 372585 ns/iter (± 1994) 371518 ns/iter (± 2972) 1.00
html/document/visitor/compare/fold_span 403708 ns/iter (± 2050) 407966 ns/iter (± 1210) 0.99
html/document/visitor/compare/fold_span_panic 459133 ns/iter (± 1231) 464997 ns/iter (± 2173) 0.99
html/document_fragment/visitor/compare/clone 337546 ns/iter (± 2175) 336166 ns/iter (± 1967) 1.00
html/document_fragment/visitor/compare/visit_mut_span 364233 ns/iter (± 1660) 367298 ns/iter (± 2061) 0.99
html/document_fragment/visitor/compare/visit_mut_span_panic 373717 ns/iter (± 1604) 373243 ns/iter (± 2383) 1.00
html/document_fragment/visitor/compare/fold_span 407513 ns/iter (± 2102) 406660 ns/iter (± 2815) 1.00
html/document_fragment/visitor/compare/fold_span_panic 458640 ns/iter (± 2544) 461659 ns/iter (± 995) 0.99
html/lexer/css_2021_spec 15910035 ns/iter (± 80651) 15536354 ns/iter (± 99168) 1.02
html/lexer/github_com_17_05_2022 6181203 ns/iter (± 5432) 5998781 ns/iter (± 3135) 1.03
html/lexer/stackoverflow_com_17_05_2022 5733751 ns/iter (± 5595) 5621296 ns/iter (± 3192) 1.02
html/parser/parser_document/css_2021_spec 25610923 ns/iter (± 255948) 25648559 ns/iter (± 283619) 1.00
html/parser/parser_document/github_com_17_05_2022 8756767 ns/iter (± 8749) 8748588 ns/iter (± 8217) 1.00
html/parser/parser_document/stackoverflow_com_17_05_2022 7706281 ns/iter (± 4245) 7702667 ns/iter (± 3370) 1.00
html/parser/parser_document_fragment/css_2021_spec 25501860 ns/iter (± 138761) 25739198 ns/iter (± 114796) 0.99
html/parser/parser_document_fragment/github_com_17_05_2022 8745584 ns/iter (± 12969) 8771232 ns/iter (± 8936) 1.00
html/parser/parser_document_fragment/stackoverflow_com_17_05_2022 7721689 ns/iter (± 11170) 7726062 ns/iter (± 8493) 1.00

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.