improve AST validation (#3864)

This commit is contained in:
Alex Lam S.L
2020-05-09 22:25:44 +01:00
committed by GitHub
parent f74b7f7401
commit 97728c4f0b
4 changed files with 18 additions and 7 deletions

View File

@@ -784,6 +784,7 @@ var AST_Sequence = DEFNODE("Sequence", "expressions", {
});
},
_validate: function() {
if (this.expressions.length < 2) throw new Error("expressions must contain multiple elements");
must_be_expressions(this, "expressions");
},
});

View File

@@ -111,7 +111,7 @@
var args = {
start : my_start_token(key),
end : my_end_token(M.value),
key : key.type == "Identifier" ? key.name : key.value,
key : "" + key[key.type == "Identifier" ? "name" : "value"],
value : from_moz(M.value)
};
if (M.kind == "init") return new AST_ObjectKeyVal(args);

View File

@@ -24,11 +24,22 @@ function try_beautify(code) {
}
}
function test(original, estree, description) {
var transformed = UglifyJS.minify(UglifyJS.AST_Node.from_mozilla_ast(estree), {
function validate(ast) {
try {
ast.walk(new UglifyJS.TreeWalker(function(node) {
node.validate();
}));
} catch (e) {
return { error: e };
}
return UglifyJS.minify(ast, {
compress: false,
mangle: false
mangle: false,
});
}
function test(original, estree, description) {
var transformed = validate(UglifyJS.AST_Node.from_mozilla_ast(estree));
if (transformed.error || original !== transformed.code) {
console.log("//=============================================================");
console.log("// !!!!!! Failed... round", round);

View File

@@ -1161,6 +1161,7 @@ for (var round = 1; round <= num_iterations; round++) {
(errored ? fallback_options : minify_options).forEach(function(options) {
var o = JSON.parse(options);
var toplevel = sandbox.has_toplevel(o);
o.validate = true;
uglify_code = UglifyJS.minify(original_code, o);
original_result = orig_result[toplevel ? 1 : 0];
if (!uglify_code.error) {
@@ -1181,9 +1182,7 @@ for (var round = 1; round <= num_iterations; round++) {
}
} else {
uglify_code = uglify_code.error;
if (errored) {
ok = uglify_code.name == original_result.name;
}
ok = sandbox.same_stdout(original_result, uglify_result);
}
if (verbose || (verbose_interval && !(round % INTERVAL_COUNT)) || !ok) log(options);
else if (errored) {