@@ -364,7 +364,7 @@ Compressor.prototype.compress = function(node) {
|
|||||||
expression: make_node(AST_Function, self, {
|
expression: make_node(AST_Function, self, {
|
||||||
argnames: [],
|
argnames: [],
|
||||||
body: self.body,
|
body: self.body,
|
||||||
}).init_vars(self),
|
}).init_vars(self, self),
|
||||||
args: [],
|
args: [],
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -8963,7 +8963,7 @@ Compressor.prototype.compress = function(node) {
|
|||||||
argnames: [],
|
argnames: [],
|
||||||
body: [],
|
body: [],
|
||||||
value: make_value(),
|
value: make_value(),
|
||||||
}).init_vars(self.parent_scope),
|
}).init_vars(self.parent_scope, self),
|
||||||
args: [],
|
args: [],
|
||||||
}));
|
}));
|
||||||
return make_sequence(self, exprs);
|
return make_sequence(self, exprs);
|
||||||
|
|||||||
48
lib/scope.js
48
lib/scope.js
@@ -439,35 +439,43 @@ AST_Toplevel.DEFMETHOD("def_global", function(node) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
function init_block_vars(scope, parent) {
|
function init_block_vars(scope, parent, orig) {
|
||||||
scope.enclosed = []; // variables from this or outer scope(s) that are referenced from this or inner scopes
|
// variables from this or outer scope(s) that are referenced from this or inner scopes
|
||||||
scope.parent_scope = parent; // the parent scope (null if this is the top level)
|
scope.enclosed = orig ? orig.enclosed.slice() : [];
|
||||||
scope.functions = new Dictionary(); // map name to AST_SymbolDefun (functions defined in this scope)
|
// map name to AST_SymbolDefun (functions defined in this scope)
|
||||||
scope.variables = new Dictionary(); // map name to AST_SymbolVar (variables defined in this scope; includes functions)
|
scope.functions = orig ? orig.functions.clone() : new Dictionary();
|
||||||
if (parent) scope.make_def = parent.make_def; // top-level tracking of SymbolDef instances
|
// map name to AST_SymbolVar (variables defined in this scope; includes functions)
|
||||||
|
scope.variables = orig ? orig.variables.clone() : new Dictionary();
|
||||||
|
if (!parent) return;
|
||||||
|
// top-level tracking of SymbolDef instances
|
||||||
|
scope.make_def = parent.make_def;
|
||||||
|
// the parent scope (null if this is the top level)
|
||||||
|
scope.parent_scope = parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
function init_scope_vars(scope, parent) {
|
function init_scope_vars(scope, parent, orig) {
|
||||||
init_block_vars(scope, parent);
|
init_block_vars(scope, parent, orig);
|
||||||
scope.uses_eval = false; // will be set to true if this or nested scope uses the global `eval`
|
// will be set to true if this or nested scope uses the global `eval`
|
||||||
scope.uses_with = false; // will be set to true if this or some nested scope uses the `with` statement
|
scope.uses_eval = false;
|
||||||
|
// will be set to true if this or some nested scope uses the `with` statement
|
||||||
|
scope.uses_with = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
AST_BlockScope.DEFMETHOD("init_vars", function(parent_scope) {
|
AST_BlockScope.DEFMETHOD("init_vars", function(parent, orig) {
|
||||||
init_block_vars(this, parent_scope);
|
init_block_vars(this, parent, orig);
|
||||||
});
|
});
|
||||||
AST_Scope.DEFMETHOD("init_vars", function(parent_scope) {
|
AST_Scope.DEFMETHOD("init_vars", function(parent, orig) {
|
||||||
init_scope_vars(this, parent_scope);
|
init_scope_vars(this, parent, orig);
|
||||||
});
|
});
|
||||||
AST_Arrow.DEFMETHOD("init_vars", function(parent_scope) {
|
AST_Arrow.DEFMETHOD("init_vars", function(parent, orig) {
|
||||||
init_scope_vars(this, parent_scope);
|
init_scope_vars(this, parent, orig);
|
||||||
return this;
|
return this;
|
||||||
});
|
});
|
||||||
AST_AsyncArrow.DEFMETHOD("init_vars", function(parent_scope) {
|
AST_AsyncArrow.DEFMETHOD("init_vars", function(parent, orig) {
|
||||||
init_scope_vars(this, parent_scope);
|
init_scope_vars(this, parent, orig);
|
||||||
});
|
});
|
||||||
AST_Lambda.DEFMETHOD("init_vars", function(parent_scope) {
|
AST_Lambda.DEFMETHOD("init_vars", function(parent, orig) {
|
||||||
init_scope_vars(this, parent_scope);
|
init_scope_vars(this, parent, orig);
|
||||||
this.uses_arguments = false;
|
this.uses_arguments = false;
|
||||||
this.def_variable(new AST_SymbolFunarg({
|
this.def_variable(new AST_SymbolFunarg({
|
||||||
name: "arguments",
|
name: "arguments",
|
||||||
|
|||||||
@@ -3901,3 +3901,29 @@ issue_5682_class_key_computed: {
|
|||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_5724: {
|
||||||
|
options = {
|
||||||
|
arrows: true,
|
||||||
|
inline: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
class A {
|
||||||
|
static P = function(a) {
|
||||||
|
console.log(a, a);
|
||||||
|
}(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
(function(a) {
|
||||||
|
console.log(a, a);
|
||||||
|
})(a);
|
||||||
|
}
|
||||||
|
expect_stdout: ReferenceError("a is not defined")
|
||||||
|
node_version: ">=12"
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user