Skip to content

Commit 7d487b7

Browse files
committed
Prefer for..of over forEach with lambdas. NFC
I imagine theses usages of `forEach` predated the use of `for..of` in our codes and the `for..in` loops were more clumsy. Using simple `for` loops here is generally faster at runtime and simpler to reason about.
1 parent a45c791 commit 7d487b7

23 files changed

+136
-141
lines changed

src/lib/libatomic.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -128,23 +128,23 @@ addToLibrary({
128128
emscripten_atomic_cancel_all_wait_asyncs__deps: ['$liveAtomicWaitAsyncs'],
129129
emscripten_atomic_cancel_all_wait_asyncs: () => {
130130
let waitAsyncs = Object.values(liveAtomicWaitAsyncs);
131-
waitAsyncs.forEach((address) => {
131+
for (var address of waitAsyncs) {
132132
Atomics.notify(HEAP32, {{{ getHeapOffset('address', 'i32') }}});
133-
});
133+
}
134134
liveAtomicWaitAsyncs = {};
135135
return waitAsyncs.length;
136136
},
137137

138138
emscripten_atomic_cancel_all_wait_asyncs_at_address__deps: ['$liveAtomicWaitAsyncs'],
139139
emscripten_atomic_cancel_all_wait_asyncs_at_address: (address) => {
140140
let numCancelled = 0;
141-
Object.keys(liveAtomicWaitAsyncs).forEach((waitToken) => {
142-
if (liveAtomicWaitAsyncs[waitToken] == address) {
141+
for (var [waitToken, waitAddress] of Object.entries(liveAtomicWaitAsyncs)) {
142+
if (waitAddress == address) {
143143
Atomics.notify(HEAP32, {{{ getHeapOffset('address', 'i32') }}});
144144
delete liveAtomicWaitAsyncs[waitToken];
145145
numCancelled++;
146146
}
147-
});
147+
}
148148
return numCancelled;
149149
},
150150

src/lib/libcore.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1714,18 +1714,18 @@ addToLibrary({
17141714
// If @elements is not provided, we default to the document and canvas
17151715
// elements, which handle common use cases.
17161716
// TODO(sbc): Remove seemingly unused elements argument
1717-
$autoResumeAudioContext__docs: '/** @param {Object=} elements */',
1717+
$autoResumeAudioContext__docs: '/** @param {Array<Object>=} elements */',
17181718
$autoResumeAudioContext: (ctx, elements) => {
17191719
if (!elements) {
17201720
elements = [document, document.getElementById('canvas')];
17211721
}
1722-
['keydown', 'mousedown', 'touchstart'].forEach((event) => {
1723-
elements.forEach((element) => {
1722+
for (var event of ['keydown', 'mousedown', 'touchstart']) {
1723+
for (var element of elements) {
17241724
element?.addEventListener(event, () => {
17251725
if (ctx.state === 'suspended') ctx.resume();
17261726
}, { 'once': true });
1727-
});
1728-
});
1727+
}
1728+
}
17291729
},
17301730

17311731
#if DYNCALLS || !WASM_BIGINT

src/lib/libdylink.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -978,7 +978,9 @@ var LibraryDylink = {
978978
.then(loadModule);
979979
}
980980

981-
metadata.neededDynlibs.forEach((needed) => loadDynamicLibrary(needed, flags, localScope));
981+
for (var needed of metadata.neededDynlibs) {
982+
loadDynamicLibrary(needed, flags, localScope)
983+
}
982984
return loadModule();
983985
},
984986

src/lib/libembind.js

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -897,20 +897,20 @@ var LibraryEmbind = {
897897
var rawDestructor = reg.rawDestructor;
898898

899899
whenDependentTypesAreResolved([rawTupleType], elementTypes, (elementTypes) => {
900-
elements.forEach((elt, i) => {
901-
var getterReturnType = elementTypes[i];
902-
var getter = elt.getter;
903-
var getterContext = elt.getterContext;
904-
var setterArgumentType = elementTypes[i + elementsLength];
905-
var setter = elt.setter;
906-
var setterContext = elt.setterContext;
900+
for (const [i, elt] of elements.entries()) {
901+
const getterReturnType = elementTypes[i];
902+
const getter = elt.getter;
903+
const getterContext = elt.getterContext;
904+
const setterArgumentType = elementTypes[i + elementsLength];
905+
const setter = elt.setter;
906+
const setterContext = elt.setterContext;
907907
elt.read = (ptr) => getterReturnType.fromWireType(getter(getterContext, ptr));
908908
elt.write = (ptr, o) => {
909909
var destructors = [];
910910
setter(setterContext, ptr, setterArgumentType.toWireType(destructors, o));
911911
runDestructors(destructors);
912912
};
913-
});
913+
}
914914

915915
return [{
916916
name: reg.name,
@@ -998,25 +998,23 @@ var LibraryEmbind = {
998998
concat(fieldRecords.map((field) => field.setterArgumentType));
999999
whenDependentTypesAreResolved([structType], fieldTypes, (fieldTypes) => {
10001000
var fields = {};
1001-
fieldRecords.forEach((field, i) => {
1002-
var fieldName = field.fieldName;
1003-
var getterReturnType = fieldTypes[i];
1004-
var optional = fieldTypes[i].optional;
1005-
var getter = field.getter;
1006-
var getterContext = field.getterContext;
1007-
var setterArgumentType = fieldTypes[i + fieldRecords.length];
1008-
var setter = field.setter;
1009-
var setterContext = field.setterContext;
1010-
fields[fieldName] = {
1001+
for (var [i, field] of fieldRecords.entries()) {
1002+
const getterReturnType = fieldTypes[i];
1003+
const getter = field.getter;
1004+
const getterContext = field.getterContext;
1005+
const setterArgumentType = fieldTypes[i + fieldRecords.length];
1006+
const setter = field.setter;
1007+
const setterContext = field.setterContext;
1008+
fields[field.fieldName] = {
10111009
read: (ptr) => getterReturnType.fromWireType(getter(getterContext, ptr)),
10121010
write: (ptr, o) => {
10131011
var destructors = [];
10141012
setter(setterContext, ptr, setterArgumentType.toWireType(destructors, o));
10151013
runDestructors(destructors);
10161014
},
1017-
optional,
1015+
optional: getterReturnType.optional,
10181016
};
1019-
});
1017+
}
10201018

10211019
return [{
10221020
name: reg.name,
@@ -2101,11 +2099,11 @@ var LibraryEmbind = {
21012099
var baseClassPrototype = baseClass.instancePrototype;
21022100
var baseConstructor = registeredClass.baseClass.constructor;
21032101
var ctor = createNamedFunction(constructorName, function(...args) {
2104-
registeredClass.baseClass.pureVirtualFunctions.forEach(function(name) {
2102+
for (var name of registeredClass.baseClass.pureVirtualFunctions) {
21052103
if (this[name] === baseClassPrototype[name]) {
21062104
throw new PureVirtualError(`Pure virtual function ${name} must be implemented in JavaScript`);
21072105
}
2108-
}.bind(this));
2106+
}
21092107

21102108
Object.defineProperty(this, '__parent', {
21112109
value: wrapperPrototype

src/lib/libembind_shared.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ var LibraryEmbindShared = {
7171
var typeConverters = new Array(dependentTypes.length);
7272
var unregisteredTypes = [];
7373
var registered = 0;
74-
dependentTypes.forEach((dt, i) => {
74+
for (let [i, dt] of dependentTypes.entries()) {
7575
if (registeredTypes.hasOwnProperty(dt)) {
7676
typeConverters[i] = registeredTypes[dt];
7777
} else {
@@ -87,7 +87,7 @@ var LibraryEmbindShared = {
8787
}
8888
});
8989
}
90-
});
90+
}
9191
if (0 === unregisteredTypes.length) {
9292
onComplete(typeConverters);
9393
}

src/lib/libfs.js

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -583,12 +583,13 @@ FS.staticInit();`;
583583
};
584584

585585
// sync all mounts
586-
mounts.forEach((mount) => {
587-
if (!mount.type.syncfs) {
588-
return done(null);
586+
for (var mount of mounts) {
587+
if (mount.type.syncfs) {
588+
mount.type.syncfs(mount, populate, done);
589+
} else {
590+
done(null);
589591
}
590-
mount.type.syncfs(mount, populate, done);
591-
});
592+
}
592593
},
593594
mount(type, opts, mountpoint) {
594595
#if ASSERTIONS
@@ -657,9 +658,7 @@ FS.staticInit();`;
657658
var mount = node.mounted;
658659
var mounts = FS.getMounts(mount);
659660

660-
Object.keys(FS.nameTable).forEach((hash) => {
661-
var current = FS.nameTable[hash];
662-
661+
for (var [hash, current] of Object.entries(FS.nameTable)) {
663662
while (current) {
664663
var next = current.name_next;
665664

@@ -669,7 +668,7 @@ FS.staticInit();`;
669668

670669
current = next;
671670
}
672-
});
671+
}
673672

674673
// no longer a mountpoint
675674
node.mounted = null;
@@ -1850,14 +1849,12 @@ FS.staticInit();`;
18501849
});
18511850
// override each stream op with one that tries to force load the lazy file first
18521851
var stream_ops = {};
1853-
var keys = Object.keys(node.stream_ops);
1854-
keys.forEach((key) => {
1855-
var fn = node.stream_ops[key];
1852+
for (const [key, fn] of Object.entries(node.stream_ops)) {
18561853
stream_ops[key] = (...args) => {
18571854
FS.forceLoadFile(node);
18581855
return fn(...args);
18591856
};
1860-
});
1857+
}
18611858
function writeChunks(stream, buffer, offset, length, position) {
18621859
var contents = stream.node.contents;
18631860
if (position >= contents.length)

src/lib/libglemu.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -626,10 +626,10 @@ var LibraryGLEmulation = {
626626
if (GL.debug) {
627627
dbg('[using program with shaders]');
628628
if (program) {
629-
GL.programShaders[program].forEach((shader) => {
629+
for (var shader of GL.programShaders[program]) {
630630
dbg(` shader ${shader}, original source: ${GL.shaderOriginalSources[shader]}`);
631631
dbg(` Source: ${GL.shaderSources[shader]}`);
632-
});
632+
}
633633
}
634634
}
635635
#endif

src/lib/libidbfs.js

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,9 @@ addToLibrary({
114114
});
115115
},
116116
quit: () => {
117-
Object.values(IDBFS.dbs).forEach((value) => value.close());
117+
for (var value of Object.values(IDBFS.dbs)) {
118+
value.close()
119+
}
118120
IDBFS.dbs = {};
119121
},
120122
getDB: (name, callback) => {
@@ -312,22 +314,21 @@ addToLibrary({
312314
var total = 0;
313315

314316
var create = [];
315-
Object.keys(src.entries).forEach((key) => {
316-
var e = src.entries[key];
317+
for (var [key, e] of Object.entries(src.entries)) {
317318
var e2 = dst.entries[key];
318319
if (!e2 || e['timestamp'].getTime() != e2['timestamp'].getTime()) {
319320
create.push(key);
320321
total++;
321322
}
322-
});
323+
}
323324

324325
var remove = [];
325-
Object.keys(dst.entries).forEach((key) => {
326+
for (var key of Object.keys(dst.entries)) {
326327
if (!src.entries[key]) {
327328
remove.push(key);
328329
total++;
329330
}
330-
});
331+
}
331332

332333
if (!total) {
333334
return callback(null);
@@ -359,7 +360,7 @@ addToLibrary({
359360

360361
// sort paths in ascending order so directory entries are created
361362
// before the files inside them
362-
create.sort().forEach((path) => {
363+
for (const path of create.sort()) {
363364
if (dst.type === 'local') {
364365
IDBFS.loadRemoteEntry(store, path, (err, entry) => {
365366
if (err) return done(err);
@@ -371,17 +372,17 @@ addToLibrary({
371372
IDBFS.storeRemoteEntry(store, path, entry, done);
372373
});
373374
}
374-
});
375+
}
375376

376377
// sort paths in descending order so files are deleted before their
377378
// parent directories
378-
remove.sort().reverse().forEach((path) => {
379+
for (var path of remove.sort().reverse()) {
379380
if (dst.type === 'local') {
380381
IDBFS.removeLocalEntry(path, done);
381382
} else {
382383
IDBFS.removeRemoteEntry(store, path, done);
383384
}
384-
});
385+
}
385386
}
386387
}
387388
});

src/lib/libwasi.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,9 @@ var WasiLibrary = {
119119
#if MAIN_READS_PARAMS
120120
{{{ makeSetValue('pargc', 0, 'mainArgs.length', SIZE_TYPE) }}};
121121
var bufSize = 0;
122-
mainArgs.forEach((arg) => bufSize += arg.length + 1);
122+
for (var arg of mainArgs) {
123+
bufSize += arg.length + 1;
124+
}
123125
{{{ makeSetValue('pargv_buf_size', 0, 'bufSize', SIZE_TYPE) }}};
124126
#else
125127
{{{ makeSetValue('pargc', 0, '0', SIZE_TYPE) }}};
@@ -132,12 +134,12 @@ var WasiLibrary = {
132134
args_get: (argv, argv_buf) => {
133135
#if MAIN_READS_PARAMS
134136
var bufSize = 0;
135-
mainArgs.forEach((arg, i) => {
137+
for (let [i, arg] of mainArgs.entries()) {
136138
var ptr = argv_buf + bufSize;
137139
{{{ makeSetValue('argv', `i*${POINTER_SIZE}`, 'ptr', '*') }}};
138140
stringToAscii(arg, ptr);
139141
bufSize += arg.length + 1;
140-
});
142+
}
141143
#endif
142144
return 0;
143145
},

src/lib/libwasmfs_node.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ addToLibrary({
7474
let path = UTF8ToString(path_p);
7575
return wasmfsTry(() => {
7676
let entries = fs.readdirSync(path, { withFileTypes: true });
77-
entries.forEach((entry) => {
77+
for (var entry of entries) {
7878
let sp = stackSave();
7979
let name = stringToUTF8OnStack(entry.name);
8080
let type;
@@ -90,7 +90,7 @@ addToLibrary({
9090
__wasmfs_node_record_dirent(vec, name, type);
9191
stackRestore(sp);
9292
// implicitly return 0
93-
});
93+
}
9494
});
9595
},
9696

0 commit comments

Comments
 (0)