Skip to content

Commit

Permalink
fix(es/compat): Fix this in computed class method names (#6364)
Browse files Browse the repository at this point in the history
  • Loading branch information
Austaras committed Nov 6, 2022
1 parent 2c8c139 commit 9820122
Show file tree
Hide file tree
Showing 7 changed files with 33 additions and 13 deletions.
@@ -1,6 +1,6 @@
//// [computedPropertyNames21_ES5.ts]
import _class_call_check from "@swc/helpers/src/_class_call_check.mjs";
var C = /*#__PURE__*/ function() {
var C = /*#__PURE__*/ function(_prop) {
"use strict";
function C() {
_class_call_check(this, C);
Expand All @@ -9,6 +9,6 @@ var C = /*#__PURE__*/ function() {
_proto.bar = function bar() {
return 0;
};
_proto[this.bar()] = function() {};
_proto[_prop] = function() {};
return C;
}();
}(this.bar());
@@ -1,2 +1,3 @@
//// [computedPropertyNames21_ES5.ts]
import _class_call_check from "@swc/helpers/src/_class_call_check.mjs";
this.bar();
@@ -1,7 +1,7 @@
//// [computedPropertyNames23_ES5.ts]
import _class_call_check from "@swc/helpers/src/_class_call_check.mjs";
import _define_property from "@swc/helpers/src/_define_property.mjs";
var C = /*#__PURE__*/ function() {
var C = /*#__PURE__*/ function(_prop) {
"use strict";
function C() {
_class_call_check(this, C);
Expand All @@ -10,6 +10,6 @@ var C = /*#__PURE__*/ function() {
_proto.bar = function bar() {
return 0;
};
_proto[_define_property({}, this.bar(), 1)[0]] = function() {};
_proto[_prop] = function() {};
return C;
}();
}(_define_property({}, this.bar(), 1)[0]);
@@ -1,3 +1,4 @@
//// [computedPropertyNames23_ES5.ts]
import _class_call_check from "@swc/helpers/src/_class_call_check.mjs";
import _define_property from "@swc/helpers/src/_define_property.mjs";
_define_property({}, this.bar(), 1)[0];
16 changes: 9 additions & 7 deletions crates/swc_ecma_transforms_compat/src/es2015/classes/mod.rs
Expand Up @@ -7,9 +7,9 @@ use swc_ecma_transforms_base::{helper, native::is_native, perf::Check};
use swc_ecma_transforms_classes::super_field::SuperFieldAccessFolder;
use swc_ecma_transforms_macros::fast_path;
use swc_ecma_utils::{
alias_if_required, default_constructor, is_valid_ident, is_valid_prop_ident, prepend_stmt,
private_ident, prop_name_to_expr, quote_expr, quote_ident, quote_str, replace_ident,
ExprFactory, IdentExt, IsDirective, ModuleItemLike, StmtLike,
alias_if_required, contains_this_expr, default_constructor, is_valid_ident,
is_valid_prop_ident, prepend_stmt, private_ident, prop_name_to_expr, quote_expr, quote_ident,
quote_str, replace_ident, ExprFactory, IdentExt, IsDirective, ModuleItemLike, StmtLike,
};
use swc_ecma_visit::{
as_folder, noop_visit_mut_type, noop_visit_type, Fold, Visit, VisitMut, VisitMutWith, VisitWith,
Expand Down Expand Up @@ -535,7 +535,6 @@ where
let class_name = class_name.unwrap_or_else(|| quote_ident!("_class"));
let mut stmts = vec![];

let mut priv_methods = vec![];
let mut methods = vec![];
let mut constructor = None;
for member in class.body {
Expand All @@ -547,7 +546,9 @@ where
constructor = Some(c)
}
}
ClassMember::PrivateMethod(m) => priv_methods.push(m),
ClassMember::PrivateMethod(_) => unreachable!(
"classes pass: private method\nclass_properties pass should remove this"
),
ClassMember::Method(m) => methods.push(m),

ClassMember::ClassProp(..) => {
Expand Down Expand Up @@ -773,7 +774,6 @@ where
}

// convert class methods
// stmts.extend(self.fold_class_methods(class_name.clone(), priv_methods));
stmts.extend(self.fold_class_methods(&class_name, &super_class_ident, methods));

if stmts.first().map(|v| !v.is_use_strict()).unwrap_or(false) && !self.in_strict {
Expand Down Expand Up @@ -1009,11 +1009,13 @@ where
for mut m in methods {
let key = HashKey::from(&m.key);
let key_is_pure = is_pure_prop_name(&m.key);
// class is always strict, however computed key is not part of class
let key_contain_this = !self.in_strict && contains_this_expr(&m.key);
let key_prop = Box::new(m.key.clone());
let computed = matches!(m.key, PropName::Computed(..));
let prop_name = prop_name_to_expr(m.key);

let key_prop = if should_extract && !key_is_pure {
let key_prop = if should_extract && !key_is_pure || key_contain_this {
let ident = private_ident!("_prop");

self.params.push(ident.clone().into());
Expand Down
@@ -0,0 +1,3 @@
class x {
[this[0]]() {}
}
@@ -0,0 +1,13 @@
let x = /*#__PURE__*/ function(_prop) {
"use strict";
function x() {
_classCallCheck(this, x);
}
_createClass(x, [
{
key: _prop,
value: function() {}
}
]);
return x;
}(this[0]);

1 comment on commit 9820122

@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: 9820122 Previous: 2de45fb Ratio
es/full/bugs-1 373287 ns/iter (± 28346) 323867 ns/iter (± 14846) 1.15
es/full/minify/libraries/antd 2001873169 ns/iter (± 56900320) 1776574431 ns/iter (± 16943512) 1.13
es/full/minify/libraries/d3 401146522 ns/iter (± 10371101) 369077699 ns/iter (± 10680392) 1.09
es/full/minify/libraries/echarts 1751536448 ns/iter (± 53773341) 1517515641 ns/iter (± 17488702) 1.15
es/full/minify/libraries/jquery 114711300 ns/iter (± 8910224) 96313679 ns/iter (± 1611002) 1.19
es/full/minify/libraries/lodash 131769259 ns/iter (± 8526458) 112359385 ns/iter (± 3142850) 1.17
es/full/minify/libraries/moment 82814708 ns/iter (± 4260741) 56545710 ns/iter (± 1087138) 1.46
es/full/minify/libraries/react 26593976 ns/iter (± 1810720) 19220199 ns/iter (± 449290) 1.38
es/full/minify/libraries/terser 365326682 ns/iter (± 28101789) 284600336 ns/iter (± 7967274) 1.28
es/full/minify/libraries/three 704037778 ns/iter (± 25687217) 533373320 ns/iter (± 9205214) 1.32
es/full/minify/libraries/typescript 4179611782 ns/iter (± 152277217) 3203157553 ns/iter (± 34347304) 1.30
es/full/minify/libraries/victory 937062722 ns/iter (± 39953239) 782857472 ns/iter (± 12255166) 1.20
es/full/minify/libraries/vue 173936249 ns/iter (± 16561809) 143024842 ns/iter (± 2071717) 1.22
es/full/codegen/es3 34789 ns/iter (± 4909) 31968 ns/iter (± 1784) 1.09
es/full/codegen/es5 34478 ns/iter (± 4670) 31924 ns/iter (± 766) 1.08
es/full/codegen/es2015 34797 ns/iter (± 5091) 31903 ns/iter (± 1953) 1.09
es/full/codegen/es2016 41129 ns/iter (± 7043) 31911 ns/iter (± 1849) 1.29
es/full/codegen/es2017 41023 ns/iter (± 6930) 31888 ns/iter (± 1346) 1.29
es/full/codegen/es2018 34731 ns/iter (± 2874) 31785 ns/iter (± 677) 1.09
es/full/codegen/es2019 35554 ns/iter (± 5941) 31948 ns/iter (± 1160) 1.11
es/full/codegen/es2020 34846 ns/iter (± 3993) 31847 ns/iter (± 764) 1.09
es/full/all/es3 214985700 ns/iter (± 18702738) 182886523 ns/iter (± 2736779) 1.18
es/full/all/es5 243046724 ns/iter (± 21642421) 173528165 ns/iter (± 4678610) 1.40
es/full/all/es2015 192316368 ns/iter (± 14462713) 139082952 ns/iter (± 3129028) 1.38
es/full/all/es2016 186180612 ns/iter (± 19579409) 138471538 ns/iter (± 3349200) 1.34
es/full/all/es2017 166654404 ns/iter (± 23847007) 137710279 ns/iter (± 3089872) 1.21
es/full/all/es2018 183651979 ns/iter (± 21273439) 135997281 ns/iter (± 3157176) 1.35
es/full/all/es2019 182808659 ns/iter (± 19231820) 135509066 ns/iter (± 2963262) 1.35
es/full/all/es2020 180358610 ns/iter (± 20130818) 130280773 ns/iter (± 2209994) 1.38
es/full/parser 850885 ns/iter (± 102704) 677181 ns/iter (± 30840) 1.26
es/full/base/fixer 26902 ns/iter (± 2434) 24975 ns/iter (± 818) 1.08
es/full/base/resolver_and_hygiene 96786 ns/iter (± 10883) 87952 ns/iter (± 1392) 1.10
serialization of ast node 230 ns/iter (± 39) 221 ns/iter (± 5) 1.04
serialization of serde 283 ns/iter (± 47) 208 ns/iter (± 6) 1.36

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

Please sign in to comment.