summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/ccgstmts.nim2
-rw-r--r--compiler/cgen.nim12
-rw-r--r--compiler/cgendata.nim4
-rw-r--r--compiler/seminst.nim7
4 files changed, 17 insertions, 8 deletions
diff --git a/compiler/ccgstmts.nim b/compiler/ccgstmts.nim
index 4d52e3aab..c3374a354 100644
--- a/compiler/ccgstmts.nim
+++ b/compiler/ccgstmts.nim
@@ -152,7 +152,7 @@ proc genSingleVar(p: BProc, a: PNode) =
   var immediateAsgn = a.sons[2].kind != nkEmpty
   if sfGlobal in v.flags:
     if v.owner.kind != skModule:
-      targetProc = p.module.preInitProc
+      targetProc = p.module.postInitProc
     assignGlobalVar(targetProc, v)
     # XXX: be careful here.
     # Global variables should not be zeromem-ed within loops 
diff --git a/compiler/cgen.nim b/compiler/cgen.nim
index b801add6c..787a2143f 100644
--- a/compiler/cgen.nim
+++ b/compiler/cgen.nim
@@ -1031,8 +1031,9 @@ proc genInitCode(m: BModule) =
   app(prc, initGCFrame(m.initProc))
  
   app(prc, genSectionStart(cpsLocals))
-  app(prc, m.initProc.s(cpsLocals))
   app(prc, m.preInitProc.s(cpsLocals))
+  app(prc, m.initProc.s(cpsLocals))
+  app(prc, m.postInitProc.s(cpsLocals))
   app(prc, genSectionEnd(cpsLocals))
 
   if optStackTrace in m.initProc.options and not m.FrameDeclared:
@@ -1048,11 +1049,13 @@ proc genInitCode(m: BModule) =
   app(prc, genSectionStart(cpsInit))
   app(prc, m.preInitProc.s(cpsInit))
   app(prc, m.initProc.s(cpsInit))
+  app(prc, m.postInitProc.s(cpsInit))
   app(prc, genSectionEnd(cpsInit))
 
   app(prc, genSectionStart(cpsStmts))
   app(prc, m.preInitProc.s(cpsStmts))
   app(prc, m.initProc.s(cpsStmts))
+  app(prc, m.postInitProc.s(cpsStmts))
   app(prc, genSectionEnd(cpsStmts))
   if optStackTrace in m.initProc.options and not m.PreventStackTrace:
     app(prc, deinitFrame(m.initProc))
@@ -1097,6 +1100,11 @@ proc newPreInitProc(m: BModule): BProc =
   # little hack so that unique temporaries are generated:
   result.labels = 100_000
 
+proc newPostInitProc(m: BModule): BProc =
+  result = newProc(nil, m)
+  # little hack so that unique temporaries are generated:
+  result.labels = 200_000
+
 proc rawNewModule(module: PSym, filename: string): BModule =
   new(result)
   InitLinkedList(result.headerFiles)
@@ -1111,6 +1119,7 @@ proc rawNewModule(module: PSym, filename: string): BModule =
   result.initProc = newProc(nil, result)
   result.initProc.options = gOptions
   result.preInitProc = newPreInitProc(result)
+  result.postInitProc = newPostInitProc(result)
   initNodeTable(result.dataCache)
   result.typeStack = @[]
   result.forwardedProcs = @[]
@@ -1131,6 +1140,7 @@ proc resetModule*(m: var BModule) =
   m.initProc = newProc(nil, m)
   m.initProc.options = gOptions
   m.preInitProc = newPreInitProc(m)
+  m.postInitProc = newPostInitProc(m)
   initNodeTable(m.dataCache)
   m.typeStack = @[]
   m.forwardedProcs = @[]
diff --git a/compiler/cgendata.nim b/compiler/cgendata.nim
index ad17194df..b5888d0f4 100644
--- a/compiler/cgendata.nim
+++ b/compiler/cgendata.nim
@@ -100,10 +100,8 @@ type
     headerFiles*: TLinkedList # needed headers to include
     typeInfoMarker*: TIntSet  # needed for generating type information
     initProc*: BProc          # code for init procedure
+    postInitProc*: BProc      # code to be executed after the init proc
     preInitProc*: BProc       # code executed before the init proc
-                              # used for initialization code for
-                              # .global. variables
-                              # (or instantiated generic variables)
     typeStack*: TTypeSeq      # used for type generation
     dataCache*: TNodeTable
     forwardedProcs*: TSymSeq  # keep forwarded procs here
diff --git a/compiler/seminst.nim b/compiler/seminst.nim
index 15be33261..47d889a60 100644
--- a/compiler/seminst.nim
+++ b/compiler/seminst.nim
@@ -233,11 +233,11 @@ proc generateInstance(c: PContext, fn: PSym, pt: TIdTable,
   # we set the friend module:
   var oldFriend = c.friendModule
   c.friendModule = getModule(fn)
+  #let oldScope = c.currentScope
+  #c.currentScope = fn.scope
   result = copySym(fn, false)
   incl(result.flags, sfFromGeneric)
-  # keep the owner if it's an inner proc (for proper closure transformations):
-  if fn.owner.kind == skModule:
-    result.owner = getCurrOwner().owner
+  result.owner = fn
   result.ast = n
   pushOwner(result)
   openScope(c)
@@ -267,6 +267,7 @@ proc generateInstance(c: PContext, fn: PSym, pt: TIdTable,
   popInfoContext()
   closeScope(c)           # close scope for parameters
   popOwner()
+  #c.currentScope = oldScope
   c.friendModule = oldFriend
   dec(c.InstCounter)
   if result.kind == skMethod: finishMethod(c, result)