summary refs log tree commit diff stats
path: root/compiler
diff options
context:
space:
mode:
Diffstat (limited to 'compiler')
-rw-r--r--compiler/pragmas.nim4
-rw-r--r--compiler/renderer.nim16
-rw-r--r--compiler/sempass2.nim26
-rw-r--r--compiler/typesrenderer.nim11
4 files changed, 37 insertions, 20 deletions
diff --git a/compiler/pragmas.nim b/compiler/pragmas.nim
index 879950e79..8e639f083 100644
--- a/compiler/pragmas.nim
+++ b/compiler/pragmas.nim
@@ -357,11 +357,11 @@ proc processPush(c: PContext, n: PNode, start: int) =
   append(c.optionStack, x)
   for i in countup(start, sonsLen(n) - 1): 
     if processOption(c, n.sons[i]):
-      # simply store it somehwere:
+      # simply store it somewhere:
       if x.otherPragmas.isNil:
         x.otherPragmas = newNodeI(nkPragma, n.info)
       x.otherPragmas.add n.sons[i]
-    #LocalError(n.info, errOptionExpected)
+    #localError(n.info, errOptionExpected)
   
 proc processPop(c: PContext, n: PNode) = 
   if c.optionStack.counter <= 1: 
diff --git a/compiler/renderer.nim b/compiler/renderer.nim
index f25f3e7ee..2bbe8ac80 100644
--- a/compiler/renderer.nim
+++ b/compiler/renderer.nim
@@ -34,6 +34,7 @@ type
     comStack*: seq[PNode]  # comment stack
     flags*: TRenderFlags
     checkAnon: bool        # we're in a context that can contain sfAnon
+    inPragma: int
 
 
 proc renderModule*(n: PNode, filename: string, renderFlags: TRenderFlags = {})
@@ -1184,12 +1185,17 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) =
   of nkContinueStmt: 
     putWithSpace(g, tkContinue, "continue")
     gsub(g, n.sons[0])
-  of nkPragma: 
+  of nkPragma:
     if renderNoPragmas notin g.flags:
-      put(g, tkSpaces, Space)
-      put(g, tkCurlyDotLe, "{.")
-      gcomma(g, n, emptyContext)
-      put(g, tkCurlyDotRi, ".}")
+      if g.inPragma <= 0:
+        inc g.inPragma
+        put(g, tkSpaces, Space)
+        put(g, tkCurlyDotLe, "{.")
+        gcomma(g, n, emptyContext)
+        put(g, tkCurlyDotRi, ".}")
+        dec g.inPragma
+      else:
+        gcomma(g, n, emptyContext)
   of nkImportStmt, nkExportStmt:
     if n.kind == nkImportStmt:
       putWithSpace(g, tkImport, "import")
diff --git a/compiler/sempass2.nim b/compiler/sempass2.nim
index f41e169e3..4300aee20 100644
--- a/compiler/sempass2.nim
+++ b/compiler/sempass2.nim
@@ -370,7 +370,7 @@ proc trackPragmaStmt(tracked: PEffects, n: PNode) =
       # list the computed effects up to here:
       listEffects(tracked)
       
-proc effectSpec(n: PNode, effectType = wRaises): PNode =
+proc effectSpec(n: PNode, effectType: TSpecialWord): PNode =
   for i in countup(0, sonsLen(n) - 1):
     var it = n.sons[i]
     if it.kind == nkExprColonExpr and whichPragma(it) == effectType:
@@ -380,8 +380,7 @@ proc effectSpec(n: PNode, effectType = wRaises): PNode =
         result.add(it.sons[1])
       return
 
-proc documentEffect(n, x: PNode, effectType: TSpecialWord, idx: int) =
-  var x = x
+proc documentEffect(n, x: PNode, effectType: TSpecialWord, idx: int): PNode =
   let spec = effectSpec(x, effectType)
   if isNil(spec):
     let s = n.sons[namePos].sym
@@ -399,18 +398,20 @@ proc documentEffect(n, x: PNode, effectType: TSpecialWord, idx: int) =
       # set the type so that the following analysis doesn't screw up:
       effects.sons[i].typ = real[i].typ
 
-    var pair = newNode(nkExprColonExpr, n.info, @[
+    result = newNode(nkExprColonExpr, n.info, @[
       newIdentNode(getIdent(specialWords[effectType]), n.info), effects])
-    
-    if x.kind == nkEmpty:
-      x = newNodeI(nkPragma, n.info)
-      n.sons[pragmasPos] = x
-    x.add(pair)
 
 proc documentRaises*(n: PNode) =
   if n.sons[namePos].kind != nkSym: return
-  documentEffect(n, n.sons[pragmasPos], wRaises, exceptionEffects)
-  documentEffect(n, n.sons[pragmasPos], wTags, tagEffects)
+  let pragmas = n.sons[pragmasPos]
+  let p1 = documentEffect(n, pragmas, wRaises, exceptionEffects)
+  let p2 = documentEffect(n, pragmas, wTags, tagEffects)
+  
+  if p1 != nil or p2 != nil:
+    if pragmas.kind == nkEmpty:
+      n.sons[pragmasPos] = newNodeI(nkPragma, n.info)
+    if p1 != nil: n.sons[pragmasPos].add p1
+    if p2 != nil: n.sons[pragmasPos].add p2
 
 template notGcSafe(t): expr = {tfGcSafe, tfNoSideEffect} * t.flags == {}
 
@@ -621,7 +622,8 @@ proc track(tracked: PEffects, n: PNode) =
     useVar(tracked, n)
   of nkRaiseStmt:
     n.sons[0].info = n.info
-    throws(tracked.exc, n.sons[0])
+    #throws(tracked.exc, n.sons[0])
+    addEffect(tracked, n.sons[0], useLineInfo=false)
     for i in 0 .. <safeLen(n):
       track(tracked, n.sons[i])
   of nkCallKinds:
diff --git a/compiler/typesrenderer.nim b/compiler/typesrenderer.nim
index f3121a0b4..432a26666 100644
--- a/compiler/typesrenderer.nim
+++ b/compiler/typesrenderer.nim
@@ -1,3 +1,12 @@
+#
+#
+#           The Nim Compiler
+#        (c) Copyright 2014 Andreas Rumpf
+#
+#    See the file "copying.txt", included in this
+#    distribution, for details about the copyright.
+#
+
 import renderer, strutils, ast, msgs, types, astalgo
 
 const defaultParamSeparator* = ","
@@ -26,7 +35,7 @@ proc renderPlainSymbolName*(n: PNode): string =
     result = renderPlainSymbolName(n[<n.len])
   else:
     internalError(n.info, "renderPlainSymbolName() with " & $n.kind)
-  assert (not result.isNil)
+  assert(not result.isNil)
 
 proc renderType(n: PNode): string =
   ## Returns a string with the node type or the empty string.