evaluate AST_SymbolRef as parameter

fix invalid boolean conversion now exposed in `make_node_from_constant()`

closes #1477
This commit is contained in:
alexlamsl
2017-02-18 19:22:24 +08:00
parent a0f4fd390a
commit 974247c8c0
2 changed files with 56 additions and 6 deletions

View File

@@ -234,7 +234,7 @@ merge(Compressor.prototype, {
case "string": case "string":
return make_node(AST_String, orig, { return make_node(AST_String, orig, {
value: val value: val
}).optimize(compressor); });
case "number": case "number":
if (isNaN(val)) { if (isNaN(val)) {
return make_node(AST_NaN, orig); return make_node(AST_NaN, orig);
@@ -247,17 +247,17 @@ merge(Compressor.prototype, {
}); });
} }
return make_node(AST_Number, orig, { value: val }).optimize(compressor); return make_node(AST_Number, orig, { value: val });
case "boolean": case "boolean":
return make_node(val ? AST_True : AST_False, orig).optimize(compressor); return make_node(val ? AST_True : AST_False, orig).transform(compressor);
case "undefined": case "undefined":
return make_node(AST_Undefined, orig).optimize(compressor); return make_node(AST_Undefined, orig).transform(compressor);
default: default:
if (val === null) { if (val === null) {
return make_node(AST_Null, orig, { value: null }).optimize(compressor); return make_node(AST_Null, orig, { value: null });
} }
if (val instanceof RegExp) { if (val instanceof RegExp) {
return make_node(AST_RegExp, orig, { value: val }).optimize(compressor); return make_node(AST_RegExp, orig, { value: val });
} }
throw new Error(string_template("Can't handle constant of type: {type}", { throw new Error(string_template("Can't handle constant of type: {type}", {
type: typeof val type: typeof val
@@ -2179,6 +2179,9 @@ merge(Compressor.prototype, {
}); });
OPT(AST_Call, function(self, compressor){ OPT(AST_Call, function(self, compressor){
self.args = self.args.map(function(arg) {
return arg.evaluate(compressor)[0];
});
if (compressor.option("unsafe")) { if (compressor.option("unsafe")) {
var exp = self.expression; var exp = self.expression;
if (exp instanceof AST_SymbolRef && exp.undeclared()) { if (exp instanceof AST_SymbolRef && exp.undeclared()) {

View File

@@ -598,3 +598,50 @@ unsafe_prototype_function: {
var h = "" + ({toString: 0}); var h = "" + ({toString: 0});
} }
} }
call_args: {
options = {
evaluate: true,
}
input: {
const a = 1;
console.log(a);
+function(a) {
return a;
}(a);
}
expect: {
const a = 1;
console.log(1);
+function(a) {
return a;
}(1);
}
}
in_boolean_context: {
options = {
booleans: true,
evaluate: true,
}
input: {
!42;
!"foo";
![1, 2];
!/foo/;
!b(42);
!b("foo");
!b([1, 2]);
!b(/foo/);
}
expect: {
!1;
!1;
!1;
!1;
!b(42);
!b("foo");
!b([1, 2]);
!b(/foo/);
}
}