No setjump in GC for emscripten/wasm (#9386)
This commit is contained in:
parent
db95fad6fa
commit
dc72cf7564
1 changed files with 21 additions and 14 deletions
|
|
@ -236,7 +236,7 @@ else:
|
||||||
# ----------------- stack management --------------------------------------
|
# ----------------- stack management --------------------------------------
|
||||||
# inspired from Smart Eiffel
|
# inspired from Smart Eiffel
|
||||||
|
|
||||||
when defined(emscripten):
|
when defined(emscripten) or defined(wasm):
|
||||||
const stackIncreases = true
|
const stackIncreases = true
|
||||||
elif defined(sparc):
|
elif defined(sparc):
|
||||||
const stackIncreases = false
|
const stackIncreases = false
|
||||||
|
|
@ -332,15 +332,13 @@ elif stackIncreases:
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
# Generic code for architectures where addresses increase as the stack grows.
|
# Generic code for architectures where addresses increase as the stack grows.
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
when defined(emscripten) or defined(wasm):
|
||||||
var
|
var
|
||||||
jmpbufSize {.importc: "sizeof(jmp_buf)", nodecl.}: int
|
jmpbufSize {.importc: "sizeof(jmp_buf)", nodecl.}: int
|
||||||
# a little hack to get the size of a JmpBuf in the generated C code
|
# a little hack to get the size of a JmpBuf in the generated C code
|
||||||
# in a platform independent way
|
# in a platform independent way
|
||||||
|
|
||||||
template forEachStackSlot(gch, gcMark: untyped) {.dirty.} =
|
template forEachStackSlotAux(gch, gcMark: untyped) {.dirty.} =
|
||||||
var registers {.noinit.}: C_JmpBuf
|
|
||||||
|
|
||||||
if c_setjmp(registers) == 0'i32: # To fill the C stack with registers.
|
|
||||||
for stack in gch.stack.items():
|
for stack in gch.stack.items():
|
||||||
var max = cast[ByteAddress](gch.stack.bottom)
|
var max = cast[ByteAddress](gch.stack.bottom)
|
||||||
var sp = cast[ByteAddress](addr(registers)) -% sizeof(pointer)
|
var sp = cast[ByteAddress](addr(registers)) -% sizeof(pointer)
|
||||||
|
|
@ -348,6 +346,15 @@ elif stackIncreases:
|
||||||
gcMark(gch, cast[PPointer](sp)[])
|
gcMark(gch, cast[PPointer](sp)[])
|
||||||
sp = sp -% sizeof(pointer)
|
sp = sp -% sizeof(pointer)
|
||||||
|
|
||||||
|
template forEachStackSlot(gch, gcMark: untyped) {.dirty.} =
|
||||||
|
when defined(emscripten) or defined(wasm):
|
||||||
|
var registers: cint
|
||||||
|
forEachStackSlotAux(gch, gcMark)
|
||||||
|
else:
|
||||||
|
var registers {.noinit.}: C_JmpBuf
|
||||||
|
if c_setjmp(registers) == 0'i32: # To fill the C stack with registers.
|
||||||
|
forEachStackSlotAux(gch, gcMark)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
# Generic code for architectures where addresses decrease as the stack grows.
|
# Generic code for architectures where addresses decrease as the stack grows.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue