summary refs log tree commit diff stats
path: root/compiler/ccgtrav.nim
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/ccgtrav.nim')
-rw-r--r--compiler/ccgtrav.nim21
1 files changed, 19 insertions, 2 deletions
diff --git a/compiler/ccgtrav.nim b/compiler/ccgtrav.nim
index 938330f1c..7a0b564a2 100644
--- a/compiler/ccgtrav.nim
+++ b/compiler/ccgtrav.nim
@@ -1,7 +1,7 @@
 #
 #
 #           The Nimrod Compiler
-#        (c) Copyright 2012 Andreas Rumpf
+#        (c) Copyright 2013 Andreas Rumpf
 #
 #    See the file "copying.txt", included in this
 #    distribution, for details about the copyright.
@@ -13,7 +13,7 @@
 # included from cgen.nim
 
 type
-  TTraversalClosure {.pure, final.} = object
+  TTraversalClosure = object
     p: BProc
     visitorFrmt: string
 
@@ -127,3 +127,20 @@ proc genTraverseProc(m: BModule, typ: PType, reason: TTypeInfoReason): PRope =
   m.s[cfsProcs].app(generatedProc)
 
 
+proc genTraverseProcForGlobal(m: BModule, s: PSym): PRope =
+  discard genTypeInfo(m, s.loc.t)
+  
+  var c: TTraversalClosure
+  var p = newProc(nil, m)
+  result = getGlobalTempName()
+  
+  c.visitorFrmt = "#nimGCvisit((void*)$1, 0);$n"
+  c.p = p
+  let header = ropef("N_NIMCALL(void, $1)()", result)
+  genTraverseProc(c, s.loc.r, s.loc.t)
+  
+  let generatedProc = ropef("$1 {$n$2$3$4}$n",
+        [header, p.s(cpsLocals), p.s(cpsInit), p.s(cpsStmts)])
+  
+  m.s[cfsProcHeaders].appf("$1;$n", header)
+  m.s[cfsProcs].app(generatedProc)