@@ -266,7 +266,7 @@ function JSDCE(ast, aggressive) {
266
266
assert ( id . type === 'Identifier' ) ;
267
267
const curr = id . name ;
268
268
const value = node . init ;
269
- const keep = ! ( curr in names ) || ( value && hasSideEffects ( value ) ) ;
269
+ const keep = ! names . has ( curr ) || ( value && hasSideEffects ( value ) ) ;
270
270
if ( ! keep ) removedHere = 1 ;
271
271
return keep ;
272
272
} ) ;
@@ -282,7 +282,7 @@ function JSDCE(ast, aggressive) {
282
282
}
283
283
} ,
284
284
FunctionDeclaration ( node , _c ) {
285
- if ( Object . prototype . hasOwnProperty . call ( names , node . id . name ) ) {
285
+ if ( names . has ( node . id . name ) ) {
286
286
removed ++ ;
287
287
emptyOut ( node ) ;
288
288
return ;
@@ -329,7 +329,7 @@ function JSDCE(ast, aggressive) {
329
329
// we can ignore self-references, i.e., references to ourselves inside
330
330
// ourselves, for named defined (defun) functions
331
331
const ownName = defun ? node . id . name : '' ;
332
- const names = { } ;
332
+ const names = new Set ( ) ;
333
333
for ( const name in scopes . pop ( ) ) {
334
334
if ( name === ownName ) continue ;
335
335
const data = scope [ name ] ;
@@ -340,7 +340,7 @@ function JSDCE(ast, aggressive) {
340
340
}
341
341
if ( data . def && ! data . use && ! data . param ) {
342
342
// this is eliminateable!
343
- names [ name ] = 0 ;
343
+ names . add ( name ) ;
344
344
}
345
345
}
346
346
cleanUp ( node . body , names ) ;
@@ -427,12 +427,12 @@ function JSDCE(ast, aggressive) {
427
427
const scope = scopes . pop ( ) ;
428
428
assert ( scopes . length === 0 ) ;
429
429
430
- const names = { } ;
430
+ const names = new Set ( ) ;
431
431
for ( const [ name , data ] of Object . entries ( scope ) ) {
432
432
if ( data . def && ! data . use ) {
433
433
assert ( ! data . param ) ; // can't be
434
434
// this is eliminateable!
435
- names [ name ] = 0 ;
435
+ names . add ( name ) ;
436
436
}
437
437
}
438
438
cleanUp ( ast , names ) ;
@@ -641,7 +641,6 @@ function emitDCEGraph(ast) {
641
641
const nameToGraphName = { } ;
642
642
const modulePropertyToGraphName = { } ;
643
643
const exportNameToGraphName = { } ; // identical to wasmExports['..'] nameToGraphName
644
- const graph = [ ] ;
645
644
let foundWasmImportsAssign = false ;
646
645
let foundMinimalRuntimeExports = false ;
647
646
@@ -821,18 +820,18 @@ function emitDCEGraph(ast) {
821
820
const info = ( infos [ name ] = {
822
821
name : name ,
823
822
import : [ 'env' , nativeName ] ,
824
- reaches : { } ,
823
+ reaches : new Set ( ) ,
825
824
} ) ;
826
825
if ( nameToGraphName . hasOwnProperty ( jsName ) ) {
827
- info . reaches [ nameToGraphName [ jsName ] ] = 1 ;
826
+ info . reaches . add ( nameToGraphName [ jsName ] ) ;
828
827
} // otherwise, it's a number, ignore
829
828
}
830
829
for ( const [ e , _ ] of Object . entries ( exportNameToGraphName ) ) {
831
830
const name = exportNameToGraphName [ e ] ;
832
831
infos [ name ] = {
833
832
name : name ,
834
833
export : e ,
835
- reaches : { } ,
834
+ reaches : new Set ( ) ,
836
835
} ;
837
836
}
838
837
// a function that handles a node we visit, in either a defun or
@@ -867,7 +866,7 @@ function emitDCEGraph(ast) {
867
866
if ( reached ) {
868
867
function addReach ( reached ) {
869
868
if ( defunInfo ) {
870
- defunInfo . reaches [ reached ] = 1 ; // defun reaches it
869
+ defunInfo . reaches . add ( reached ) ; // defun reaches it
871
870
} else {
872
871
if ( infos [ reached ] ) {
873
872
infos [ reached ] . root = true ; // in global scope, root it
@@ -891,26 +890,19 @@ function emitDCEGraph(ast) {
891
890
const name = getGraphName ( defun . id . name , 'defun' ) ;
892
891
const info = ( infos [ name ] = {
893
892
name : name ,
894
- reaches : { } ,
893
+ reaches : new Set ( ) ,
895
894
} ) ;
896
895
fullWalk ( defun . body , ( node ) => visitNode ( node , info ) ) ;
897
896
} ) ;
898
897
fullWalk ( ast , ( node ) => visitNode ( node , null ) ) ;
899
898
// Final work: print out the graph
900
899
// sort for determinism
901
- function sortedNamesFromMap ( map ) {
902
- const names = [ ] ;
903
- for ( const name of Object . keys ( map ) ) {
904
- names . push ( name ) ;
905
- }
906
- names . sort ( ) ;
907
- return names ;
908
- }
909
- sortedNamesFromMap ( infos ) . forEach ( ( name ) => {
910
- const info = infos [ name ] ;
911
- info . reaches = sortedNamesFromMap ( info . reaches ) ;
912
- graph . push ( info ) ;
913
- } ) ;
900
+ const graph = Object . entries ( infos )
901
+ . sort ( ( [ name1 ] , [ name2 ] ) => ( name1 > name2 ? 1 : - 1 ) )
902
+ . map ( ( [ _name , info ] ) => ( {
903
+ ...info ,
904
+ reaches : Array . from ( info . reaches ) . sort ( ) ,
905
+ } ) ) ;
914
906
dump ( graph ) ;
915
907
}
916
908
0 commit comments