diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2018-09-23 13:41:33 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2018-09-24 16:00:57 +0200 |
commit | 3c461755e263ecaf7810bac25adb5d6d3f4d4a28 (patch) | |
tree | 10dcf419d38f1bc9eb91c01dd74f3863ccfe7492 | |
parent | c1aecb8914b7e14089a3ae817e57ed53bcbba8f2 (diff) | |
download | Nim-3c461755e263ecaf7810bac25adb5d6d3f4d4a28.tar.gz |
enable destructors for top level statements; needs to be documented
-rw-r--r-- | compiler/passes.nim | 21 | ||||
-rw-r--r-- | compiler/transf.nim | 8 | ||||
-rw-r--r-- | tests/destructor/t6434.nim | 2 | ||||
-rw-r--r-- | tests/destructor/tmove_objconstr.nim | 2 |
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!" |