Skip to content

Commit 7212198

Browse files
committed
Make optimizer handle both strings and string-like type objects.
NodeWithToken is a string-like type produced by the parser during 'embed tokens' mode, which allows us to track line numbers.
1 parent 99fa57e commit 7212198

File tree

2 files changed

+35
-11
lines changed

2 files changed

+35
-11
lines changed

tools/eliminator/node_modules/uglify-js/lib/parse-js.js

+23-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tools/js-optimizer.js

+12-9
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,8 @@ function astToSrc(ast, compress) {
164164
function traverseChildren(node, traverse, pre, post, stack) {
165165
for (var i = 0; i < node.length; i++) {
166166
var subnode = node[i];
167-
if (typeof subnode == 'object' && subnode && subnode.length) {
167+
if (typeof subnode == 'object' && subnode && subnode.length &&
168+
typeof subnode.valueOf() !== 'string') {
168169
var subresult = traverse(subnode, pre, post, stack);
169170
if (subresult == true) return true;
170171
if (subresult !== null && typeof subresult == 'object') node[i] = subresult;
@@ -188,7 +189,9 @@ function traverseChildren(node, traverse, pre, post, stack) {
188189
// was stopped, true. Otherwise undefined.
189190
function traverse(node, pre, post, stack) {
190191
var type = node[0], result, len;
191-
var relevant = typeof type == 'string';
192+
// valueOf() ensures that NodeWithToken (produced by uglify's parser during
193+
// 'embed tokens' mode) gets marked as 'relevant'
194+
var relevant = type && typeof type.valueOf() == 'string';
192195
if (relevant) {
193196
if (stack) len = stack.length;
194197
var result = pre(node, type, stack);
@@ -2006,7 +2009,7 @@ function eliminate(ast, memSafe) {
20062009
// examine body and note locals
20072010
var hasSwitch = false;
20082011
traverse(func, function(node, type) {
2009-
if (type === 'var') {
2012+
if (type == 'var') {
20102013
var node1 = node[1];
20112014
for (var i = 0; i < node1.length; i++) {
20122015
var node1i = node1[i];
@@ -2020,7 +2023,7 @@ function eliminate(ast, memSafe) {
20202023
if (!uses[name]) uses[name] = 0;
20212024
locals[name] = true;
20222025
}
2023-
} else if (type === 'name') {
2026+
} else if (type == 'name') {
20242027
var name = node[1];
20252028
if (!uses[name]) uses[name] = 0;
20262029
uses[name]++;
@@ -2477,7 +2480,7 @@ function eliminate(ast, memSafe) {
24772480
// clean up vars, and loop variable elimination
24782481
traverse(func, function(node, type) {
24792482
// pre
2480-
if (type === 'var') {
2483+
if (type == 'var') {
24812484
node[1] = node[1].filter(function(pair) { return !varsToRemove[pair[0]] });
24822485
if (node[1].length == 0) {
24832486
// wipe out an empty |var;|
@@ -2599,21 +2602,21 @@ function eliminate(ast, memSafe) {
25992602

26002603
this.run = function() {
26012604
traverse(this.node, function(node, type) {
2602-
if (type === 'binary' && node[1] == '+') {
2605+
if (type == 'binary' && node[1] == '+') {
26032606
var names = [];
26042607
var num = 0;
26052608
var has_num = false;
26062609
var fail = false;
26072610
traverse(node, function(subNode, subType) {
2608-
if (subType === 'binary') {
2611+
if (subType == 'binary') {
26092612
if (subNode[1] != '+') {
26102613
fail = true;
26112614
return false;
26122615
}
2613-
} else if (subType === 'name') {
2616+
} else if (subType == 'name') {
26142617
names.push(subNode[1]);
26152618
return;
2616-
} else if (subType === 'num') {
2619+
} else if (subType == 'num') {
26172620
num += subNode[1];
26182621
has_num = true;
26192622
return;

0 commit comments

Comments
 (0)