summary refs log tree commit diff stats
path: root/compiler/cgen.nim
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/cgen.nim')
-rw-r--r--compiler/cgen.nim49
1 files changed, 31 insertions, 18 deletions
diff --git a/compiler/cgen.nim b/compiler/cgen.nim
index 753576aa0..f034f6675 100644
--- a/compiler/cgen.nim
+++ b/compiler/cgen.nim
@@ -552,9 +552,21 @@ proc genVarPrototype(m: BModule, sym: PSym)
 proc requestConstImpl(p: BProc, sym: PSym)
 proc genProc(m: BModule, prc: PSym)
 proc genStmts(p: BProc, t: PNode)
+proc expr(p: BProc, n: PNode, d: var TLoc)
 proc genProcPrototype(m: BModule, sym: PSym)
+proc putLocIntoDest(p: BProc, d: var TLoc, s: TLoc)
+proc genAssignment(p: BProc, dest, src: TLoc, flags: TAssignmentFlags)
+proc intLiteral(i: biggestInt): PRope
+proc genLiteral(p: BProc, n: PNode): PRope
 
-include "ccgexprs.nim", "ccgstmts.nim"
+proc initLocExpr(p: BProc, e: PNode, result: var TLoc) =
+  initLoc(result, locNone, e.typ, OnUnknown)
+  expr(p, e, result)
+
+proc lenField: PRope {.inline.} =
+  result = toRope(if gCmd != cmdCompileToCpp: "Sup.len" else: "len")
+
+include ccgcalls, "ccgstmts.nim", "ccgexprs.nim"
 
 # ----------------------------- dynamic library handling -----------------
 # We don't finalize dynamic libs as this does the OS for us.
@@ -588,6 +600,7 @@ proc loadDynamicLib(m: BModule, lib: PLib) =
             [loadlib, getStrLit(m, lib.path.strVal)]) 
     else:
       var p = newProc(nil, m)
+      p.options = p.options - {optStackTrace, optEndb}
       var dest: TLoc
       initLocExpr(p, lib.path, dest)
       app(m.s[cfsVars], p.s(cpsLocals))
@@ -1266,10 +1279,6 @@ proc updateCachedModule(m: BModule) =
 
   addFileToLink(cfilenoext)
 
-proc updateCachedModules* =
-  for m in cgenModules():
-    if m.fromCache: m.updateCachedModule
-
 proc myClose(b: PPassContext, n: PNode): PNode = 
   result = n
   if b == nil or passes.skipCodegen(n): return 
@@ -1279,24 +1288,28 @@ proc myClose(b: PPassContext, n: PNode): PNode =
     genStmts(m.initProc, n)
   # cached modules need to registered too: 
   registerModuleToMain(m.module)
-  
+
   if sfMainModule in m.module.flags: 
     var disp = generateMethodDispatchers()
     for i in 0..sonsLen(disp)-1: genProcAux(m, disp.sons[i].sym)
-    genMainProc(m) 
-    # we need to process the transitive closure because recursive module
-    # deps are allowed (and the system module is processed in the wrong
-    # order anyway)
-    if generatedHeader != nil: finishModule(generatedHeader)
-    while gForwardedProcsCounter > 0:
-      for m in cgenModules():
-        if not m.fromCache:
-          finishModule(m)
+    genMainProc(m)
+
+proc cgenWriteModules* =
+  # we need to process the transitive closure because recursive module
+  # deps are allowed (and the system module is processed in the wrong
+  # order anyway)
+  if generatedHeader != nil: finishModule(generatedHeader)
+  while gForwardedProcsCounter > 0:
     for m in cgenModules():
       if not m.fromCache:
-        writeModule(m, pending=true)
-    writeMapping(gMapping)
-    if generatedHeader != nil: writeHeader(generatedHeader)
+        finishModule(m)
+  for m in cgenModules():
+    if m.fromCache:
+      m.updateCachedModule
+    else:
+      m.writeModule(pending=true)
+  writeMapping(gMapping)
+  if generatedHeader != nil: writeHeader(generatedHeader)
 
 const cgenPass* = makePass(myOpen, myOpenCached, myProcess, myClose)