Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
emscripten-core
GitHub Repository: emscripten-core/emscripten
Path: blob/main/src/runtime_safe_heap.js
4128 views
1
/**
2
* @license
3
* Copyright 2019 The Emscripten Authors
4
* SPDX-License-Identifier: MIT
5
*/
6
7
#if !SAFE_HEAP
8
#error "should only be inclded in SAFE_HEAP mode"
9
#endif
10
11
#if SAFE_HEAP_LOG
12
var SAFE_HEAP_COUNTER = 0;
13
#endif
14
15
function SAFE_HEAP_INDEX(arr, idx, action) {
16
#if CAN_ADDRESS_2GB
17
idx >>>= 0;
18
#endif
19
const bytes = arr.BYTES_PER_ELEMENT;
20
const dest = idx * bytes;
21
#if SAFE_HEAP_LOG
22
dbg(`SAFE_HEAP ${action}: ${[arr.constructor.name, idx, SAFE_HEAP_COUNTER++]}`);
23
#endif
24
if (idx <= 0) abort(`segmentation fault ${action} ${bytes} bytes at address ${dest}`);
25
#if EXIT_RUNTIME
26
if (runtimeInitialized && !runtimeExited) {
27
#else
28
if (runtimeInitialized) {
29
#endif
30
var brk = _sbrk(0);
31
if (dest + bytes > brk) abort(`segmentation fault, exceeded the top of the available dynamic heap when ${action} ${bytes} bytes at address ${dest}. DYNAMICTOP=${brk}`);
32
if (brk < _emscripten_stack_get_base()) abort(`brk >= _emscripten_stack_get_base() (brk=${brk}, _emscripten_stack_get_base()=${_emscripten_stack_get_base()})`); // sbrk-managed memory must be above the stack
33
if (brk > wasmMemory.buffer.byteLength) abort(`brk <= wasmMemory.buffer.byteLength (brk=${brk}, wasmMemory.buffer.byteLength=${wasmMemory.buffer.byteLength})`);
34
}
35
return idx;
36
}
37
38
function SAFE_HEAP_LOAD(arr, idx) {
39
return arr[SAFE_HEAP_INDEX(arr, idx, 'loading')];
40
}
41
42
function SAFE_HEAP_STORE(arr, idx, value) {
43
return arr[SAFE_HEAP_INDEX(arr, idx, 'storing')] = value;
44
}
45
46
function segfault() {
47
abort('segmentation fault');
48
}
49
function alignfault() {
50
#if SAFE_HEAP == 1
51
abort('alignment fault');
52
#else
53
warnOnce('alignment fault');
54
#endif
55
}
56
57