Skip to content

Commit

Permalink
feat(es/modules): Support allowTopLevelThis (#5086)
Browse files Browse the repository at this point in the history
  • Loading branch information
magic-akari committed Jul 2, 2022
1 parent f5447cd commit 9addef6
Show file tree
Hide file tree
Showing 15 changed files with 97 additions and 1 deletion.
1 change: 1 addition & 0 deletions crates/swc_ecma_transforms_module/src/amd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,7 @@ impl VisitMut for Amd {
stmts.visit_mut_children_with(&mut ModuleRefRewriter {
import_map,
lazy_record: Default::default(),
allow_top_level_this: self.config.allow_top_level_this,
is_global_this: true,
});

Expand Down
1 change: 1 addition & 0 deletions crates/swc_ecma_transforms_module/src/common_js.rs
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@ impl VisitMut for Cjs {
stmts.visit_mut_children_with(&mut ModuleRefRewriter {
import_map,
lazy_record,
allow_top_level_this: self.config.allow_top_level_this,
is_global_this: true,
});

Expand Down
4 changes: 3 additions & 1 deletion crates/swc_ecma_transforms_module/src/module_ref_rewriter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ pub(crate) struct ModuleRefRewriter {

pub lazy_record: AHashSet<Id>,

pub allow_top_level_this: bool,

pub is_global_this: bool,
}

Expand Down Expand Up @@ -67,7 +69,7 @@ impl VisitMut for ModuleRefRewriter {
}

Expr::This(ThisExpr { span }) => {
if self.is_global_this {
if !self.allow_top_level_this && self.is_global_this {
*n = *undefined(*span);
}
}
Expand Down
1 change: 1 addition & 0 deletions crates/swc_ecma_transforms_module/src/umd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,7 @@ impl VisitMut for Umd {
stmts.visit_mut_children_with(&mut ModuleRefRewriter {
import_map,
lazy_record: Default::default(),
allow_top_level_this: self.config.config.allow_top_level_this,
is_global_this: true,
});

Expand Down
3 changes: 3 additions & 0 deletions crates/swc_ecma_transforms_module/src/util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ use swc_ecma_utils::{
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields, rename_all = "camelCase")]
pub struct Config {
#[serde(default)]
pub allow_top_level_this: bool,
#[serde(default)]
pub strict: bool,
#[serde(default = "default_strict_mode")]
Expand All @@ -34,6 +36,7 @@ pub struct Config {
impl Default for Config {
fn default() -> Self {
Config {
allow_top_level_this: false,
strict: false,
strict_mode: default_strict_mode(),
lazy: Lazy::default(),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export var v = this;
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"allowTopLevelThis": false
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
define([
"require",
"exports"
], function(require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "v", {
enumerable: true,
get: ()=>v
});
var v = void 0;
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "v", {
enumerable: true,
get: ()=>v
});
var v = void 0;
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
(function(global, factory) {
if (typeof module === "object" && typeof module.exports === "object") factory(exports);
else if (typeof define === "function" && define.amd) define([
"exports"
], factory);
else if (global = typeof globalThis !== "undefined" ? globalThis : global || self) factory(global.input = {});
})(this, function(exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "v", {
enumerable: true,
get: ()=>v
});
var v = void 0;
});
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export var v = this;
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"allowTopLevelThis": true
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
define([
"require",
"exports"
], function(require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "v", {
enumerable: true,
get: ()=>v
});
var v = this;
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "v", {
enumerable: true,
get: ()=>v
});
var v = this;
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
(function(global, factory) {
if (typeof module === "object" && typeof module.exports === "object") factory(exports);
else if (typeof define === "function" && define.amd) define([
"exports"
], factory);
else if (global = typeof globalThis !== "undefined" ? globalThis : global || self) factory(global.input = {});
})(this, function(exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "v", {
enumerable: true,
get: ()=>v
});
var v = this;
});

1 comment on commit 9addef6

@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: 9addef6 Previous: de66b64 Ratio
es/full/minify/libraries/antd 1609758811 ns/iter (± 48482846) 1682544504 ns/iter (± 18401584) 0.96
es/full/minify/libraries/d3 397440411 ns/iter (± 11062720) 428288908 ns/iter (± 16907531) 0.93
es/full/minify/libraries/echarts 1598868857 ns/iter (± 39425758) 1666207164 ns/iter (± 28415077) 0.96
es/full/minify/libraries/jquery 86945313 ns/iter (± 2592982) 101490088 ns/iter (± 2221270) 0.86
es/full/minify/libraries/lodash 114619992 ns/iter (± 2166993) 137277384 ns/iter (± 4084409) 0.83
es/full/minify/libraries/moment 50009256 ns/iter (± 892108) 59985010 ns/iter (± 2043244) 0.83
es/full/minify/libraries/react 16905481 ns/iter (± 200115) 19624832 ns/iter (± 748925) 0.86
es/full/minify/libraries/terser 591655945 ns/iter (± 6507815) 624886287 ns/iter (± 15451951) 0.95
es/full/minify/libraries/three 535264799 ns/iter (± 12819630) 571977668 ns/iter (± 13269719) 0.94
es/full/minify/libraries/typescript 3409401640 ns/iter (± 73277301) 3635381810 ns/iter (± 83479854) 0.94
es/full/minify/libraries/victory 726385204 ns/iter (± 21454810) 750919610 ns/iter (± 7098079) 0.97
es/full/minify/libraries/vue 131732837 ns/iter (± 6522395) 156672133 ns/iter (± 1966904) 0.84
es/full/codegen/es3 31031 ns/iter (± 691) 32368 ns/iter (± 2096) 0.96
es/full/codegen/es5 30930 ns/iter (± 778) 32371 ns/iter (± 546) 0.96
es/full/codegen/es2015 30999 ns/iter (± 1918) 32312 ns/iter (± 377) 0.96
es/full/codegen/es2016 31031 ns/iter (± 1333) 32349 ns/iter (± 881) 0.96
es/full/codegen/es2017 30962 ns/iter (± 510) 32349 ns/iter (± 1084) 0.96
es/full/codegen/es2018 31019 ns/iter (± 925) 32348 ns/iter (± 785) 0.96
es/full/codegen/es2019 30882 ns/iter (± 319) 32436 ns/iter (± 1401) 0.95
es/full/codegen/es2020 31042 ns/iter (± 560) 32440 ns/iter (± 653) 0.96
es/full/all/es3 180450431 ns/iter (± 6307896) 208352437 ns/iter (± 8853655) 0.87
es/full/all/es5 169075960 ns/iter (± 4800643) 195573364 ns/iter (± 5861027) 0.86
es/full/all/es2015 137492339 ns/iter (± 13348598) 145850706 ns/iter (± 5393485) 0.94
es/full/all/es2016 135905385 ns/iter (± 6272957) 142547930 ns/iter (± 4348550) 0.95
es/full/all/es2017 135796918 ns/iter (± 4693552) 142214704 ns/iter (± 3728628) 0.95
es/full/all/es2018 134576335 ns/iter (± 5046942) 142444425 ns/iter (± 6576891) 0.94
es/full/all/es2019 133760807 ns/iter (± 5011875) 139519148 ns/iter (± 5732935) 0.96
es/full/all/es2020 129343346 ns/iter (± 7884150) 135919801 ns/iter (± 8711451) 0.95
es/full/parser 695726 ns/iter (± 19696) 707459 ns/iter (± 22552) 0.98
es/full/base/fixer 29120 ns/iter (± 671) 29239 ns/iter (± 699) 1.00
es/full/base/resolver_and_hygiene 86689 ns/iter (± 3505) 90434 ns/iter (± 4198) 0.96
serialization of ast node 212 ns/iter (± 2) 215 ns/iter (± 1) 0.99
serialization of serde 225 ns/iter (± 2) 226 ns/iter (± 2) 1.00

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

Please sign in to comment.