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",
cname: "[integer/S] current index for mangling variables (used internally by the mangler)",
},
get_defun_scope: function () {
get_defun_scope: function() {
var self = this;
while (self.is_block_scope() && self.parent_scope) {
while (self.is_block_scope()) {
self = self.parent_scope;
}
return self;

View File

@@ -4645,8 +4645,10 @@ merge(Compressor.prototype, {
var init;
if (fixed instanceof AST_This) {
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;
} : function(ref) {
return d.scope === ref.scope.get_defun_scope();
})) {
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
// instanceof AST_Scope) but we get to the symbol a bit
// later.
var parent_lambda = defun.parent_scope;
while (parent_lambda.is_block_scope()) {
parent_lambda = parent_lambda.parent_scope;
}
mark_export((node.scope = parent_lambda).def_function(node), 1);
mark_export((node.scope = defun.parent_scope.get_defun_scope()).def_function(node), 1);
}
else if (node instanceof AST_SymbolClass) {
mark_export(defun.def_variable(node), 1);