Fix spidermonkey AST (ESTree) export and import, Array holes
Fixes: #1156 #1161 Also add test to exercise Uglify after spidermonkey export/import of itself.
This commit is contained in:
@@ -190,7 +190,7 @@ merge(Compressor.prototype, {
|
|||||||
if ((1 / val) < 0) {
|
if ((1 / val) < 0) {
|
||||||
return make_node(AST_UnaryPrefix, orig, {
|
return make_node(AST_UnaryPrefix, orig, {
|
||||||
operator: "-",
|
operator: "-",
|
||||||
expression: make_node(AST_Number, null, { value: -val })
|
expression: make_node(AST_Number, orig, { value: -val })
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -94,6 +94,15 @@
|
|||||||
return new AST_ObjectGetter(args);
|
return new AST_ObjectGetter(args);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
ArrayExpression: function(M) {
|
||||||
|
return new AST_Array({
|
||||||
|
start : my_start_token(M),
|
||||||
|
end : my_end_token(M),
|
||||||
|
elements : M.elements.map(function(elem){
|
||||||
|
return elem === null ? new AST_Hole() : from_moz(elem);
|
||||||
|
})
|
||||||
|
});
|
||||||
|
},
|
||||||
ObjectExpression: function(M) {
|
ObjectExpression: function(M) {
|
||||||
return new AST_Object({
|
return new AST_Object({
|
||||||
start : my_start_token(M),
|
start : my_start_token(M),
|
||||||
@@ -206,7 +215,6 @@
|
|||||||
map("CatchClause", AST_Catch, "param>argname, body%body");
|
map("CatchClause", AST_Catch, "param>argname, body%body");
|
||||||
|
|
||||||
map("ThisExpression", AST_This);
|
map("ThisExpression", AST_This);
|
||||||
map("ArrayExpression", AST_Array, "elements@elements");
|
|
||||||
map("FunctionExpression", AST_Function, "id>name, params@argnames, body%body");
|
map("FunctionExpression", AST_Function, "id>name, params@argnames, body%body");
|
||||||
map("BinaryExpression", AST_Binary, "operator=operator, left>left, right>right");
|
map("BinaryExpression", AST_Binary, "operator=operator, left>left, right>right");
|
||||||
map("LogicalExpression", AST_Binary, "operator=operator, left>left, right>right");
|
map("LogicalExpression", AST_Binary, "operator=operator, left>left, right>right");
|
||||||
@@ -302,6 +310,13 @@
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
def_to_moz(AST_Array, function To_Moz_ArrayExpression(M) {
|
||||||
|
return {
|
||||||
|
type: "ArrayExpression",
|
||||||
|
elements: M.elements.map(to_moz)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
def_to_moz(AST_Object, function To_Moz_ObjectExpression(M) {
|
def_to_moz(AST_Object, function To_Moz_ObjectExpression(M) {
|
||||||
return {
|
return {
|
||||||
type: "ObjectExpression",
|
type: "ObjectExpression",
|
||||||
|
|||||||
33
test/mocha/spidermonkey.js
Normal file
33
test/mocha/spidermonkey.js
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
var assert = require("assert");
|
||||||
|
var exec = require("child_process").exec;
|
||||||
|
|
||||||
|
describe("spidermonkey export/import sanity test", function() {
|
||||||
|
it("should produce a functional build when using --self with spidermonkey", function (done) {
|
||||||
|
this.timeout(20000);
|
||||||
|
|
||||||
|
var uglifyjs = '"' + process.argv[0] + '" bin/uglifyjs';
|
||||||
|
var command = uglifyjs + " --self -cm --wrap SpiderUglify --dump-spidermonkey-ast | " +
|
||||||
|
uglifyjs + " --spidermonkey -cm";
|
||||||
|
|
||||||
|
exec(command, function (err, stdout) {
|
||||||
|
if (err) throw err;
|
||||||
|
|
||||||
|
eval(stdout);
|
||||||
|
assert.strictEqual(typeof SpiderUglify, "object");
|
||||||
|
|
||||||
|
var ast = SpiderUglify.parse("foo([true,,2+3]);");
|
||||||
|
assert.strictEqual(true, ast instanceof SpiderUglify.AST_Node);
|
||||||
|
|
||||||
|
ast.figure_out_scope();
|
||||||
|
ast = SpiderUglify.Compressor({}).compress(ast);
|
||||||
|
assert.strictEqual(true, ast instanceof SpiderUglify.AST_Node);
|
||||||
|
|
||||||
|
var stream = SpiderUglify.OutputStream({});
|
||||||
|
ast.print(stream);
|
||||||
|
var code = stream.toString();
|
||||||
|
assert.strictEqual(code, "foo([!0,,5]);");
|
||||||
|
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user