if (value && indexOf_assign(sym, def) < 0) {
value = value.drop_side_effect_free(compressor);
if (value) {
- AST_Node.warn("Side effects in last use of variable {name} [{file}:{line},{col}]", template(def.name));
+ AST_Node.warn("Side effects in definition of variable {name} [{file}:{line},{col}]", template(def.name));
side_effects.push(value);
}
value = null;
var assign = make_node(AST_Assign, def, {
operator: "=",
left: ref,
- right: def.value
+ right: def.value,
});
var index = indexOf_assign(sym, def);
if (index >= 0) assign_in_use[sym.id][index] = assign;
});
AST_LambdaExpression.DEFMETHOD("contains_super", function() {
- var result;
+ var result = false;
var self = this;
self.walk(new TreeWalker(function(node) {
if (result) return true;
return result;
});
- AST_Arrow.DEFMETHOD("contains_this", return_false);
- AST_AsyncArrow.DEFMETHOD("contains_this", return_false);
- AST_Node.DEFMETHOD("contains_this", function() {
- var result;
- var self = this;
- self.walk(new TreeWalker(function(node) {
- if (result) return true;
- if (node instanceof AST_This) return result = true;
- if (node !== self && node instanceof AST_Scope && !is_arrow(node)) return true;
- }));
- return result;
+ // contains_this()
+ // returns false only if context bound by the specified scope (or scope
+ // containing the specified expression) is not referenced by `this`
+ (function(def) {
+ // scope of arrow function cannot bind to any context
+ def(AST_Arrow, return_false);
+ def(AST_AsyncArrow, return_false);
+ def(AST_Node, function() {
+ var result = false;
+ var self = this;
+ self.walk(new TreeWalker(function(node) {
+ if (result) return true;
+ if (node instanceof AST_This) return result = true;
+ if (node !== self && node instanceof AST_Scope && !is_arrow(node)) return true;
+ }));
+ return result;
+ });
+ })(function(node, func) {
+ node.DEFMETHOD("contains_this", func);
});
function can_hoist_property(prop) {