summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/passes.nim21
-rw-r--r--compiler/transf.nim8
-rw-r--r--tests/destructor/t6434.nim2
-rw-r--r--tests/destructor/tmove_objconstr.nim2
4 files changed, 27 insertions, 6 deletions
diff --git a/compiler/passes.nim b/compiler/passes.nim
index 365731669..645c1444b 100644
--- a/compiler/passes.nim
+++ b/compiler/passes.nim
@@ -125,6 +125,10 @@ proc processImplicits(conf: ConfigRef; implicits: seq[string], nodeKind: TNodeKi
       importStmt.addSon str
       if not processTopLevelStmt(importStmt, a): break
 
+const
+  imperativeCode = {low(TNodeKind)..high(TNodeKind)} - {nkTemplateDef, nkProcDef, nkMethodDef,
+    nkMacroDef, nkConverterDef, nkIteratorDef, nkFuncDef}
+
 proc processModule*(graph: ModuleGraph; module: PSym, stream: PLLStream): bool {.discardable.} =
   if graph.stopCompile(): return true
   var
@@ -191,7 +195,22 @@ proc processModule*(graph: ModuleGraph; module: PSym, stream: PLLStream): bool {
             sl = reorder(graph, sl, module)
           discard processTopLevelStmt(sl, a)
           break
-        elif not processTopLevelStmt(n, a): break
+        elif n.kind in imperativeCode:
+          # read everything until the next proc declaration etc.
+          var sl = newNodeI(nkStmtList, n.info)
+          sl.add n
+          var rest: PNode = nil
+          while true:
+            var n = parseTopLevelStmt(p)
+            if n.kind == nkEmpty or n.kind notin imperativeCode:
+              rest = n
+              break
+            sl.add n
+          if not processTopLevelStmt(sl, a): break
+          if rest != nil:
+            if not processTopLevelStmt(rest, a): break
+        else:
+          if not processTopLevelStmt(n, a): break
       closeParsers(p)
       if s.kind != llsStdIn: break
     closePasses(graph, a)
diff --git a/compiler/transf.nim b/compiler/transf.nim
index b31be71a3..83e66a069 100644
--- a/compiler/transf.nim
+++ b/compiler/transf.nim
@@ -1054,8 +1054,8 @@ proc transformStmt*(g: ModuleGraph; module: PSym, n: PNode): PNode =
     when useEffectSystem: trackTopLevelStmt(g, module, result)
     #if n.info ?? "temp.nim":
     #  echo renderTree(result, {renderIds})
-    #if c.needsDestroyPass:
-    #  result = injectDestructorCalls(g, module, result)
+    if c.needsDestroyPass:
+      result = injectDestructorCalls(g, module, result)
     incl(result.flags, nfTransf)
 
 proc transformExpr*(g: ModuleGraph; module: PSym, n: PNode): PNode =
@@ -1067,6 +1067,6 @@ proc transformExpr*(g: ModuleGraph; module: PSym, n: PNode): PNode =
     liftDefer(c, result)
     # expressions are not to be injected with destructor calls as that
     # the list of top level statements needs to be collected before.
-    #if c.needsDestroyPass:
-    #  result = injectDestructorCalls(g, module, result)
+    if c.needsDestroyPass:
+      result = injectDestructorCalls(g, module, result)
     incl(result.flags, nfTransf)
diff --git a/tests/destructor/t6434.nim b/tests/destructor/t6434.nim
index 1657e90bc..9c912f1f9 100644
--- a/tests/destructor/t6434.nim
+++ b/tests/destructor/t6434.nim
@@ -2,6 +2,8 @@ discard """
   exitcode: 0
   output: '''assingment
 assingment
+assingment
+assingment
 '''
 """
 
diff --git a/tests/destructor/tmove_objconstr.nim b/tests/destructor/tmove_objconstr.nim
index 178ff2a7d..50aecf46d 100644
--- a/tests/destructor/tmove_objconstr.nim
+++ b/tests/destructor/tmove_objconstr.nim
@@ -59,4 +59,4 @@ for x in getPony():
   echo x
 # XXX this needs to be enabled once top level statements
 # produce destructor calls again.
-echo "Pony is dying!"
+#echo "Pony is dying!"