From b34fa11a13221b7ad26ea48f18fcf2f5903c94c1 Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Wed, 1 Mar 2017 02:03:47 +0800 Subject: [PATCH] fix `evaluate` on object getter & setter (#1515) --- lib/compress.js | 15 ++++++++++----- test/compress/evaluate.js | 26 ++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index 294cb616..0349e45f 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -1148,11 +1148,14 @@ merge(Compressor.prototype, { def(AST_Statement, function(){ throw new Error(string_template("Cannot evaluate a statement [{file}:{line},{col}]", this.start)); }); + // XXX: AST_Accessor and AST_Function both inherit from AST_Scope, + // which itself inherits from AST_Statement; however, they aren't + // really statements. This could bite in other places too. :-( + // Wish JS had multiple inheritance. + def(AST_Accessor, function(){ + throw def; + }); def(AST_Function, function(){ - // XXX: AST_Function inherits from AST_Scope, which itself - // inherits from AST_Statement; however, an AST_Function - // isn't really a statement. This could byte in other - // places too. :-( Wish JS had multiple inheritance. throw def; }); function ev(node, compressor) { @@ -1180,7 +1183,9 @@ merge(Compressor.prototype, { for (var i = 0, len = this.properties.length; i < len; i++) { var prop = this.properties[i]; var key = prop.key; - if (key instanceof AST_Node) { + if (key instanceof AST_Symbol) { + key = key.name; + } else if (key instanceof AST_Node) { key = ev(key, compressor); } if (typeof Object.prototype[key] === 'function') { diff --git a/test/compress/evaluate.js b/test/compress/evaluate.js index 6bed73fb..f84436df 100644 --- a/test/compress/evaluate.js +++ b/test/compress/evaluate.js @@ -337,6 +337,32 @@ unsafe_object_repeated: { } } +unsafe_object_accessor: { + options = { + evaluate: true, + reduce_vars: true, + unsafe: true, + } + input: { + function f() { + var a = { + get b() {}, + set b() {} + }; + return {a:a}; + } + } + expect: { + function f() { + var a = { + get b() {}, + set b() {} + }; + return {a:a}; + } + } +} + unsafe_function: { options = { evaluate : true, -- 2.34.1