Support for GC working in Emscripten environment
Support for GC working in Emscripten environment
This commit is contained in:
parent
6b645c50d5
commit
9cdfdde344
1 changed files with 7 additions and 5 deletions
|
|
@ -95,7 +95,9 @@ proc setupForeignThreadGc*() =
|
||||||
# ----------------- stack management --------------------------------------
|
# ----------------- stack management --------------------------------------
|
||||||
# inspired from Smart Eiffel
|
# inspired from Smart Eiffel
|
||||||
|
|
||||||
when defined(sparc):
|
when defined(emscripten):
|
||||||
|
const stackIncreases = true
|
||||||
|
elif defined(sparc):
|
||||||
const stackIncreases = false
|
const stackIncreases = false
|
||||||
elif defined(hppa) or defined(hp9000) or defined(hp9000s300) or
|
elif defined(hppa) or defined(hp9000) or defined(hp9000s300) or
|
||||||
defined(hp9000s700) or defined(hp9000s800) or defined(hp9000s820):
|
defined(hp9000s700) or defined(hp9000s800) or defined(hp9000s820):
|
||||||
|
|
@ -173,14 +175,14 @@ elif stackIncreases:
|
||||||
# in a platform independent way
|
# in a platform independent way
|
||||||
|
|
||||||
template forEachStackSlot(gch, gcMark: expr) {.immediate, dirty.} =
|
template forEachStackSlot(gch, gcMark: expr) {.immediate, dirty.} =
|
||||||
var registers: C_JmpBuf
|
var registers {.noinit.}: C_JmpBuf
|
||||||
if c_setjmp(registers) == 0'i32: # To fill the C stack with registers.
|
if c_setjmp(registers) == 0'i32: # To fill the C stack with registers.
|
||||||
var max = cast[TAddress](gch.stackBottom)
|
var max = cast[ByteAddress](gch.stackBottom)
|
||||||
var sp = cast[TAddress](addr(registers)) +% jmpbufSize -% sizeof(pointer)
|
var sp = cast[ByteAddress](addr(registers)) +% jmpbufSize -% sizeof(pointer)
|
||||||
# sp will traverse the JMP_BUF as well (jmp_buf size is added,
|
# sp will traverse the JMP_BUF as well (jmp_buf size is added,
|
||||||
# otherwise sp would be below the registers structure).
|
# otherwise sp would be below the registers structure).
|
||||||
while sp >=% max:
|
while sp >=% max:
|
||||||
gcMark(gch, cast[ppointer](sp)[])
|
gcMark(gch, cast[PPointer](sp)[])
|
||||||
sp = sp -% sizeof(pointer)
|
sp = sp -% sizeof(pointer)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue