aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2017-07-06 01:03:52 +0800
committerGitHub <noreply@github.com>2017-07-06 01:03:52 +0800
commit9306da3c58831fabc93dfae6a7ea4f45d42183d4 (patch)
tree49b3564d641468baf83d8fa8f6bbae0bbed2d2bc
parent1ac25fc032096459f2966236c99c0f21da2787f3 (diff)
downloadtracifyjs-9306da3c58831fabc93dfae6a7ea4f45d42183d4.tar.gz
tracifyjs-9306da3c58831fabc93dfae6a7ea4f45d42183d4.zip
suppress `collapse_vars` of `this` as call argument (#2204)
fixes #2203
-rw-r--r--lib/compress.js25
-rw-r--r--test/compress/collapse_vars.js64
2 files changed, 80 insertions, 9 deletions
diff --git a/lib/compress.js b/lib/compress.js
index d9936d2c..a2acd53f 100644
--- a/lib/compress.js
+++ b/lib/compress.js
@@ -823,16 +823,23 @@ merge(Compressor.prototype, {
fn.argnames.forEach(function(sym, i) {
var arg = iife.args[i];
if (!arg) arg = make_node(AST_Undefined, sym);
- else arg.walk(new TreeWalker(function(node) {
- if (!arg) return true;
- if (node instanceof AST_SymbolRef && fn.variables.has(node.name)) {
- var s = node.definition().scope;
- if (s !== scope) while (s = s.parent_scope) {
- if (s === scope) return true;
+ else {
+ var tw = new TreeWalker(function(node) {
+ if (!arg) return true;
+ if (node instanceof AST_SymbolRef && fn.variables.has(node.name)) {
+ var s = node.definition().scope;
+ if (s !== scope) while (s = s.parent_scope) {
+ if (s === scope) return true;
+ }
+ arg = null;
}
- arg = null;
- }
- }));
+ if (node instanceof AST_This && !tw.find_parent(AST_Scope)) {
+ arg = null;
+ return true;
+ }
+ });
+ arg.walk(tw);
+ }
if (arg) candidates.push(make_node(AST_VarDef, sym, {
name: sym,
value: arg
diff --git a/test/compress/collapse_vars.js b/test/compress/collapse_vars.js
index 24f8ffa3..7f3c470b 100644
--- a/test/compress/collapse_vars.js
+++ b/test/compress/collapse_vars.js
@@ -2256,3 +2256,67 @@ issue_2187_3: {
}
expect_stdout: "1"
}
+
+issue_2203_1: {
+ options = {
+ collapse_vars: true,
+ unused: true,
+ }
+ input: {
+ a = "FAIL";
+ console.log({
+ a: "PASS",
+ b: function() {
+ return function(c) {
+ return c.a;
+ }((String, (Object, this)));
+ }
+ }.b());
+ }
+ expect: {
+ a = "FAIL";
+ console.log({
+ a: "PASS",
+ b: function() {
+ return function(c) {
+ return c.a;
+ }((String, (Object, this)));
+ }
+ }.b());
+ }
+ expect_stdout: "PASS"
+}
+
+issue_2203_2: {
+ options = {
+ collapse_vars: true,
+ unused: true,
+ }
+ input: {
+ a = "PASS";
+ console.log({
+ a: "FAIL",
+ b: function() {
+ return function(c) {
+ return c.a;
+ }((String, (Object, function() {
+ return this;
+ }())));
+ }
+ }.b());
+ }
+ expect: {
+ a = "PASS";
+ console.log({
+ a: "FAIL",
+ b: function() {
+ return function(c) {
+ return (String, (Object, function() {
+ return this;
+ }())).a;
+ }();
+ }
+ }.b());
+ }
+ expect_stdout: "PASS"
+}