@@ -164,7 +164,8 @@ function astToSrc(ast, compress) {
164
164
function traverseChildren ( node , traverse , pre , post , stack ) {
165
165
for ( var i = 0 ; i < node . length ; i ++ ) {
166
166
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' ) {
168
169
var subresult = traverse ( subnode , pre , post , stack ) ;
169
170
if ( subresult == true ) return true ;
170
171
if ( subresult !== null && typeof subresult == 'object' ) node [ i ] = subresult ;
@@ -188,7 +189,9 @@ function traverseChildren(node, traverse, pre, post, stack) {
188
189
// was stopped, true. Otherwise undefined.
189
190
function traverse ( node , pre , post , stack ) {
190
191
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' ;
192
195
if ( relevant ) {
193
196
if ( stack ) len = stack . length ;
194
197
var result = pre ( node , type , stack ) ;
@@ -2006,7 +2009,7 @@ function eliminate(ast, memSafe) {
2006
2009
// examine body and note locals
2007
2010
var hasSwitch = false ;
2008
2011
traverse ( func , function ( node , type ) {
2009
- if ( type === 'var' ) {
2012
+ if ( type == 'var' ) {
2010
2013
var node1 = node [ 1 ] ;
2011
2014
for ( var i = 0 ; i < node1 . length ; i ++ ) {
2012
2015
var node1i = node1 [ i ] ;
@@ -2020,7 +2023,7 @@ function eliminate(ast, memSafe) {
2020
2023
if ( ! uses [ name ] ) uses [ name ] = 0 ;
2021
2024
locals [ name ] = true ;
2022
2025
}
2023
- } else if ( type === 'name' ) {
2026
+ } else if ( type == 'name' ) {
2024
2027
var name = node [ 1 ] ;
2025
2028
if ( ! uses [ name ] ) uses [ name ] = 0 ;
2026
2029
uses [ name ] ++ ;
@@ -2477,7 +2480,7 @@ function eliminate(ast, memSafe) {
2477
2480
// clean up vars, and loop variable elimination
2478
2481
traverse ( func , function ( node , type ) {
2479
2482
// pre
2480
- if ( type === 'var' ) {
2483
+ if ( type == 'var' ) {
2481
2484
node [ 1 ] = node [ 1 ] . filter ( function ( pair ) { return ! varsToRemove [ pair [ 0 ] ] } ) ;
2482
2485
if ( node [ 1 ] . length == 0 ) {
2483
2486
// wipe out an empty |var;|
@@ -2599,21 +2602,21 @@ function eliminate(ast, memSafe) {
2599
2602
2600
2603
this . run = function ( ) {
2601
2604
traverse ( this . node , function ( node , type ) {
2602
- if ( type === 'binary' && node [ 1 ] == '+' ) {
2605
+ if ( type == 'binary' && node [ 1 ] == '+' ) {
2603
2606
var names = [ ] ;
2604
2607
var num = 0 ;
2605
2608
var has_num = false ;
2606
2609
var fail = false ;
2607
2610
traverse ( node , function ( subNode , subType ) {
2608
- if ( subType === 'binary' ) {
2611
+ if ( subType == 'binary' ) {
2609
2612
if ( subNode [ 1 ] != '+' ) {
2610
2613
fail = true ;
2611
2614
return false ;
2612
2615
}
2613
- } else if ( subType === 'name' ) {
2616
+ } else if ( subType == 'name' ) {
2614
2617
names . push ( subNode [ 1 ] ) ;
2615
2618
return ;
2616
- } else if ( subType === 'num' ) {
2619
+ } else if ( subType == 'num' ) {
2617
2620
num += subNode [ 1 ] ;
2618
2621
has_num = true ;
2619
2622
return ;
0 commit comments