evaluate AST_SymbolRef as parameter
fix invalid boolean conversion now exposed in `make_node_from_constant()` closes #1477
This commit is contained in:
@@ -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()) {
|
||||||
|
|||||||
@@ -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/);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user