Skip to content

Commit 635fdb1

Browse files
authored
Merge branch 'main' into bind_to
2 parents baa48c9 + 9e618aa commit 635fdb1

35 files changed

+273
-175
lines changed

emcc.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,15 @@ def get_clang_flags(user_args):
384384
if '-mbulk-memory' not in user_args:
385385
flags.append('-mbulk-memory')
386386

387+
# In emscripten we currently disable bulk memory by default.
388+
# This should be removed/updated when we als update the default browser targets.
389+
if '-mbulk-memory' not in user_args and '-mno-bulk-memory' not in user_args:
390+
# Bulk memory may be enabled via threads or directly via -s.
391+
if not settings.BULK_MEMORY:
392+
flags.append('-mno-bulk-memory')
393+
if '-mnontrapping-fptoint' not in user_args and '-mno-nontrapping-fptoint' not in user_args:
394+
flags.append('-mno-nontrapping-fptoint')
395+
387396
if settings.RELOCATABLE and '-fPIC' not in user_args:
388397
flags.append('-fPIC')
389398

src/embind/embind_gen.js

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,8 @@ var LibraryEmbind = {
172172
out.push(`export interface ${this.name}`);
173173
if (this.base) {
174174
out.push(` extends ${this.base.name}`);
175+
} else {
176+
out.push(' extends ClassHandle');
175177
}
176178
out.push(' {\n');
177179
for (const property of this.properties) {
@@ -186,7 +188,6 @@ var LibraryEmbind = {
186188
method.printFunction(nameMap, out);
187189
out.push(';\n');
188190
}
189-
out.push(' delete(): void;\n');
190191
out.push('}\n\n');
191192
}
192193

@@ -402,6 +403,24 @@ var LibraryEmbind = {
402403

403404
print() {
404405
const out = [];
406+
let hadClass = false;
407+
for (const def of this.definitions) {
408+
if (def instanceof ClassDefinition) {
409+
hadClass = true;
410+
break;
411+
}
412+
}
413+
if (hadClass) {
414+
out.push(
415+
'export interface ClassHandle {\n',
416+
' isAliasOf(other: ClassHandle): boolean;\n',
417+
' delete(): void;\n',
418+
' deleteLater(): this;\n',
419+
' isDeleted(): boolean;\n',
420+
' clone(): this;\n',
421+
'}\n',
422+
);
423+
}
405424
for (const def of this.definitions) {
406425
if (!def.print) {
407426
continue;

src/library_pthread.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ var LibraryPThread = {
168168
}
169169
PThread.unusedWorkers = [];
170170
PThread.runningWorkers = [];
171-
PThread.pthreads = [];
171+
PThread.pthreads = {};
172172
},
173173
returnWorkerToPool: (worker) => {
174174
// We don't want to run main thread queued calls here, since we are doing

src/library_webgpu.js

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -822,16 +822,20 @@ var LibraryWebGPU = {
822822
// wgpuDevice
823823

824824
wgpuDeviceEnumerateFeatures: (deviceId, featuresOutPtr) => {
825+
var offset = 0;
826+
var numFeatures = 0;
825827
var device = WebGPU.mgrDevice.get(deviceId);
826-
if (featuresOutPtr !== 0) {
827-
var offset = 0;
828-
device.features.forEach(feature => {
829-
var featureEnumValue = WebGPU.FeatureNameString2Enum[feature];
830-
{{{ makeSetValue('featuresOutPtr', 'offset', 'featureEnumValue', 'i32') }}};
831-
offset += 4;
832-
});
833-
}
834-
return device.features.size;
828+
device.features.forEach(feature => {
829+
var featureEnumValue = WebGPU.FeatureNameString2Enum[feature];
830+
if (featureEnumValue !== undefined) {
831+
if (featuresOutPtr !== 0) {
832+
{{{ makeSetValue('featuresOutPtr', 'offset', 'featureEnumValue', 'i32') }}};
833+
offset += 4;
834+
}
835+
numFeatures++;
836+
}
837+
});
838+
return numFeatures;
835839
},
836840

837841
wgpuDeviceDestroy: (deviceId) => WebGPU.mgrDevice.get(deviceId).destroy(),
@@ -2568,16 +2572,20 @@ var LibraryWebGPU = {
25682572
// WGPUAdapter
25692573

25702574
wgpuAdapterEnumerateFeatures: (adapterId, featuresOutPtr) => {
2575+
var offset = 0;
2576+
var numFeatures = 0;
25712577
var adapter = WebGPU.mgrAdapter.get(adapterId);
2572-
if (featuresOutPtr !== 0) {
2573-
var offset = 0;
2574-
adapter.features.forEach(feature => {
2575-
var featureEnumValue = WebGPU.FeatureNameString2Enum[feature];
2576-
{{{ makeSetValue('featuresOutPtr', 'offset', 'featureEnumValue', 'i32') }}};
2577-
offset += 4;
2578-
});
2579-
}
2580-
return adapter.features.size;
2578+
adapter.features.forEach(feature => {
2579+
var featureEnumValue = WebGPU.FeatureNameString2Enum[feature];
2580+
if (featureEnumValue !== undefined) {
2581+
if (featuresOutPtr !== 0) {
2582+
{{{ makeSetValue('featuresOutPtr', 'offset', 'featureEnumValue', 'i32') }}};
2583+
offset += 4;
2584+
}
2585+
numFeatures++;
2586+
}
2587+
});
2588+
return numFeatures;
25812589
},
25822590

25832591
wgpuAdapterGetInfo__deps: ['$stringToNewUTF8'],

src/memoryprofiler.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@ var emscriptenMemoryProfiler = {
503503
html += '<br />STACK memory area used now (should be zero): ' + self.formatBytes(stackBase - stackCurrent) + '.' + colorBar('#FFFF00') + ' STACK watermark highest seen usage (approximate lower-bound!): ' + self.formatBytes(stackBase - self.stackTopWatermark);
504504

505505
var heap_base = Module['___heap_base'];
506-
var heap_end = _sbrk();
506+
var heap_end = _sbrk({{{ to64('0') }}});
507507
html += "<br />DYNAMIC memory area size: " + self.formatBytes(heap_end - heap_base);
508508
html += ". start: " + toHex(heap_base, width);
509509
html += ". end: " + toHex(heap_end, width) + ".";
@@ -612,8 +612,8 @@ var emscriptenMemoryProfiler = {
612612
calls.sort((a,b) => b[sortIdx] - a[sortIdx]);
613613
}
614614
html += '<h4>Allocation sites with more than ' + self.formatBytes(self.trackedCallstackMinSizeBytes) + ' of accumulated allocations, or more than ' + self.trackedCallstackMinAllocCount + ' simultaneously outstanding allocations:</h4>'
615-
for (var i in calls) {
616-
html += "<b>" + self.formatBytes(calls[i][1]) + '/' + calls[i][0] + " allocs</b>: " + calls[i][2] + "<br />";
615+
for (var call of calls) {
616+
html += "<b>" + self.formatBytes(call[1]) + '/' + call[0] + " allocs</b>: " + call[2] + "<br />";
617617
}
618618
}
619619
}

src/runtime_init_memory.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ if (!ENVIRONMENT_IS_PTHREAD) {
4646
'shared': true,
4747
#endif
4848
#if MEMORY64 == 1
49+
'address': 'i64',
50+
// TODO(sbc): remove this alias for `address` once both firefox and
51+
// chrome roll out the spec change.
52+
// See https://github.com/WebAssembly/memory64/pull/92
4953
'index': 'i64',
5054
#endif
5155
});

src/runtime_shared.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ var toIndexType = (function() {
5555
var bigintMemoryBounds = 1;
5656
try {
5757
/** @suppress {checkTypes} */
58-
new WebAssembly.Memory({'initial': 1n, 'index': 'i64'});
58+
new WebAssembly.Memory({'initial': 1n, 'index': 'i64', 'address': 'i64'});
5959
} catch (e) {
6060
bigintMemoryBounds = 0;
6161
}

src/threadprofiler.js

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,23 @@ var emscriptenThreadProfiler = {
1515

1616
// Installs startup hook and periodic UI update timer.
1717
initialize() {
18-
this.threadProfilerDiv = document.getElementById('threadprofiler');
19-
if (!this.threadProfilerDiv) {
18+
var self = emscriptenThreadProfiler;
19+
self.threadProfilerDiv = document.getElementById('threadprofiler');
20+
if (!self.threadProfilerDiv) {
2021
var div = document.createElement("div");
2122
div.innerHTML = "<div id='threadprofiler' style='margin: 20px; border: solid 1px black;'></div>";
2223
document.body.appendChild(div);
23-
this.threadProfilerDiv = document.getElementById('threadprofiler');
24+
self.threadProfilerDiv = document.getElementById('threadprofiler');
2425
}
25-
var i = setInterval(function() { emscriptenThreadProfiler.updateUi() }, this.uiUpdateIntervalMsecs);
26+
var i = setInterval(() => self.updateUi(), self.uiUpdateIntervalMsecs);
2627
addOnExit(() => clearInterval(i));
2728
},
2829

2930
initializeNode() {
3031
addOnInit(() => {
31-
emscriptenThreadProfiler.dumpState();
32-
var i = setInterval(function() { emscriptenThreadProfiler.dumpState() }, this.uiUpdateIntervalMsecs);
32+
var self = emscriptenThreadProfiler;
33+
self.dumpState();
34+
var i = setInterval(() => self.dumpState(), self.uiUpdateIntervalMsecs);
3335
addOnExit(() => clearInterval(i));
3436
});
3537
},
@@ -38,11 +40,10 @@ var emscriptenThreadProfiler = {
3840
var mainThread = _emscripten_main_runtime_thread_id();
3941

4042
var threads = [mainThread];
41-
for (var i in PThread.pthreads) {
42-
threads.push(PThread.pthreads[i].pthread_ptr);
43+
for (var thread of Object.values(PThread.pthreads)) {
44+
threads.push(thread.pthread_ptr);
4345
}
44-
for (var i = 0; i < threads.length; ++i) {
45-
var threadPtr = threads[i];
46+
for (var threadPtr of threads) {
4647
var threadName = PThread.getThreadName(threadPtr);
4748
if (threadName) {
4849
threadName = `"${threadName}" (${ptrToString(threadPtr)})`;
@@ -60,16 +61,18 @@ var emscriptenThreadProfiler = {
6061
// initialized yet, ignore updating.
6162
return;
6263
}
64+
if (!runtimeInitialized) {
65+
return;
66+
}
6367
var str = '';
6468
var mainThread = _emscripten_main_runtime_thread_id();
6569

6670
var threads = [mainThread];
67-
for (var i in PThread.pthreads) {
68-
threads.push(PThread.pthreads[i].pthread_ptr);
71+
for (var thread of Object.values(PThread.pthreads)) {
72+
threads.push(thread.pthread_ptr);
6973
}
7074

71-
for (var i = 0; i < threads.length; ++i) {
72-
var threadPtr = threads[i];
75+
for (var threadPtr of threads) {
7376
var profilerBlock = Atomics.load({{{ getHeapForType('*') }}}, {{{ getHeapOffset('threadPtr + ' + C_STRUCTS.pthread.profilerBlock, '*') }}});
7477
#if MEMORY64
7578
profilerBlock = Number(profilerBlock);
@@ -100,7 +103,7 @@ var emscriptenThreadProfiler = {
100103
if (recent.length > 0) str += `Recent activity: ${recent}`;
101104
str += '<br />';
102105
}
103-
this.threadProfilerDiv.innerHTML = str;
106+
emscriptenThreadProfiler.threadProfilerDiv.innerHTML = str;
104107
}
105108
};
106109

system/lib/libc/emscripten_memcpy.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ static void *__memcpy(void *dest, const void *src, size_t n) {
2222
#elif defined(__wasm_bulk_memory__)
2323

2424
static void *__memcpy(void *restrict dest, const void *restrict src, size_t n) {
25-
return _emscripten_memcpy_bulkmem(dest, src, n);
25+
return n ? _emscripten_memcpy_bulkmem(dest, src, n) : dest;
2626
}
2727

2828
#else

test/atomic/test_wait_async.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,12 @@ void asyncWaitFinishedShouldBeOk(int32_t* ptr,
7373
assert(numCalled == 2);
7474
assert(waitResult == ATOMICS_WAIT_OK);
7575
emscripten_out("test finished");
76-
#ifdef REPORT_RESULT
77-
REPORT_RESULT(0);
78-
#endif
79-
#if !defined(__EMSCRIPTEN_WASM_WORKERS__)
76+
#ifdef __EMSCRIPTEN_WASM_WORKERS__
77+
emscripten_terminate_all_wasm_workers();
78+
#else
8079
pthread_join(t, NULL);
8180
#endif
81+
emscripten_force_exit(0);
8282
}
8383

8484
int main() {

0 commit comments

Comments
 (0)