reduce this in block scopes (#2526)

fixes #2455
This commit is contained in:
Alex Lam S.L
2017-11-28 22:54:21 +08:00
committed by GitHub
parent 37cbd7080c
commit 62d2817d6c
4 changed files with 24 additions and 8 deletions

View File

@@ -313,9 +313,9 @@ var AST_Scope = DEFNODE("Scope", "variables functions uses_with uses_eval parent
enclosed: "[SymbolDef*/S] a list of all symbol definitions that are accessed from this scope or any subscopes", enclosed: "[SymbolDef*/S] a list of all symbol definitions that are accessed from this scope or any subscopes",
cname: "[integer/S] current index for mangling variables (used internally by the mangler)", cname: "[integer/S] current index for mangling variables (used internally by the mangler)",
}, },
get_defun_scope: function () { get_defun_scope: function() {
var self = this; var self = this;
while (self.is_block_scope() && self.parent_scope) { while (self.is_block_scope()) {
self = self.parent_scope; self = self.parent_scope;
} }
return self; return self;

View File

@@ -4645,8 +4645,10 @@ merge(Compressor.prototype, {
var init; var init;
if (fixed instanceof AST_This) { if (fixed instanceof AST_This) {
if (!(d.orig[0] instanceof AST_SymbolFunarg) if (!(d.orig[0] instanceof AST_SymbolFunarg)
&& all(d.references, function(ref) { && all(d.references, d.scope.is_block_scope() ? function(ref) {
return d.scope === ref.scope; return d.scope === ref.scope;
} : function(ref) {
return d.scope === ref.scope.get_defun_scope();
})) { })) {
init = fixed; init = fixed;
} }

View File

@@ -183,11 +183,7 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
// scope when we encounter the AST_Defun node (which is // scope when we encounter the AST_Defun node (which is
// instanceof AST_Scope) but we get to the symbol a bit // instanceof AST_Scope) but we get to the symbol a bit
// later. // later.
var parent_lambda = defun.parent_scope; mark_export((node.scope = defun.parent_scope.get_defun_scope()).def_function(node), 1);
while (parent_lambda.is_block_scope()) {
parent_lambda = parent_lambda.parent_scope;
}
mark_export((node.scope = parent_lambda).def_function(node), 1);
} }
else if (node instanceof AST_SymbolClass) { else if (node instanceof AST_SymbolClass) {
mark_export(defun.def_variable(node), 1); mark_export(defun.def_variable(node), 1);

View File

@@ -4887,3 +4887,21 @@ issue_2416: {
expect_stdout: "Foo" expect_stdout: "Foo"
node_version: ">=6" node_version: ">=6"
} }
issue_2455: {
options = {
reduce_vars: true,
unused: true,
}
input: {
function foo() {
var that = this;
for (;;) that.bar();
}
}
expect: {
function foo() {
for (;;) this.bar();
}
}
}