summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2012-07-30 17:43:22 +0200
committerAraq <rumpf_a@web.de>2012-07-30 17:43:22 +0200
commitb0c11d3efbcfc3cd2e8d852ec196930ebace91ad (patch)
tree265254f7d8fcc5a9b2eceabe44ca64d3196f6a9f
parent735c0053750218524a08e645fe0c6d7743ba1818 (diff)
downloadNim-b0c11d3efbcfc3cd2e8d852ec196930ebace91ad.tar.gz
made compiler more robust for idetools support
-rwxr-xr-xcompiler/astalgo.nim11
-rwxr-xr-xcompiler/evals.nim68
-rwxr-xr-xcompiler/lookups.nim13
-rwxr-xr-xcompiler/main.nim3
-rwxr-xr-xcompiler/procfind.nim2
-rwxr-xr-xcompiler/ropes.nim4
-rwxr-xr-xcompiler/sem.nim10
-rwxr-xr-xcompiler/semtypes.nim1
-rwxr-xr-xcompiler/suggest.nim5
-rwxr-xr-xcompiler/trees.nim2
-rwxr-xr-xcompiler/types.nim28
11 files changed, 94 insertions, 53 deletions
diff --git a/compiler/astalgo.nim b/compiler/astalgo.nim
index 2e75c7787..1f0633a1c 100755
--- a/compiler/astalgo.nim
+++ b/compiler/astalgo.nim
@@ -208,9 +208,10 @@ proc getModule(s: PSym): PSym =
   
 proc getSymFromList(list: PNode, ident: PIdent, start: int = 0): PSym = 
   for i in countup(start, sonsLen(list) - 1): 
-    if list.sons[i].kind != nkSym: InternalError(list.info, "getSymFromList")
-    result = list.sons[i].sym
-    if result.name.id == ident.id: return 
+    if list.sons[i].kind == nkSym:
+      result = list.sons[i].sym
+      if result.name.id == ident.id: return 
+    else: InternalError(list.info, "getSymFromList")
   result = nil
 
 proc hashNode(p: PObject): THash = 
@@ -576,7 +577,9 @@ proc StrTableContains(t: TStrTable, n: PSym): bool =
 proc StrTableRawInsert(data: var TSymSeq, n: PSym) = 
   var h: THash = n.name.h and high(data)
   while data[h] != nil: 
-    if data[h] == n: InternalError(n.info, "StrTableRawInsert: " & n.name.s)
+    if data[h] == n: 
+      InternalError(n.info, "StrTableRawInsert: " & n.name.s)
+      return
     h = nextTry(h, high(data))
   assert(data[h] == nil)
   data[h] = n
diff --git a/compiler/evals.nim b/compiler/evals.nim
index 570e64dd3..8ccab9ff4 100755
--- a/compiler/evals.nim
+++ b/compiler/evals.nim
@@ -70,9 +70,9 @@ proc pushStackFrame*(c: PEvalContext, t: PStackFrame) {.inline.} =
   t.next = c.tos
   c.tos = t
 
-proc popStackFrame*(c: PEvalContext) {.inline.} = 
-  if c.tos == nil: InternalError("popStackFrame")
-  c.tos = c.tos.next
+proc popStackFrame*(c: PEvalContext) {.inline.} =
+  if c.tos != nil: c.tos = c.tos.next
+  else: InternalError("popStackFrame")
 
 proc evalMacroCall*(c: PEvalContext, n: PNode, sym: PSym): PNode
 proc evalAux(c: PEvalContext, n: PNode, flags: TEvalFlags): PNode
@@ -315,11 +315,13 @@ proc evalCall(c: PEvalContext, n: PNode): PNode =
   if isSpecial(result): return 
   prc = result
   # bind the actual params to the local parameter of a new binding
-  if prc.kind != nkSym: InternalError(n.info, "evalCall " & n.renderTree)
+  if prc.kind != nkSym: 
+    InternalError(n.info, "evalCall " & n.renderTree)
+    return
   d.prc = prc.sym
   if prc.sym.kind notin {skProc, skConverter, skMacro}:
     InternalError(n.info, "evalCall")
-  
+    return
   for i in countup(1, sonsLen(n) - 1): 
     result = evalAux(c, n.sons[i], {})
     if isSpecial(result): return 
@@ -551,13 +553,13 @@ proc evalOr(c: PEvalContext, n: PNode): PNode =
   result = evalAux(c, n.sons[1], {})
   if isSpecial(result): return 
   if result.kind != nkIntLit: InternalError(n.info, "evalOr")
-  if result.intVal == 0: result = evalAux(c, n.sons[2], {})
+  elif result.intVal == 0: result = evalAux(c, n.sons[2], {})
   
 proc evalAnd(c: PEvalContext, n: PNode): PNode = 
   result = evalAux(c, n.sons[1], {})
   if isSpecial(result): return 
   if result.kind != nkIntLit: InternalError(n.info, "evalAnd")
-  if result.intVal != 0: result = evalAux(c, n.sons[2], {})
+  elif result.intVal != 0: result = evalAux(c, n.sons[2], {})
   
 proc evalNew(c: PEvalContext, n: PNode): PNode = 
   #if c.mode == emOptimize: return raiseCannotEval(c, n.info)
@@ -720,7 +722,9 @@ proc evalSetLengthSeq(c: PEvalContext, n: PNode): PNode =
   result = evalAux(c, n.sons[2], {})
   if isSpecial(result): return 
   var b = result
-  if a.kind != nkBracket: InternalError(n.info, "evalSetLengthSeq")
+  if a.kind != nkBracket: 
+    InternalError(n.info, "evalSetLengthSeq")
+    return
   var newLen = int(getOrdValue(b))
   var oldLen = sonsLen(a)
   setlen(a.sons, newLen)
@@ -970,6 +974,7 @@ proc evalExpandToAst(c: PEvalContext, original: PNode): PNode =
   else:
     InternalError(macroCall.info,
       "ExpandToAst: expanded symbol is no macro or template")
+    result = emptyNode
 
 proc evalMagicOrCall(c: PEvalContext, n: PNode): PNode = 
   var m = getMagic(n)
@@ -1080,7 +1085,7 @@ proc evalMagicOrCall(c: PEvalContext, n: PNode): PNode =
     result = newNodeIT(nkIntLit, n.info, n.typ)
     case a.kind
     of nkCharLit..nkInt64Lit: result.intVal = a.intVal
-    else: InternalError(n.info, "no int value")
+    else: stackTrace(c, n, errFieldXNotFound, "intVal")
   of mNFloatVal: 
     result = evalAux(c, n.sons[1], {})
     if isSpecial(result): return 
@@ -1088,15 +1093,15 @@ proc evalMagicOrCall(c: PEvalContext, n: PNode): PNode =
     result = newNodeIT(nkFloatLit, n.info, n.typ)
     case a.kind
     of nkFloatLit..nkFloat64Lit: result.floatVal = a.floatVal
-    else: InternalError(n.info, "no float value")
+    else: stackTrace(c, n, errFieldXNotFound, "floatVal")
   of mNSymbol: 
     result = evalAux(c, n.sons[1], {efLValue})
     if isSpecial(result): return 
-    if result.kind != nkSym: InternalError(n.info, "no symbol")
+    if result.kind != nkSym: stackTrace(c, n, errFieldXNotFound, "symbol")
   of mNIdent: 
     result = evalAux(c, n.sons[1], {})
     if isSpecial(result): return 
-    if result.kind != nkIdent: InternalError(n.info, "no symbol")
+    if result.kind != nkIdent: stackTrace(c, n, errFieldXNotFound, "ident")
   of mNGetType: result = evalAux(c, n.sons[1], {})
   of mNStrVal: 
     result = evalAux(c, n.sons[1], {})
@@ -1105,14 +1110,18 @@ proc evalMagicOrCall(c: PEvalContext, n: PNode): PNode =
     result = newNodeIT(nkStrLit, n.info, n.typ)
     case a.kind
     of nkStrLit..nkTripleStrLit: result.strVal = a.strVal
-    else: InternalError(n.info, "no string value")
+    else: stackTrace(c, n, errFieldXNotFound, "strVal")
   of mNSetIntVal: 
     result = evalAux(c, n.sons[1], {efLValue})
     if isSpecial(result): return 
     var a = result
     result = evalAux(c, n.sons[2], {})
-    if isSpecial(result): return 
-    a.intVal = result.intVal  # XXX: exception handling?
+    if isSpecial(result): return
+    if a.kind in {nkCharLit..nkInt64Lit} and 
+        result.kind in {nkCharLit..nkInt64Lit}:
+      a.intVal = result.intVal
+    else: 
+      stackTrace(c, n, errFieldXNotFound, "intVal")
     result = emptyNode
   of mNSetFloatVal: 
     result = evalAux(c, n.sons[1], {efLValue})
@@ -1120,7 +1129,11 @@ proc evalMagicOrCall(c: PEvalContext, n: PNode): PNode =
     var a = result
     result = evalAux(c, n.sons[2], {})
     if isSpecial(result): return 
-    a.floatVal = result.floatVal # XXX: exception handling?
+    if a.kind in {nkFloatLit..nkFloat64Lit} and
+        result.kind in {nkFloatLit..nkFloat64Lit}:
+      a.floatVal = result.floatVal
+    else:
+      stackTrace(c, n, errFieldXNotFound, "floatVal")
     result = emptyNode
   of mNSetSymbol: 
     result = evalAux(c, n.sons[1], {efLValue})
@@ -1128,7 +1141,10 @@ proc evalMagicOrCall(c: PEvalContext, n: PNode): PNode =
     var a = result
     result = evalAux(c, n.sons[2], {efLValue})
     if isSpecial(result): return 
-    a.sym = result.sym        # XXX: exception handling?
+    if a.kind == nkSym and result.kind == nkSym:
+      a.sym = result.sym
+    else:
+      stackTrace(c, n, errFieldXNotFound, "symbol")
     result = emptyNode
   of mNSetIdent: 
     result = evalAux(c, n.sons[1], {efLValue})
@@ -1136,7 +1152,10 @@ proc evalMagicOrCall(c: PEvalContext, n: PNode): PNode =
     var a = result
     result = evalAux(c, n.sons[2], {efLValue})
     if isSpecial(result): return 
-    a.ident = result.ident    # XXX: exception handling?
+    if a.kind == nkIdent and result.kind == nkIdent:
+      a.ident = result.ident
+    else:
+      stackTrace(c, n, errFieldXNotFound, "ident")
     result = emptyNode
   of mNSetType: 
     result = evalAux(c, n.sons[1], {efLValue})
@@ -1146,13 +1165,17 @@ proc evalMagicOrCall(c: PEvalContext, n: PNode): PNode =
     if isSpecial(result): return 
     a.typ = result.typ        # XXX: exception handling?
     result = emptyNode
-  of mNSetStrVal: 
+  of mNSetStrVal:
     result = evalAux(c, n.sons[1], {efLValue})
     if isSpecial(result): return 
     var a = result
     result = evalAux(c, n.sons[2], {})
-    if isSpecial(result): return 
-    a.strVal = result.strVal  # XXX: exception handling?
+    if isSpecial(result): return
+    
+    if a.kind in {nkStrLit..nkTripleStrLit} and
+        result.kind in {nkStrLit..nkTripleStrLit}:
+      a.strVal = result.strVal
+    else: stackTrace(c, n, errFieldXNotFound, "strVal")
     result = emptyNode
   of mNNewNimNode: 
     result = evalAux(c, n.sons[1], {})
@@ -1177,7 +1200,8 @@ proc evalMagicOrCall(c: PEvalContext, n: PNode): PNode =
     result = evalAux(c, n.sons[1], {})
     if isSpecial(result): return 
     if not (result.kind in {nkStrLit..nkTripleStrLit}): 
-      InternalError(n.info, "no string node")
+      stackTrace(c, n, errFieldXNotFound, "strVal")
+      return
     var a = result
     result = newNodeIT(nkIdent, n.info, n.typ)
     result.ident = getIdent(a.strVal)
diff --git a/compiler/lookups.nim b/compiler/lookups.nim
index c67520997..dfabe5015 100755
--- a/compiler/lookups.nim
+++ b/compiler/lookups.nim
@@ -60,7 +60,9 @@ proc getSymRepr*(s: PSym): string =
   
 proc CloseScope*(tab: var TSymTab) = 
   # check if all symbols have been used and defined:
-  if tab.tos > len(tab.stack): InternalError("CloseScope")
+  if tab.tos > len(tab.stack): 
+    InternalError("CloseScope")
+    return
   var it: TTabIter
   var s = InitTabIter(it, tab.stack[tab.tos-1])
   var missingImpls = 0
@@ -95,8 +97,8 @@ proc addDeclAt*(c: PContext, sym: PSym, at: Natural) =
 proc AddInterfaceDeclAux(c: PContext, sym: PSym) = 
   if sfExported in sym.flags:
     # add to interface:
-    if c.module == nil: InternalError(sym.info, "AddInterfaceDeclAux")
-    StrTableAdd(c.module.tab, sym)
+    if c.module != nil: StrTableAdd(c.module.tab, sym)
+    else: InternalError(sym.info, "AddInterfaceDeclAux")
   #if getCurrOwner().kind == skModule: incl(sym.flags, sfGlobal)
 
 proc addInterfaceDeclAt*(c: PContext, sym: PSym, at: Natural) = 
@@ -106,6 +108,7 @@ proc addInterfaceDeclAt*(c: PContext, sym: PSym, at: Natural) =
 proc addOverloadableSymAt*(c: PContext, fn: PSym, at: Natural) = 
   if fn.kind notin OverloadableSyms: 
     InternalError(fn.info, "addOverloadableSymAt")
+    return
   var check = StrTableGet(c.tab.stack[at], fn.name)
   if check != nil and check.Kind notin OverloadableSyms: 
     LocalError(fn.info, errAttemptToRedefine, fn.Name.s)
@@ -138,7 +141,9 @@ proc lookUp*(c: PContext, n: PNode): PSym =
     if result == nil:
       LocalError(n.info, errUndeclaredIdentifier, ident.s)
       result = errorSym(n)
-  else: InternalError(n.info, "lookUp")
+  else:
+    InternalError(n.info, "lookUp")
+    return
   if Contains(c.AmbiguousSymbols, result.id): 
     LocalError(n.info, errUseQualifier, result.name.s)
   if result.kind == skStub: loadStub(result)
diff --git a/compiler/main.nim b/compiler/main.nim
index a9b00c4d2..03db3292c 100755
--- a/compiler/main.nim
+++ b/compiler/main.nim
@@ -78,7 +78,8 @@ proc CompileModule(filename: string, flags: TSymFlags): PSym =
     rd = handleSymbolFile(result, f)
     if result.id < 0: 
       InternalError("handleSymbolFile should have set the module\'s ID")
-  else: 
+      return
+  else:
     result.id = getID()
   processModule(result, f, nil, rd)
 
diff --git a/compiler/procfind.nim b/compiler/procfind.nim
index f385c2d94..f0a2d9f2e 100755
--- a/compiler/procfind.nim
+++ b/compiler/procfind.nim
@@ -30,8 +30,10 @@ proc equalGenericParams(procA, procB: PNode): bool =
   for i in countup(0, sonsLen(procA) - 1): 
     if procA.sons[i].kind != nkSym: 
       InternalError(procA.info, "equalGenericParams")
+      return
     if procB.sons[i].kind != nkSym: 
       InternalError(procB.info, "equalGenericParams")
+      return
     a = procA.sons[i].sym
     b = procB.sons[i].sym
     if (a.name.id != b.name.id) or not sameTypeOrNil(a.typ, b.typ): return 
diff --git a/compiler/ropes.nim b/compiler/ropes.nim
index ef1211b01..a96438d9c 100755
--- a/compiler/ropes.nim
+++ b/compiler/ropes.nim
@@ -237,7 +237,8 @@ proc ropef(frmt: TFormatStr, args: openarray[PRope]): PRope =
         num = j
         if j > high(args) + 1: 
           internalError("ropes: invalid format string $" & $(j))
-        app(result, args[j - 1])
+        else:
+          app(result, args[j - 1])
       of 'n':
         if optLineDir notin gOptions: app(result, tnl)
         inc i
@@ -263,6 +264,7 @@ proc auxRopeEqualsFile(r: PRope, bin: var tfile, buf: Pointer): bool =
   if r.data != nil:
     if r.length > bufSize: 
       internalError("ropes: token too long")
+      return
     var readBytes = readBuffer(bin, buf, r.length)
     result = readBytes == r.length and
         equalMem(buf, addr(r.data[0]), r.length) # BUGFIX
diff --git a/compiler/sem.nim b/compiler/sem.nim
index c1ea6d1af..0af9c4d99 100755
--- a/compiler/sem.nim
+++ b/compiler/sem.nim
@@ -152,7 +152,8 @@ proc addCodeForGenerics(c: PContext, n: PNode) =
     if prc.kind in {skProc, skMethod, skConverter} and prc.magic == mNone: 
       if prc.ast == nil or prc.ast.sons[bodyPos] == nil: 
         InternalError(prc.info, "no code for " & prc.name.s)
-      addSon(n, prc.ast)
+      else:
+        addSon(n, prc.ast)
   c.generics.lastGenericIdx = Len(c.generics.generics)
 
 proc semExprNoFlags(c: PContext, n: PNode): PNode {.procvar.} = 
@@ -160,7 +161,7 @@ proc semExprNoFlags(c: PContext, n: PNode): PNode {.procvar.} =
 
 proc myOpen(module: PSym, filename: string): PPassContext = 
   var c = newContext(module, filename)
-  if (c.p != nil): InternalError(module.info, "sem.myOpen")
+  if c.p != nil: InternalError(module.info, "sem.myOpen")
   c.semConstExpr = semConstExpr
   c.semExpr = semExprNoFlags
   c.semConstBoolExpr = semConstBoolExpr
@@ -224,9 +225,8 @@ proc myClose(context: PPassContext, n: PNode): PNode =
   var c = PContext(context)
   closeScope(c.tab)         # close module's scope
   rawCloseScope(c.tab)      # imported symbols; don't check for unused ones!
-  if n == nil: 
-    result = newNode(nkStmtList)
-  else:
+  result = newNode(nkStmtList)
+  if n != nil:
     InternalError(n.info, "n is not nil") #result := n;
   addCodeForGenerics(c, result)
   if c.module.ast != nil:
diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim
index e77bb9f86..3a3b0d722 100755
--- a/compiler/semtypes.nim
+++ b/compiler/semtypes.nim
@@ -368,6 +368,7 @@ proc semRecordCase(c: PContext, n: PNode, check: var TIntSet, pos: var int,
   semRecordNodeAux(c, n.sons[0], check, pos, a, rectype)
   if a.sons[0].kind != nkSym: 
     internalError("semRecordCase: dicriminant is no symbol")
+    return
   incl(a.sons[0].sym.flags, sfDiscriminant)
   var covered: biggestInt = 0
   var typ = skipTypes(a.sons[0].Typ, abstractVar)
diff --git a/compiler/suggest.nim b/compiler/suggest.nim
index e107730b8..ea7d17d16 100755
--- a/compiler/suggest.nim
+++ b/compiler/suggest.nim
@@ -56,8 +56,9 @@ template wholeSymTab(cond, section: expr) {.immediate.} =
 
 proc suggestSymList(list: PNode, outputs: var int) = 
   for i in countup(0, sonsLen(list) - 1): 
-    if list.sons[i].kind != nkSym: InternalError(list.info, "getSymFromList")
-    suggestField(list.sons[i].sym, outputs)
+    if list.sons[i].kind == nkSym:
+      suggestField(list.sons[i].sym, outputs)
+    #else: InternalError(list.info, "getSymFromList")
 
 proc suggestObject(n: PNode, outputs: var int) = 
   case n.kind
diff --git a/compiler/trees.nim b/compiler/trees.nim
index 57acfba8a..fb2e68548 100755
--- a/compiler/trees.nim
+++ b/compiler/trees.nim
@@ -88,7 +88,7 @@ proc getOpSym*(op: PNode): PSym =
     result = nil
   else: 
     if (sonsLen(op) <= 0): InternalError(op.info, "getOpSym")
-    if op.sons[0].Kind == nkSym: result = op.sons[0].sym
+    elif op.sons[0].Kind == nkSym: result = op.sons[0].sym
     else: result = nil
   
 proc getMagic*(op: PNode): TMagic = 
diff --git a/compiler/types.nim b/compiler/types.nim
index 02fcf5323..64525c73b 100755
--- a/compiler/types.nim
+++ b/compiler/types.nim
@@ -121,11 +121,13 @@ proc getProcHeader(sym: PSym): string =
   var n = sym.typ.n
   for i in countup(1, sonsLen(n) - 1): 
     var p = n.sons[i]
-    if p.kind != nkSym: InternalError("getProcHeader")
-    add(result, p.sym.name.s)
-    add(result, ": ")
-    add(result, typeToString(p.sym.typ))
-    if i != sonsLen(n)-1: add(result, ", ")
+    if p.kind == nkSym: 
+      add(result, p.sym.name.s)
+      add(result, ": ")
+      add(result, typeToString(p.sym.typ))
+      if i != sonsLen(n)-1: add(result, ", ")
+    else:
+      InternalError("getProcHeader")
   add(result, ')')
   if n.sons[0].typ != nil: result.add(": " & typeToString(n.sons[0].typ))
   
@@ -680,13 +682,13 @@ proc sameTuple(a, b: PType, c: var TSameTypeClosure): bool =
     if a.n != nil and b.n != nil and not c.ignoreTupleFields: 
       for i in countup(0, sonsLen(a.n) - 1): 
         # check field names: 
-        if a.n.sons[i].kind != nkSym: InternalError(a.n.info, "sameTuple")
-        if b.n.sons[i].kind != nkSym: InternalError(b.n.info, "sameTuple")
-        var x = a.n.sons[i].sym
-        var y = b.n.sons[i].sym
-        result = x.name.id == y.name.id
-        if not result: break 
-  else: 
+        if a.n.sons[i].kind == nkSym and b.n.sons[i].kind == nkSym:
+          var x = a.n.sons[i].sym
+          var y = b.n.sons[i].sym
+          result = x.name.id == y.name.id
+          if not result: break 
+        else: InternalError(a.n.info, "sameTuple")
+  else:
     result = false
 
 template IfFastObjectTypeCheckFailed(a, b: PType, body: stmt) =
@@ -1094,7 +1096,7 @@ proc getReturnType*(s: PSym): PType =
 
 proc getSize(typ: PType): biggestInt = 
   result = computeSize(typ)
-  if result < 0: InternalError("getSize(" & $typ.kind & ')')
+  if result < 0: InternalError("getSize: " & $typ.kind)
 
   
 proc containsGenericTypeIter(t: PType, closure: PObject): bool =