summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rwxr-xr-xlib/system/gc.nim13
-rwxr-xr-xlib/system/repr.nim2
-rw-r--r--tests/accept/compile/teval1.nim19
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, "##"
+
+