summary refs log tree commit diff stats
path: root/compiler
diff options
context:
space:
mode:
authorZahary Karadjov <zahary@gmail.com>2013-08-19 01:27:05 +0300
committerZahary Karadjov <zahary@gmail.com>2013-08-19 01:27:05 +0300
commit6ddd4e6a3f46f4fdcaec8ae0b08758858085ec26 (patch)
treee4bb51be6eba2e9433c4cee875882c41ddb0f3b3 /compiler
parentdfb5cb3c5d9c3981cd02d3fa27221e0b7f5af1e8 (diff)
downloadNim-6ddd4e6a3f46f4fdcaec8ae0b08758858085ec26.tar.gz
Revert "Revert "bugfix: emulated thread vars used in combination with the mark & sweep GC""
This reverts commit 75c586bbe1cc649b36fc00362ab40ebb1d163d9f.
Diffstat (limited to 'compiler')
-rw-r--r--compiler/ccgthreadvars.nim4
-rw-r--r--compiler/ccgtrav.nim8
-rw-r--r--compiler/cgen.nim3
3 files changed, 11 insertions, 4 deletions
diff --git a/compiler/ccgthreadvars.nim b/compiler/ccgthreadvars.nim
index 4785402e7..d312ea027 100644
--- a/compiler/ccgthreadvars.nim
+++ b/compiler/ccgthreadvars.nim
@@ -12,10 +12,10 @@
 
 # included from cgen.nim
 
-proc emulatedThreadVars(): bool {.inline.} =
+proc emulatedThreadVars(): bool =
   result = {optThreads, optTlsEmulation} <= gGlobalOptions
 
-proc AccessThreadLocalVar(p: BProc, s: PSym) =
+proc accessThreadLocalVar(p: BProc, s: PSym) =
   if emulatedThreadVars() and not p.ThreadVarAccessed:
     p.ThreadVarAccessed = true
     p.module.usesThreadVars = true
diff --git a/compiler/ccgtrav.nim b/compiler/ccgtrav.nim
index aa8b85600..9534eae91 100644
--- a/compiler/ccgtrav.nim
+++ b/compiler/ccgtrav.nim
@@ -127,18 +127,22 @@ proc genTraverseProc(m: BModule, typ: PType, reason: TTypeInfoReason): PRope =
   m.s[cfsProcHeaders].appf("$1;$n", header)
   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)
+  var sLoc = s.loc.r
   result = getGlobalTempName()
   
+  if sfThread in s.flags and emulatedThreadVars():
+    accessThreadLocalVar(p, s)
+    sLoc = con("NimTV->", sLoc)
+    
   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)
+  genTraverseProc(c, sLoc, s.loc.t)
   
   let generatedProc = ropef("$1 {$n$2$3$4}$n",
         [header, p.s(cpsLocals), p.s(cpsInit), p.s(cpsStmts)])
diff --git a/compiler/cgen.nim b/compiler/cgen.nim
index 18f33f32a..b801add6c 100644
--- a/compiler/cgen.nim
+++ b/compiler/cgen.nim
@@ -284,6 +284,9 @@ proc genLineDir(p: BProc, t: PNode) =
     linefmt(p, cpsStmts, "nimln($1, $2);$n",
             line.toRope, t.info.quotedFilename)
 
+proc accessThreadLocalVar(p: BProc, s: PSym)
+proc emulatedThreadVars(): bool {.inline.}
+
 include "ccgtypes.nim"
 
 # ------------------------------ Manager of temporaries ------------------