Skip to content

Commit 72f5fb1

Browse files
authored
Remove undeeded buffer global (#18454)
If this is needed it can always be found via HEAPXX, or wasmMemory. Also, introduce a new debug helper called `missingGlobal` which allows use to remove builtin global symbols while notifying any folks that are depending on them.
1 parent 78f0715 commit 72f5fb1

20 files changed

+74
-60
lines changed

ChangeLog.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ See docs/process.md for more on how version tagging works.
2020

2121
3.1.30 (in development)
2222
-----------------------
23+
- The `buffer` JavaScript variable was removed. This underlying buffer is
24+
still accessible via `wasmMemory.buffer` or `HEAPXX.buffer`. In debug builds,
25+
a clear error is shown if you try to use it. (#18454)
2326
- The SDLv1 header directory is no longer added to the include path by default.
2427
This means if you include SDL headers without the explicit version in them
2528
(e.g. `SDL_events.h`) you will now need to add `-sUSE_SDL` explicitly at

src/embind/embind.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -906,7 +906,7 @@ var LibraryEmbind = {
906906
var heap = HEAPU32;
907907
var size = heap[handle]; // in elements
908908
var data = heap[handle + 1]; // byte offset into emscripten heap
909-
return new TA(buffer, data, size);
909+
return new TA(heap.buffer, data, size);
910910
}
911911

912912
name = readLatin1String(name);

src/growableHeap.js

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,50 +7,50 @@
77
// Support for growable heap + pthreads, where the buffer may change, so JS views
88
// must be updated.
99
function GROWABLE_HEAP_I8() {
10-
if (wasmMemory.buffer != buffer) {
11-
updateGlobalBufferAndViews(wasmMemory.buffer);
10+
if (wasmMemory.buffer != HEAP8.buffer) {
11+
updateMemoryViews();
1212
}
1313
return HEAP8;
1414
}
1515
function GROWABLE_HEAP_U8() {
16-
if (wasmMemory.buffer != buffer) {
17-
updateGlobalBufferAndViews(wasmMemory.buffer);
16+
if (wasmMemory.buffer != HEAP8.buffer) {
17+
updateMemoryViews();
1818
}
1919
return HEAPU8;
2020
}
2121
function GROWABLE_HEAP_I16() {
22-
if (wasmMemory.buffer != buffer) {
23-
updateGlobalBufferAndViews(wasmMemory.buffer);
22+
if (wasmMemory.buffer != HEAP8.buffer) {
23+
updateMemoryViews();
2424
}
2525
return HEAP16;
2626
}
2727
function GROWABLE_HEAP_U16() {
28-
if (wasmMemory.buffer != buffer) {
29-
updateGlobalBufferAndViews(wasmMemory.buffer);
28+
if (wasmMemory.buffer != HEAP8.buffer) {
29+
updateMemoryViews();
3030
}
3131
return HEAPU16;
3232
}
3333
function GROWABLE_HEAP_I32() {
34-
if (wasmMemory.buffer != buffer) {
35-
updateGlobalBufferAndViews(wasmMemory.buffer);
34+
if (wasmMemory.buffer != HEAP8.buffer) {
35+
updateMemoryViews();
3636
}
3737
return HEAP32;
3838
}
3939
function GROWABLE_HEAP_U32() {
40-
if (wasmMemory.buffer != buffer) {
41-
updateGlobalBufferAndViews(wasmMemory.buffer);
40+
if (wasmMemory.buffer != HEAP8.buffer) {
41+
updateMemoryViews();
4242
}
4343
return HEAPU32;
4444
}
4545
function GROWABLE_HEAP_F32() {
46-
if (wasmMemory.buffer != buffer) {
47-
updateGlobalBufferAndViews(wasmMemory.buffer);
46+
if (wasmMemory.buffer != HEAP8.buffer) {
47+
updateMemoryViews();
4848
}
4949
return HEAPF32;
5050
}
5151
function GROWABLE_HEAP_F64() {
52-
if (wasmMemory.buffer != buffer) {
53-
updateGlobalBufferAndViews(wasmMemory.buffer);
52+
if (wasmMemory.buffer != HEAP8.buffer) {
53+
updateMemoryViews();
5454
}
5555
return HEAPF64;
5656
}

src/library.js

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -172,22 +172,23 @@ mergeInto(LibraryManager.library, {
172172
// Grows the wasm memory to the given byte size, and updates the JS views to
173173
// it. Returns 1 on success, 0 on error.
174174
$emscripten_realloc_buffer: function(size) {
175+
var b = wasmMemory.buffer;
175176
#if MEMORYPROFILER
176-
var oldHeapSize = buffer.byteLength;
177+
var oldHeapSize = b.byteLength;
177178
#endif
178179
try {
179180
// round size grow request up to wasm page size (fixed 64KB per spec)
180-
wasmMemory.grow((size - buffer.byteLength + 65535) >>> 16); // .grow() takes a delta compared to the previous size
181-
updateGlobalBufferAndViews(wasmMemory.buffer);
181+
wasmMemory.grow((size - b.byteLength + 65535) >>> 16); // .grow() takes a delta compared to the previous size
182+
updateMemoryViews();
182183
#if MEMORYPROFILER
183184
if (typeof emscriptenMemoryProfiler != 'undefined') {
184-
emscriptenMemoryProfiler.onMemoryResize(oldHeapSize, buffer.byteLength);
185+
emscriptenMemoryProfiler.onMemoryResize(oldHeapSize, b.byteLength);
185186
}
186187
#endif
187188
return 1 /*success*/;
188189
} catch(e) {
189190
#if ASSERTIONS
190-
err('emscripten_realloc_buffer: Attempted to grow heap from ' + buffer.byteLength + ' bytes to ' + size + ' bytes, but got error: ' + e);
191+
err('emscripten_realloc_buffer: Attempted to grow heap from ' + b.byteLength + ' bytes to ' + size + ' bytes, but got error: ' + e);
191192
#endif
192193
}
193194
// implicit 0 return to save code size (caller will cast "undefined" into 0
@@ -324,7 +325,7 @@ mergeInto(LibraryManager.library, {
324325
#if ASSERTIONS
325326
assert(memoryIndex == 0);
326327
#endif
327-
updateGlobalBufferAndViews(wasmMemory.buffer);
328+
updateMemoryViews();
328329
},
329330

330331
system__deps: ['$setErrNo'],

src/library_memfs.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -341,9 +341,9 @@ mergeInto(LibraryManager.library, {
341341
var allocated;
342342
var contents = stream.node.contents;
343343
// Only make a new copy when MAP_PRIVATE is specified.
344-
if (!(flags & {{{ cDefine('MAP_PRIVATE') }}}) && contents.buffer === buffer) {
345-
// We can't emulate MAP_SHARED when the file is not backed by the buffer
346-
// we're mapping to (e.g. the HEAP buffer).
344+
if (!(flags & {{{ cDefine('MAP_PRIVATE') }}}) && contents.buffer === HEAP8.buffer) {
345+
// We can't emulate MAP_SHARED when the file is not backed by the
346+
// buffer we're mapping to (e.g. the HEAP buffer).
347347
allocated = false;
348348
ptr = contents.byteOffset;
349349
} else {

src/postamble_minimal.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ WebAssembly.instantiate(Module['wasm'], imports).then(function(output) {
206206
assert(wasmMemory);
207207
assert(wasmMemory.buffer.byteLength === {{{ INITIAL_MEMORY }}});
208208
#endif
209-
updateGlobalBufferAndViews(wasmMemory.buffer);
209+
updateMemoryViews();
210210
#endif
211211

212212
#if MEM_INIT_METHOD == 1 && !MEM_INIT_IN_WASM && !SINGLE_FILE

src/preamble.js

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,6 @@ function _free() {
107107
// Memory management
108108

109109
var HEAP,
110-
/** @type {!ArrayBuffer} */
111-
buffer,
112110
/** @type {!Int8Array} */
113111
HEAP8,
114112
/** @type {!Uint8Array} */
@@ -138,22 +136,22 @@ var HEAP,
138136
var HEAP_DATA_VIEW;
139137
#endif
140138

141-
function updateGlobalBufferAndViews(buf) {
142-
buffer = buf;
139+
function updateMemoryViews() {
140+
var b = wasmMemory.buffer;
143141
#if SUPPORT_BIG_ENDIAN
144-
Module['HEAP_DATA_VIEW'] = HEAP_DATA_VIEW = new DataView(buf);
145-
#endif
146-
Module['HEAP8'] = HEAP8 = new Int8Array(buf);
147-
Module['HEAP16'] = HEAP16 = new Int16Array(buf);
148-
Module['HEAP32'] = HEAP32 = new Int32Array(buf);
149-
Module['HEAPU8'] = HEAPU8 = new Uint8Array(buf);
150-
Module['HEAPU16'] = HEAPU16 = new Uint16Array(buf);
151-
Module['HEAPU32'] = HEAPU32 = new Uint32Array(buf);
152-
Module['HEAPF32'] = HEAPF32 = new Float32Array(buf);
153-
Module['HEAPF64'] = HEAPF64 = new Float64Array(buf);
142+
Module['HEAP_DATA_VIEW'] = HEAP_DATA_VIEW = new DataView(b);
143+
#endif
144+
Module['HEAP8'] = HEAP8 = new Int8Array(b);
145+
Module['HEAP16'] = HEAP16 = new Int16Array(b);
146+
Module['HEAP32'] = HEAP32 = new Int32Array(b);
147+
Module['HEAPU8'] = HEAPU8 = new Uint8Array(b);
148+
Module['HEAPU16'] = HEAPU16 = new Uint16Array(b);
149+
Module['HEAPU32'] = HEAPU32 = new Uint32Array(b);
150+
Module['HEAPF32'] = HEAPF32 = new Float32Array(b);
151+
Module['HEAPF64'] = HEAPF64 = new Float64Array(b);
154152
#if WASM_BIGINT
155-
Module['HEAP64'] = HEAP64 = new BigInt64Array(buf);
156-
Module['HEAPU64'] = HEAPU64 = new BigUint64Array(buf);
153+
Module['HEAP64'] = HEAP64 = new BigInt64Array(b);
154+
Module['HEAPU64'] = HEAPU64 = new BigUint64Array(b);
157155
#endif
158156
}
159157

@@ -882,7 +880,7 @@ function createWasm() {
882880
// TODO(sbc): Read INITIAL_MEMORY out of the wasm file in post-link mode.
883881
//assert(wasmMemory.buffer.byteLength === {{{ INITIAL_MEMORY }}});
884882
#endif
885-
updateGlobalBufferAndViews(wasmMemory.buffer);
883+
updateMemoryViews();
886884
#endif
887885
#if !MEM_INIT_IN_WASM
888886
runMemoryInitializer();

src/preamble_minimal.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,14 @@ var HEAP8, HEAP16, HEAP32, HEAPU8, HEAPU16, HEAPU32, HEAPF32, HEAPF64,
5454
#if SUPPORT_BIG_ENDIAN
5555
HEAP_DATA_VIEW,
5656
#endif
57-
wasmMemory, buffer, wasmTable;
57+
wasmMemory, wasmTable;
5858

5959

60-
function updateGlobalBufferAndViews(b) {
60+
function updateMemoryViews() {
61+
var b = wasmMemory.buffer;
6162
#if ASSERTIONS && SHARED_MEMORY
6263
assert(b instanceof SharedArrayBuffer, 'requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag');
6364
#endif
64-
buffer = b;
6565
#if SUPPORT_BIG_ENDIAN
6666
HEAP_DATA_VIEW = new DataView(b);
6767
#endif
@@ -105,7 +105,7 @@ else {
105105
#endif // MODULARIZE
106106
#endif // USE_PTHREADS
107107

108-
updateGlobalBufferAndViews(wasmMemory.buffer);
108+
updateMemoryViews();
109109
#endif // IMPORTED_MEMORY
110110

111111
#include "runtime_stack_check.js"

src/runtime_debug.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,18 @@ function isExportedByForceFilesystem(name) {
3838
name === 'removeRunDependency';
3939
}
4040

41+
function missingGlobal(sym, msg) {
42+
Object.defineProperty(globalThis, sym, {
43+
configurable: true,
44+
get: function() {
45+
warnOnce('`' + sym + '` is not longer defined by emscripten. ' + msg);
46+
return undefined;
47+
}
48+
});
49+
}
50+
51+
missingGlobal('buffer', 'Please use HEAP8.buffer or wasmMemory.buffer');
52+
4153
function missingLibrarySymbol(sym) {
4254
if (typeof globalThis !== 'undefined' && !Object.getOwnPropertyDescriptor(globalThis, sym)) {
4355
Object.defineProperty(globalThis, sym, {

src/runtime_init_memory.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,11 @@ if (ENVIRONMENT_IS_PTHREAD) {
5353
}
5454
#endif
5555

56-
updateGlobalBufferAndViews(wasmMemory.buffer);
56+
updateMemoryViews();
5757

5858
// If the user provides an incorrect length, just use that length instead rather than providing the user to
5959
// specifically provide the memory length with Module['INITIAL_MEMORY'].
60-
INITIAL_MEMORY = buffer.byteLength;
60+
INITIAL_MEMORY = wasmMemory.buffer.byteLength;
6161
#if ASSERTIONS
6262
assert(INITIAL_MEMORY % {{{ WASM_PAGE_SIZE }}} === 0);
6363
#endif

0 commit comments

Comments
 (0)