From 6dd2c2d7670b11aa2155f41e1309dad011456140 Mon Sep 17 00:00:00 2001 From: Araq Date: Sun, 4 Nov 2012 18:09:15 +0100 Subject: [PATCH] exception tracking should work --- compiler/docgen.nim | 18 ++++++++---- compiler/sempass2.nim | 57 +++++++++++++++++++++++++++++++------- compiler/semthreads.nim | 3 +- tests/reject/teffects1.nim | 20 +++++++++++++ tests/reject/teffects2.nim | 20 +++++++++++++ tests/run/tmultim4.nim | 4 ++- web/index.txt | 1 - 7 files changed, 105 insertions(+), 18 deletions(-) create mode 100644 tests/reject/teffects1.nim create mode 100644 tests/reject/teffects2.nim diff --git a/compiler/docgen.nim b/compiler/docgen.nim index 0fc5e03cf..8bbc53b74 100755 --- a/compiler/docgen.nim +++ b/compiler/docgen.nim @@ -14,7 +14,7 @@ import ast, strutils, strtabs, options, msgs, os, ropes, idents, wordrecg, syntaxes, renderer, lexer, rstast, rst, rstgen, times, highlite, - importer + importer, sempass2 type TSections = array[TSymKind, PRope] @@ -245,12 +245,20 @@ proc traceDeps(d: PDoc, n: PNode) = proc generateDoc*(d: PDoc, n: PNode) = case n.kind of nkCommentStmt: app(d.modDesc, genComment(d, n)) - of nkProcDef: genItem(d, n, n.sons[namePos], skProc) - of nkMethodDef: genItem(d, n, n.sons[namePos], skMethod) - of nkIteratorDef: genItem(d, n, n.sons[namePos], skIterator) + of nkProcDef: + when useEffectSystem: documentRaises(n) + genItem(d, n, n.sons[namePos], skProc) + of nkMethodDef: + when useEffectSystem: documentRaises(n) + genItem(d, n, n.sons[namePos], skMethod) + of nkIteratorDef: + when useEffectSystem: documentRaises(n) + genItem(d, n, n.sons[namePos], skIterator) of nkMacroDef: genItem(d, n, n.sons[namePos], skMacro) of nkTemplateDef: genItem(d, n, n.sons[namePos], skTemplate) - of nkConverterDef: genItem(d, n, n.sons[namePos], skConverter) + of nkConverterDef: + when useEffectSystem: documentRaises(n) + genItem(d, n, n.sons[namePos], skConverter) of nkTypeSection, nkVarSection, nkLetSection, nkConstSection: for i in countup(0, sonsLen(n) - 1): if n.sons[i].kind != nkCommentStmt: diff --git a/compiler/sempass2.nim b/compiler/sempass2.nim index 4199aa5f7..1811beb2d 100644 --- a/compiler/sempass2.nim +++ b/compiler/sempass2.nim @@ -9,7 +9,7 @@ import intsets, ast, astalgo, msgs, renderer, magicsys, types, idents, trees, - wordrecg + wordrecg, strutils # Second semantic checking pass over the AST. Necessary because the old # way had some inherent problems. Performs: @@ -158,7 +158,7 @@ proc trackPragmaStmt(tracked: PEffects, n: PNode) = # list the computed effects up to here: listEffects(tracked) -proc raisesSpec(n: PNode): PNode = +proc raisesSpec*(n: PNode): PNode = for i in countup(0, sonsLen(n) - 1): var it = n.sons[i] if it.kind == nkExprColonExpr and whichPragma(it) == wRaises: @@ -168,26 +168,62 @@ proc raisesSpec(n: PNode): PNode = result.add(it.sons[1]) return +proc documentRaises*(n: PNode) = + if n.sons[namePos].kind != nkSym: return + + var x = n.sons[pragmasPos] + let spec = raisesSpec(x) + if isNil(spec): + let s = n.sons[namePos].sym + + let actual = s.typ.n.sons[0] + if actual.len != effectListLen: return + let real = actual.sons[exceptionEffects] + + # warning: hack ahead: + var effects = newNodeI(nkBracket, n.info, real.len) + for i in 0 ..