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() { _validate: function() {
if (this.expressions.length < 2) throw new Error("expressions must contain multiple elements");
must_be_expressions(this, "expressions"); must_be_expressions(this, "expressions");
}, },
}); });

View File

@@ -111,7 +111,7 @@
var args = { var args = {
start : my_start_token(key), start : my_start_token(key),
end : my_end_token(M.value), 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) value : from_moz(M.value)
}; };
if (M.kind == "init") return new AST_ObjectKeyVal(args); if (M.kind == "init") return new AST_ObjectKeyVal(args);

View File

@@ -24,11 +24,22 @@ function try_beautify(code) {
} }
} }
function test(original, estree, description) { function validate(ast) {
var transformed = UglifyJS.minify(UglifyJS.AST_Node.from_mozilla_ast(estree), { try {
ast.walk(new UglifyJS.TreeWalker(function(node) {
node.validate();
}));
} catch (e) {
return { error: e };
}
return UglifyJS.minify(ast, {
compress: false, 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) { if (transformed.error || original !== transformed.code) {
console.log("//============================================================="); console.log("//=============================================================");
console.log("// !!!!!! Failed... round", round); 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) { (errored ? fallback_options : minify_options).forEach(function(options) {
var o = JSON.parse(options); var o = JSON.parse(options);
var toplevel = sandbox.has_toplevel(o); var toplevel = sandbox.has_toplevel(o);
o.validate = true;
uglify_code = UglifyJS.minify(original_code, o); uglify_code = UglifyJS.minify(original_code, o);
original_result = orig_result[toplevel ? 1 : 0]; original_result = orig_result[toplevel ? 1 : 0];
if (!uglify_code.error) { if (!uglify_code.error) {
@@ -1181,9 +1182,7 @@ for (var round = 1; round <= num_iterations; round++) {
} }
} else { } else {
uglify_code = uglify_code.error; uglify_code = uglify_code.error;
if (errored) { ok = sandbox.same_stdout(original_result, uglify_result);
ok = uglify_code.name == original_result.name;
}
} }
if (verbose || (verbose_interval && !(round % INTERVAL_COUNT)) || !ok) log(options); if (verbose || (verbose_interval && !(round % INTERVAL_COUNT)) || !ok) log(options);
else if (errored) { else if (errored) {