});
def(AST_Unary, function(tw, descend) {
var node = this;
- if (!unary_arithmetic[node.operator]) return;
+ if (!UNARY_POSTFIX[node.operator]) return;
var exp = node.expression;
if (!(exp instanceof AST_SymbolRef)) {
mark_assignment_to_arguments(exp);
extract_candidates(expr.expression);
expr.body.forEach(extract_candidates);
} else if (expr instanceof AST_Unary) {
- if (unary_arithmetic[expr.operator]) {
+ if (UNARY_POSTFIX[expr.operator]) {
candidates.push(hit_stack.slice());
} else {
extract_candidates(expr.expression);
});
var lazy_op = makePredicate("&& ||");
- var unary_arithmetic = makePredicate("++ --");
- var unary_side_effects = makePredicate("delete ++ --");
function is_lhs(node, parent) {
if (parent instanceof AST_Assign) return parent.left === node && node;
});
var scan_modified = new TreeWalker(function(node) {
if (node instanceof AST_Assign) modified(node.left);
- if (node instanceof AST_Unary && unary_arithmetic[node.operator]) modified(node.expression);
+ if (node instanceof AST_Unary && UNARY_POSTFIX[node.operator]) modified(node.expression);
});
function modified(node) {
if (node instanceof AST_PropAccess) {
return true;
}
if (node instanceof AST_Unary) {
- if (!unary_arithmetic[node.operator]) return;
+ if (!UNARY_POSTFIX[node.operator]) return;
var sym = node.expression;
if (!(sym instanceof AST_SymbolRef)) return;
mark(sym, true, true);
&& is_arguments(def = expr.definition())
&& prop instanceof AST_Number
&& (fn = def.scope) === find_lambda()
- && !(assigned && fn.uses_arguments === "d")) {
+ && fn.uses_arguments < (assigned ? 2 : 3)) {
var index = prop.value;
if (parent instanceof AST_UnaryPrefix && parent.operator == "delete") {
if (!def.deleted) def.deleted = [];
},
};
+var unary_side_effects = makePredicate("delete ++ --");
+
AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
options = defaults(options, {
cache: null,
} else if (name == "arguments"
&& sym.orig[0] instanceof AST_SymbolFunarg
&& !(sym.scope instanceof AST_Arrow)) {
- if (!(tw.parent() instanceof AST_PropAccess)) {
- sym.scope.uses_arguments = "d";
+ var parent = tw.parent();
+ if (parent instanceof AST_Assign && parent.left === node
+ || parent instanceof AST_Unary && unary_side_effects[parent.operator]) {
+ sym.scope.uses_arguments = 3;
+ } else if (sym.scope.uses_arguments < 2
+ && !(parent instanceof AST_PropAccess && parent.expression === node)) {
+ sym.scope.uses_arguments = 2;
} else if (!sym.scope.uses_arguments) {
sym.scope.uses_arguments = true;
}