d.fixed = false;
}
} else {
- var parent = tw.parent();
- if (parent instanceof AST_Assign && parent.operator == "=" && node === parent.right
- || parent instanceof AST_Call && node !== parent.expression
- || parent instanceof AST_Return && node === parent.value && node.scope !== d.scope
- || parent instanceof AST_VarDef && node === parent.value) {
- d.escaped = true;
- }
+ mark_escaped(d, node, 0);
}
}
}
return !immutable && is_modified(parent, level + 1);
}
}
+
+ function mark_escaped(d, node, level) {
+ var parent = tw.parent(level);
+ if (parent instanceof AST_Assign && parent.operator == "=" && node === parent.right
+ || parent instanceof AST_Call && node !== parent.expression
+ || parent instanceof AST_Return && node === parent.value && node.scope !== d.scope
+ || parent instanceof AST_VarDef && node === parent.value) {
+ d.escaped = true;
+ } else if (parent instanceof AST_PropAccess && node === parent.expression) {
+ mark_escaped(d, parent, level + 1);
+ }
+ }
});
AST_SymbolRef.DEFMETHOD("fixed_value", function() {
for_loop: {
options = {
- unsafe : true,
- unused : true,
- evaluate : true,
- reduce_vars : true
+ evaluate: true,
+ reduce_vars: true,
+ unsafe: true,
};
input: {
function f0() {
var a = [1, 2, 3];
- for (var i = 0; i < a.length; i++) {
- console.log(a[i]);
- }
+ var b = 0;
+ for (var i = 0; i < a.length; i++)
+ b += a[i];
+ return b;
}
-
function f1() {
var a = [1, 2, 3];
- for (var i = 0, len = a.length; i < len; i++) {
- console.log(a[i]);
- }
+ var b = 0;
+ for (var i = 0, len = a.length; i < len; i++)
+ b += a[i];
+ return b;
}
-
function f2() {
var a = [1, 2, 3];
- for (var i = 0; i < a.length; i++) {
+ for (var i = 0; i < a.length; i++)
a[i]++;
- }
+ return a[2];
}
+ console.log(f0(), f1(), f2());
}
expect: {
function f0() {
var a = [1, 2, 3];
+ var b = 0;
for (var i = 0; i < 3; i++)
- console.log(a[i]);
+ b += a[i];
+ return b;
}
-
function f1() {
var a = [1, 2, 3];
- for (var i = 0; i < 3; i++)
- console.log(a[i]);
+ var b = 0;
+ for (var i = 0, len = a.length; i < len; i++)
+ b += a[i];
+ return b;
}
-
function f2() {
var a = [1, 2, 3];
for (var i = 0; i < a.length; i++)
a[i]++;
+ return a[2];
}
+ console.log(f0(), f1(), f2());
}
+ expect_stdout: "6 6 4"
}
}
expect_stdout: "2 2"
}
+
+escaped_prop: {
+ options = {
+ collapse_vars: true,
+ evaluate: true,
+ inline: true,
+ pure_getters: "strict",
+ reduce_vars: true,
+ side_effects: true,
+ toplevel: true,
+ unsafe: true,
+ unused: true,
+ }
+ input: {
+ var obj = { o: { a: 1 } };
+ (function(o) {
+ o.a++;
+ })(obj.o);
+ (function(o) {
+ console.log(o.a);
+ })(obj.o);
+ }
+ expect: {
+ var obj = { o: { a: 1 } };
+ obj.o.a++;
+ console.log(obj.o.a);
+ }
+ expect_stdout: "2"
+}