diff options
Diffstat (limited to 'compiler/ccgtrav.nim')
-rw-r--r-- | compiler/ccgtrav.nim | 21 |
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) |