diff options
Diffstat (limited to 'tools/js-optimizer.js')
-rw-r--r-- | tools/js-optimizer.js | 38 |
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); }); |