improve AST validation (#3864)
This commit is contained in:
@@ -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");
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user