aboutsummaryrefslogtreecommitdiff
path: root/tools/js-optimizer.js
diff options
context:
space:
mode:
Diffstat (limited to 'tools/js-optimizer.js')
-rw-r--r--tools/js-optimizer.js38
1 files changed, 27 insertions, 11 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js
index 5d7704d7..940719e9 100644
--- a/tools/js-optimizer.js
+++ b/tools/js-optimizer.js
@@ -11,6 +11,7 @@
// *** Environment setup code ***
var arguments_ = [];
+var debug = false;
var ENVIRONMENT_IS_NODE = typeof process === 'object';
var ENVIRONMENT_IS_WEB = typeof window === 'object';
@@ -146,11 +147,12 @@ var generatedFunctions = false; // whether we have received only generated funct
var minifierInfo = null;
function srcToAst(src) {
- return uglify.parser.parse(src);
+ return uglify.parser.parse(src, false, debug);
}
function astToSrc(ast, minifyWhitespace) {
return uglify.uglify.gen_code(ast, {
+ debug: debug,
ascii_only: true,
beautify: !minifyWhitespace,
indent_level: 1
@@ -162,7 +164,8 @@ function astToSrc(ast, minifyWhitespace) {
function traverseChildren(node, traverse, pre, post, stack) {
for (var i = 0; i < node.length; i++) {
var subnode = node[i];
- if (typeof subnode == 'object' && subnode && subnode.length) {
+ if (typeof subnode == 'object' && subnode && subnode.length &&
+ typeof subnode.valueOf() !== 'string') {
var subresult = traverse(subnode, pre, post, stack);
if (subresult == true) return true;
if (subresult !== null && typeof subresult == 'object') node[i] = subresult;
@@ -186,7 +189,9 @@ function traverseChildren(node, traverse, pre, post, stack) {
// was stopped, true. Otherwise undefined.
function traverse(node, pre, post, stack) {
var type = node[0], result, len;
- var relevant = typeof type == 'string';
+ // valueOf() ensures that NodeWithToken (produced by uglify's parser during
+ // 'embed tokens' mode) gets marked as 'relevant'
+ var relevant = type && typeof type.valueOf() == 'string';
if (relevant) {
if (stack) len = stack.length;
var result = pre(node, type, stack);
@@ -446,7 +451,9 @@ function simplifyExpressionsPre(ast) {
traverse(ast, function process(node, type, stack) {
if (type == 'binary' && node[1] == '|') {
if (node[2][0] == 'num' && node[3][0] == 'num') {
- return ['num', node[2][1] | node[3][1]];
+ // pass node[2][0] instead of 'num' because it might be a token
+ // object with line numbers attached.
+ return [node[2][0], node[2][1] | node[3][1]];
}
var go = false;
if (jsonCompare(node[2], ZERO)) {
@@ -2031,7 +2038,7 @@ function eliminate(ast, memSafe) {
// examine body and note locals
var hasSwitch = false;
traverse(func, function(node, type) {
- if (type === 'var') {
+ if (type == 'var') {
var node1 = node[1];
for (var i = 0; i < node1.length; i++) {
var node1i = node1[i];
@@ -2045,7 +2052,7 @@ function eliminate(ast, memSafe) {
if (!uses[name]) uses[name] = 0;
locals[name] = true;
}
- } else if (type === 'name') {
+ } else if (type == 'name') {
var name = node[1];
if (!uses[name]) uses[name] = 0;
uses[name]++;
@@ -2505,7 +2512,7 @@ function eliminate(ast, memSafe) {
// clean up vars, and loop variable elimination
traverse(func, function(node, type) {
// pre
- if (type === 'var') {
+ if (type == 'var') {
node[1] = node[1].filter(function(pair) { return !varsToRemove[pair[0]] });
if (node[1].length == 0) {
// wipe out an empty |var;|
@@ -2634,21 +2641,21 @@ function eliminate(ast, memSafe) {
this.run = function() {
traverse(this.node, function(node, type) {
- if (type === 'binary' && node[1] == '+') {
+ if (type == 'binary' && node[1] == '+') {
var names = [];
var num = 0;
var has_num = false;
var fail = false;
traverse(node, function(subNode, subType) {
- if (subType === 'binary') {
+ if (subType == 'binary') {
if (subNode[1] != '+') {
fail = true;
return false;
}
- } else if (subType === 'name') {
+ } else if (subType == 'name') {
names.push(subNode[1]);
return;
- } else if (subType === 'num') {
+ } else if (subType == 'num') {
num += subNode[1];
has_num = true;
return;
@@ -2787,6 +2794,14 @@ var passes = {
var suffix = '';
+arguments_ = arguments_.filter(function (arg) {
+ if (!/^--/.test(arg)) return true;
+
+ if (arg === '--debug') debug = true;
+ else throw new Error('Unrecognized flag: ' + arg);
+});
+
+
var src = read(arguments_[0]);
var ast = srcToAst(src);
//printErr(JSON.stringify(ast)); throw 1;
@@ -2795,6 +2810,7 @@ var minifierInfoStart = src.indexOf('// MINIFY_INFO:')
if (minifierInfoStart > 0) minifierInfo = JSON.parse(src.substr(minifierInfoStart + 15));
//printErr(JSON.stringify(minifierInfo));
+
arguments_.slice(1).forEach(function(arg) {
passes[arg](ast);
});