Skip to content

Commit

Permalink
fix(es/module): Add "use strict" while preserving directives (#7537)
Browse files Browse the repository at this point in the history
**Related issue:**

 - Closes #7536.
  • Loading branch information
kdy1 committed Jun 16, 2023
1 parent b9acc83 commit f42fdd2
Show file tree
Hide file tree
Showing 8 changed files with 22 additions and 12 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// input.ts
"use client";
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Expand Down
2 changes: 1 addition & 1 deletion crates/swc_ecma_transforms_module/src/amd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ where

// "use strict";
if self.config.strict_mode {
stmts.push(clone_first_use_directive(n).unwrap_or_else(use_strict));
stmts.push(clone_first_use_directive(n, true).unwrap_or_else(use_strict));
}

let ModuleDeclStrip {
Expand Down
6 changes: 4 additions & 2 deletions crates/swc_ecma_transforms_module/src/common_js.rs
Original file line number Diff line number Diff line change
Expand Up @@ -111,12 +111,14 @@ where
let mut strip = ModuleDeclStrip::new(self.const_var_kind);
n.visit_mut_with(&mut strip);

let mut stmts: Vec<ModuleItem> = Vec::with_capacity(n.len() + 4);
let mut stmts: Vec<ModuleItem> = Vec::with_capacity(n.len() + 6);

stmts.extend(clone_first_use_directive(n, false).map(From::from));

// "use strict";
if self.config.strict_mode {
stmts.push(
clone_first_use_directive(n)
clone_first_use_directive(n, true)
.unwrap_or_else(use_strict)
.into(),
);
Expand Down
2 changes: 1 addition & 1 deletion crates/swc_ecma_transforms_module/src/umd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ where

// "use strict";
if self.config.config.strict_mode {
stmts.push(clone_first_use_directive(module_items).unwrap_or_else(use_strict));
stmts.push(clone_first_use_directive(module_items, true).unwrap_or_else(use_strict));
}

let ModuleDeclStrip {
Expand Down
18 changes: 12 additions & 6 deletions crates/swc_ecma_transforms_module/src/util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use swc_common::{Span, Spanned, DUMMY_SP};
use swc_ecma_ast::*;
use swc_ecma_utils::{
is_valid_prop_ident, member_expr, private_ident, quote_ident, quote_str, ExprFactory,
FunctionFactory,
FunctionFactory, IsDirective,
};

#[derive(Debug, Clone, Serialize, Deserialize)]
Expand Down Expand Up @@ -190,18 +190,24 @@ pub(super) fn define_es_module(exports: Ident) -> Stmt {
.into_stmt()
}

pub(super) fn clone_first_use_directive(stmts: &[ModuleItem]) -> Option<Stmt> {
pub(super) fn clone_first_use_directive(
stmts: &[ModuleItem],
want_use_strict: bool,
) -> Option<Stmt> {
if stmts.is_empty() {
return None;
}

stmts.iter().find_map(|item| match item {
ModuleItem::Stmt(stmt @ Stmt::Expr(ExprStmt { expr, .. })) => match **expr {
Expr::Lit(Lit::Str(Str { ref value, .. })) if value.starts_with("use ") => {
ModuleItem::Stmt(stmt) => {
if (want_use_strict && stmt.is_use_strict())
|| (!want_use_strict && !stmt.is_use_strict() && stmt.is_directive())
{
Some(stmt.clone())
} else {
None
}
_ => None,
},
}
_ => None,
})
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ define([
"require",
"exports"
], function(require, exports) {
"use client";
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// input.ts
"use client";
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
], factory);
else if (global = typeof globalThis !== "undefined" ? globalThis : global || self) factory(global.input = {});
})(this, function(exports) {
"use client";
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Expand Down

1 comment on commit f42fdd2

@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: f42fdd2 Previous: e5152d3 Ratio
es/full/bugs-1 357387 ns/iter (± 7209) 394241 ns/iter (± 8933) 0.91
es/full/minify/libraries/antd 1894867384 ns/iter (± 33413328) 2185916721 ns/iter (± 35506136) 0.87
es/full/minify/libraries/d3 374257258 ns/iter (± 8553329) 468193493 ns/iter (± 4786125) 0.80
es/full/minify/libraries/echarts 1463349284 ns/iter (± 12068537) 1700100689 ns/iter (± 7955526) 0.86
es/full/minify/libraries/jquery 110091642 ns/iter (± 698406) 134320058 ns/iter (± 5636985) 0.82
es/full/minify/libraries/lodash 133334890 ns/iter (± 1196348) 162882355 ns/iter (± 2390880) 0.82
es/full/minify/libraries/moment 63503576 ns/iter (± 583521) 77353697 ns/iter (± 2111696) 0.82
es/full/minify/libraries/react 22693856 ns/iter (± 148355) 26285648 ns/iter (± 1441768) 0.86
es/full/minify/libraries/terser 297997336 ns/iter (± 3515108) 355146809 ns/iter (± 3993943) 0.84
es/full/minify/libraries/three 538296215 ns/iter (± 7296576) 635643603 ns/iter (± 4937961) 0.85
es/full/minify/libraries/typescript 3625496829 ns/iter (± 34903132) 3968552127 ns/iter (± 16001342) 0.91
es/full/minify/libraries/victory 787749259 ns/iter (± 11179036) 919048975 ns/iter (± 5262795) 0.86
es/full/minify/libraries/vue 160447566 ns/iter (± 1044031) 184949826 ns/iter (± 1395934) 0.87
es/full/codegen/es3 40065 ns/iter (± 95) 40383 ns/iter (± 101) 0.99
es/full/codegen/es5 40085 ns/iter (± 103) 40476 ns/iter (± 56) 0.99
es/full/codegen/es2015 40127 ns/iter (± 97) 40494 ns/iter (± 98) 0.99
es/full/codegen/es2016 40067 ns/iter (± 60) 40471 ns/iter (± 73) 0.99
es/full/codegen/es2017 40063 ns/iter (± 55) 40514 ns/iter (± 32) 0.99
es/full/codegen/es2018 40131 ns/iter (± 85) 40437 ns/iter (± 49) 0.99
es/full/codegen/es2019 40112 ns/iter (± 59) 40488 ns/iter (± 67) 0.99
es/full/codegen/es2020 40078 ns/iter (± 128) 40461 ns/iter (± 85) 0.99
es/full/all/es3 208556208 ns/iter (± 2721954) 217501486 ns/iter (± 7692973) 0.96
es/full/all/es5 199644111 ns/iter (± 1970020) 207134490 ns/iter (± 3131771) 0.96
es/full/all/es2015 154141040 ns/iter (± 1312433) 158758212 ns/iter (± 3727526) 0.97
es/full/all/es2016 152819690 ns/iter (± 2139082) 159426852 ns/iter (± 3029796) 0.96
es/full/all/es2017 154190833 ns/iter (± 2252918) 159625834 ns/iter (± 3859732) 0.97
es/full/all/es2018 150423451 ns/iter (± 1848015) 156535262 ns/iter (± 5158806) 0.96
es/full/all/es2019 151297696 ns/iter (± 2376093) 155489761 ns/iter (± 4439555) 0.97
es/full/all/es2020 144884929 ns/iter (± 2090087) 150430464 ns/iter (± 3895919) 0.96
es/full/parser 596592 ns/iter (± 8859) 605697 ns/iter (± 12947) 0.98
es/full/base/fixer 25806 ns/iter (± 45) 24619 ns/iter (± 29) 1.05
es/full/base/resolver_and_hygiene 106146 ns/iter (± 154) 105301 ns/iter (± 112) 1.01
serialization of serde 282 ns/iter (± 0) 282 ns/iter (± 0) 1
css/minify/libraries/bootstrap 35884146 ns/iter (± 343779) 39199907 ns/iter (± 156352) 0.92
css/visitor/compare/clone 2364138 ns/iter (± 4527) 2740990 ns/iter (± 30920) 0.86
css/visitor/compare/visit_mut_span 2510393 ns/iter (± 5200) 2943904 ns/iter (± 17686) 0.85
css/visitor/compare/visit_mut_span_panic 2615062 ns/iter (± 4354) 3002516 ns/iter (± 17238) 0.87
css/visitor/compare/fold_span 3321902 ns/iter (± 11985) 3880597 ns/iter (± 31665) 0.86
css/visitor/compare/fold_span_panic 3497685 ns/iter (± 11626) 4118501 ns/iter (± 37911) 0.85
css/lexer/bootstrap_5_1_3 5538881 ns/iter (± 998) 5539610 ns/iter (± 13133) 1.00
css/lexer/foundation_6_7_4 4675091 ns/iter (± 2459) 4676898 ns/iter (± 1936) 1.00
css/lexer/tailwind_3_1_1 888340 ns/iter (± 226) 886881 ns/iter (± 959) 1.00
css/parser/bootstrap_5_1_3 23940380 ns/iter (± 143394) 25486296 ns/iter (± 96522) 0.94
css/parser/foundation_6_7_4 19088951 ns/iter (± 37967) 20261960 ns/iter (± 38408) 0.94
css/parser/tailwind_3_1_1 3680254 ns/iter (± 2267) 3770625 ns/iter (± 5092) 0.98
es/codegen/colors 742581 ns/iter (± 406560) 705746 ns/iter (± 386103) 1.05
es/codegen/large 3102986 ns/iter (± 1610663) 2883969 ns/iter (± 1511670) 1.08
es/codegen/with-parser/colors 57997 ns/iter (± 686) 57705 ns/iter (± 535) 1.01
es/codegen/with-parser/large 578294 ns/iter (± 3573) 578146 ns/iter (± 1763) 1.00
es/minify/libraries/antd 1648536078 ns/iter (± 23640967) 1885328154 ns/iter (± 18123446) 0.87
es/minify/libraries/d3 325818389 ns/iter (± 2318996) 405635563 ns/iter (± 3002875) 0.80
es/minify/libraries/echarts 1282293853 ns/iter (± 21331060) 1450686901 ns/iter (± 14853702) 0.88
es/minify/libraries/jquery 97436003 ns/iter (± 747454) 113347538 ns/iter (± 2264313) 0.86
es/minify/libraries/lodash 121504456 ns/iter (± 890482) 142482672 ns/iter (± 1916644) 0.85
es/minify/libraries/moment 56500367 ns/iter (± 353232) 64996317 ns/iter (± 555570) 0.87
es/minify/libraries/react 20385651 ns/iter (± 87517) 22661424 ns/iter (± 184229) 0.90
es/minify/libraries/terser 251428860 ns/iter (± 2344845) 309632615 ns/iter (± 5107825) 0.81
es/minify/libraries/three 444376043 ns/iter (± 6030289) 542927181 ns/iter (± 6459145) 0.82
es/minify/libraries/typescript 3139761059 ns/iter (± 26384918) 3337830470 ns/iter (± 21074002) 0.94
es/minify/libraries/victory 671476685 ns/iter (± 10742456) 788673438 ns/iter (± 8594767) 0.85
es/minify/libraries/vue 143049634 ns/iter (± 1739867) 167790350 ns/iter (± 7215474) 0.85
es/visitor/compare/clone 2401065 ns/iter (± 11694) 2581490 ns/iter (± 21071) 0.93
es/visitor/compare/visit_mut_span 2799594 ns/iter (± 1670) 3030685 ns/iter (± 36901) 0.92
es/visitor/compare/visit_mut_span_panic 2831883 ns/iter (± 3820) 3026094 ns/iter (± 32712) 0.94
es/visitor/compare/fold_span 3939581 ns/iter (± 3787) 4280186 ns/iter (± 26861) 0.92
es/visitor/compare/fold_span_panic 4043698 ns/iter (± 9276) 4446006 ns/iter (± 39623) 0.91
es/lexer/colors 14875 ns/iter (± 34) 14842 ns/iter (± 12) 1.00
es/lexer/angular 6915369 ns/iter (± 11947) 6981001 ns/iter (± 1873) 0.99
es/lexer/backbone 844062 ns/iter (± 2470) 851551 ns/iter (± 490) 0.99
es/lexer/jquery 4743355 ns/iter (± 7684) 4793769 ns/iter (± 3899) 0.99
es/lexer/jquery mobile 7314221 ns/iter (± 5640) 7426989 ns/iter (± 13158) 0.98
es/lexer/mootools 3736501 ns/iter (± 7242) 3773709 ns/iter (± 3088) 0.99
es/lexer/underscore 699791 ns/iter (± 2597) 707435 ns/iter (± 1805) 0.99
es/lexer/three 22275434 ns/iter (± 11124) 22636777 ns/iter (± 18489) 0.98
es/lexer/yui 4268864 ns/iter (± 1643) 4312009 ns/iter (± 2442) 0.99
es/parser/colors 33846 ns/iter (± 64) 33844 ns/iter (± 87) 1.00
es/parser/angular 16912234 ns/iter (± 91147) 19054921 ns/iter (± 168719) 0.89
es/parser/backbone 2440338 ns/iter (± 9275) 2488103 ns/iter (± 15274) 0.98
es/parser/jquery 13282318 ns/iter (± 92514) 15071938 ns/iter (± 381198) 0.88
es/parser/jquery mobile 20266332 ns/iter (± 177813) 23291137 ns/iter (± 322614) 0.87
es/parser/mootools 10083158 ns/iter (± 24016) 11086417 ns/iter (± 66934) 0.91
es/parser/underscore 2077804 ns/iter (± 12329) 2107932 ns/iter (± 11809) 0.99
es/parser/three 58948393 ns/iter (± 778075) 65130698 ns/iter (± 200304) 0.91
es/parser/yui 10218187 ns/iter (± 103146) 11373428 ns/iter (± 188220) 0.90
es/preset-env/usage/builtin_type 155279 ns/iter (± 33816) 154648 ns/iter (± 33617) 1.00
es/preset-env/usage/property 29527 ns/iter (± 62) 30168 ns/iter (± 99) 0.98
es/resolver/typescript 129382169 ns/iter (± 3577586) 134973317 ns/iter (± 2560594) 0.96
es/fixer/typescript 91606178 ns/iter (± 1654351) 93370888 ns/iter (± 1401400) 0.98
es/hygiene/typescript 205329028 ns/iter (± 1988120) 216350759 ns/iter (± 2758961) 0.95
es/resolver_with_hygiene/typescript 406587463 ns/iter (± 3015924) 441191281 ns/iter (± 7580852) 0.92
es/visitor/base-perf/module_clone 85462 ns/iter (± 486) 85566 ns/iter (± 328) 1.00
es/visitor/base-perf/fold_empty 94931 ns/iter (± 410) 94722 ns/iter (± 1171) 1.00
es/visitor/base-perf/fold_noop_impl_all 95307 ns/iter (± 259) 95449 ns/iter (± 209) 1.00
es/visitor/base-perf/fold_noop_impl_vec 95460 ns/iter (± 600) 95432 ns/iter (± 358) 1.00
es/visitor/base-perf/boxing_boxed_clone 62 ns/iter (± 0) 60 ns/iter (± 0) 1.03
es/visitor/base-perf/boxing_unboxed_clone 44 ns/iter (± 0) 44 ns/iter (± 0) 1
es/visitor/base-perf/boxing_boxed 109 ns/iter (± 0) 107 ns/iter (± 0) 1.02
es/visitor/base-perf/boxing_unboxed 82 ns/iter (± 0) 81 ns/iter (± 0) 1.01
es/visitor/base-perf/visit_contains_this 3526 ns/iter (± 64) 3381 ns/iter (± 111) 1.04
es/base/parallel/resolver/typescript 7031201283 ns/iter (± 434464736) 7342841466 ns/iter (± 535041466) 0.96
es/base/parallel/hygiene/typescript 2341099419 ns/iter (± 24921406) 2534282292 ns/iter (± 35622891) 0.92
misc/visitors/time-complexity/time 5 106 ns/iter (± 0) 104 ns/iter (± 0) 1.02
misc/visitors/time-complexity/time 10 346 ns/iter (± 5) 351 ns/iter (± 4) 0.99
misc/visitors/time-complexity/time 15 672 ns/iter (± 0) 678 ns/iter (± 0) 0.99
misc/visitors/time-complexity/time 20 1262 ns/iter (± 25) 1245 ns/iter (± 2) 1.01
misc/visitors/time-complexity/time 40 6854 ns/iter (± 33) 6293 ns/iter (± 25) 1.09
misc/visitors/time-complexity/time 60 17509 ns/iter (± 48) 15801 ns/iter (± 5) 1.11
es/full-target/es2016 270177 ns/iter (± 668) 270676 ns/iter (± 1900) 1.00
es/full-target/es2017 260399 ns/iter (± 468) 260423 ns/iter (± 374) 1.00
es/full-target/es2018 249178 ns/iter (± 627) 249216 ns/iter (± 248) 1.00
es2020_nullish_coalescing 99689 ns/iter (± 431) 99021 ns/iter (± 370) 1.01
es2020_optional_chaining 121999 ns/iter (± 385) 122184 ns/iter (± 343) 1.00
es2022_class_properties 157001 ns/iter (± 358) 157251 ns/iter (± 137) 1.00
es2018_object_rest_spread 101007 ns/iter (± 204) 99979 ns/iter (± 170) 1.01
es2019_optional_catch_binding 89319 ns/iter (± 318) 88606 ns/iter (± 231) 1.01
es2017_async_to_generator 90271 ns/iter (± 117) 89501 ns/iter (± 208) 1.01
es2016_exponentiation 96726 ns/iter (± 235) 95807 ns/iter (± 319) 1.01
es2015_arrow 99438 ns/iter (± 260) 98825 ns/iter (± 288) 1.01
es2015_block_scoped_fn 97592 ns/iter (± 261) 97147 ns/iter (± 341) 1.00
es2015_block_scoping 184758 ns/iter (± 224) 185086 ns/iter (± 305) 1.00

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

Please sign in to comment.