diff options
author | Yuriy Glukhov <yglukhov@users.noreply.github.com> | 2018-10-17 01:46:13 +0300 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2018-10-17 00:46:13 +0200 |
commit | dc72cf7564a66236559e53f10f6acc153d15aa40 (patch) | |
tree | df15e7347145acd69668ffa580e8213ee4935de5 | |
parent | db95fad6fa03bcd734fc406a675ead3e07e64570 (diff) | |
download | Nim-dc72cf7564a66236559e53f10f6acc153d15aa40.tar.gz |
No setjump in GC for emscripten/wasm (#9386)
-rw-r--r-- | lib/system/gc_common.nim | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/lib/system/gc_common.nim b/lib/system/gc_common.nim index 88e150cd1..c9866164e 100644 --- a/lib/system/gc_common.nim +++ b/lib/system/gc_common.nim @@ -236,7 +236,7 @@ else: # ----------------- stack management -------------------------------------- # inspired from Smart Eiffel -when defined(emscripten): +when defined(emscripten) or defined(wasm): const stackIncreases = true elif defined(sparc): const stackIncreases = false @@ -332,21 +332,28 @@ elif stackIncreases: # --------------------------------------------------------------------------- # Generic code for architectures where addresses increase as the stack grows. # --------------------------------------------------------------------------- - var - jmpbufSize {.importc: "sizeof(jmp_buf)", nodecl.}: int - # a little hack to get the size of a JmpBuf in the generated C code - # in a platform independent way + when defined(emscripten) or defined(wasm): + var + jmpbufSize {.importc: "sizeof(jmp_buf)", nodecl.}: int + # a little hack to get the size of a JmpBuf in the generated C code + # in a platform independent way + + template forEachStackSlotAux(gch, gcMark: untyped) {.dirty.} = + for stack in gch.stack.items(): + var max = cast[ByteAddress](gch.stack.bottom) + var sp = cast[ByteAddress](addr(registers)) -% sizeof(pointer) + while sp >=% max: + gcMark(gch, cast[PPointer](sp)[]) + sp = sp -% sizeof(pointer) template forEachStackSlot(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(): - var max = cast[ByteAddress](gch.stack.bottom) - var sp = cast[ByteAddress](addr(registers)) -% sizeof(pointer) - while sp >=% max: - gcMark(gch, cast[PPointer](sp)[]) - sp = sp -% sizeof(pointer) + 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: # --------------------------------------------------------------------------- |