diff options
-rwxr-xr-x | lib/system/gc.nim | 13 | ||||
-rwxr-xr-x | lib/system/repr.nim | 2 | ||||
-rw-r--r-- | tests/accept/compile/teval1.nim | 19 |
3 files changed, 33 insertions, 1 deletions
diff --git a/lib/system/gc.nim b/lib/system/gc.nim index 1edc33375..7c70ccf85 100755 --- a/lib/system/gc.nim +++ b/lib/system/gc.nim @@ -626,10 +626,23 @@ else: # We use a jmp_buf buffer that is in the C stack. # Used to traverse the stack and registers assuming # that 'setjmp' will save registers in the C stack. + type PStackSlice = ptr array [0..7, pointer] var registers: C_JmpBuf if c_setjmp(registers) == 0'i32: # To fill the C stack with registers. var max = cast[TAddress](stackBottom) var sp = cast[TAddress](addr(registers)) + # loop unrolled: + while sp <% max - 8*sizeof(pointer): + gcMark(cast[PStackSlice](sp)[0]) + gcMark(cast[PStackSlice](sp)[1]) + gcMark(cast[PStackSlice](sp)[2]) + gcMark(cast[PStackSlice](sp)[3]) + gcMark(cast[PStackSlice](sp)[4]) + gcMark(cast[PStackSlice](sp)[5]) + gcMark(cast[PStackSlice](sp)[6]) + gcMark(cast[PStackSlice](sp)[7]) + sp = sp +% sizeof(pointer)*8 + # last few entries: while sp <=% max: gcMark(cast[ppointer](sp)[]) sp = sp +% sizeof(pointer) diff --git a/lib/system/repr.nim b/lib/system/repr.nim index 87588421f..9464ff3d8 100755 --- a/lib/system/repr.nim +++ b/lib/system/repr.nim @@ -111,7 +111,7 @@ type TReprClosure {.final.} = object # we cannot use a global variable here # as this wouldn't be thread-safe marked: TCellSet - recdepth: int # do not recurse endless + recdepth: int # do not recurse endlessly indent: int # indentation when not defined(useNimRtl): diff --git a/tests/accept/compile/teval1.nim b/tests/accept/compile/teval1.nim new file mode 100644 index 000000000..8172ebe28 --- /dev/null +++ b/tests/accept/compile/teval1.nim @@ -0,0 +1,19 @@ +import macros + +proc testProc: string {.compileTime.} = + result = "" + result = result & "" + +when true: + macro test(n: stmt): stmt = + result = newNimNode(nnkStmtList) + echo "#", testProc(), "#" + test: + "hi" + +const + x = testProc() + +echo "##", x, "##" + + |