Skip to content

Commit a94f551

Browse files
committed
Add an optional handler for detecting memory.grow() use in the runtime
This handler can be used with an import for users not using ESM bindings to recreate views into memory only when necessary.
1 parent 1126ef1 commit a94f551

File tree

8 files changed

+4681
-1
lines changed

8 files changed

+4681
-1
lines changed

Diff for: std/assembly/rt/index.d.ts

+3
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ declare function __finalize(ptr: usize): void;
2929
declare const ASC_RTRACE: bool;
3030
declare const ASC_PROFILE: bool;
3131

32+
// Memory growth handling
33+
declare function ASC_RT_GROW_HANDLER(): void;
34+
3235
// Incremental GC constants
3336
declare const ASC_GC_GRANULARITY: i32;
3437
declare const ASC_GC_SWEEPFACTOR: i32;

Diff for: std/assembly/rt/stub.ts

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ function maybeGrowMemory(newOffset: usize): void {
1818
if (memory.grow(pagesWanted) < 0) {
1919
if (memory.grow(pagesNeeded) < 0) unreachable(); // out of memory
2020
}
21+
if (isDefined(ASC_RT_GROW_HANDLER)) ASC_RT_GROW_HANDLER();
2122
}
2223
offset = newOffset;
2324
}

Diff for: std/assembly/rt/tlsf.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,7 @@ function growMemory(root: Root, size: usize): void {
444444
if (memory.grow(pagesWanted) < 0) {
445445
if (memory.grow(pagesNeeded) < 0) unreachable();
446446
}
447+
if (isDefined(ASC_RT_GROW_HANDLER)) ASC_RT_GROW_HANDLER();
447448
let pagesAfter = memory.size();
448449
addMemory(root, <usize>pagesBefore << 16, <u64>pagesAfter << 16);
449450
}
@@ -468,7 +469,10 @@ function initialize(): void {
468469
let rootOffset = (__heap_base + AL_MASK) & ~AL_MASK;
469470
let pagesBefore = memory.size();
470471
let pagesNeeded = <i32>((((rootOffset + ROOT_SIZE) + 0xffff) & ~0xffff) >>> 16);
471-
if (pagesNeeded > pagesBefore && memory.grow(pagesNeeded - pagesBefore) < 0) unreachable();
472+
if (pagesNeeded > pagesBefore) {
473+
if (memory.grow(pagesNeeded - pagesBefore) < 0) unreachable();
474+
if (isDefined(ASC_RT_GROW_HANDLER)) ASC_RT_GROW_HANDLER();
475+
}
472476
let root = changetype<Root>(rootOffset);
473477
root.flMap = 0;
474478
SETTAIL(root, changetype<Block>(0));

0 commit comments

Comments
 (0)