summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rwxr-xr-xcompiler/ast.nim17
-rwxr-xr-xcompiler/astalgo.nim1
-rwxr-xr-xcompiler/semgnrc.nim3
-rwxr-xr-xtodo.txt4
4 files changed, 15 insertions, 10 deletions
diff --git a/compiler/ast.nim b/compiler/ast.nim
index 9eb2d21ac..46dc5e0de 100755
--- a/compiler/ast.nim
+++ b/compiler/ast.nim
@@ -877,8 +877,10 @@ proc len*(n: PType): int =
   else: result = len(n.sons)
   
 proc newSons(father: PType, length: int) = 
-  if isNil(father.sons): father.sons = @[]
-  setlen(father.sons, len(father.sons) + length)
+  if isNil(father.sons): 
+    newSeq(father.sons, length)
+  else:
+    setlen(father.sons, length)
 
 proc addSon(father, son: PType) = 
   if isNil(father.sons): father.sons = @[]
@@ -890,8 +892,10 @@ proc sonsLen(n: PNode): int =
   else: result = len(n.sons)
   
 proc newSons(father: PNode, length: int) = 
-  if isNil(father.sons): father.sons = @[]
-  setlen(father.sons, len(father.sons) + length)
+  if isNil(father.sons): 
+    newSeq(father.sons, length)
+  else:
+    setlen(father.sons, length)
 
 proc addSon(father, son: PNode) = 
   assert son != nil
@@ -937,7 +941,7 @@ proc shallowCopy*(src: PNode): PNode =
   of nkSym: result.sym = src.sym
   of nkIdent: result.ident = src.ident
   of nkStrLit..nkTripleStrLit: result.strVal = src.strVal
-  else: newSons(result, sonsLen(src))
+  else: newSeq(result.sons, sonsLen(src))
 
 proc copyTree(src: PNode): PNode = 
   # copy a whole syntax tree; performs deep copying
@@ -954,8 +958,7 @@ proc copyTree(src: PNode): PNode =
   of nkIdent: result.ident = src.ident
   of nkStrLit..nkTripleStrLit: result.strVal = src.strVal
   else: 
-    result.sons = nil
-    newSons(result, sonsLen(src))
+    newSeq(result.sons, sonsLen(src))
     for i in countup(0, sonsLen(src) - 1): 
       result.sons[i] = copyTree(src.sons[i])
   
diff --git a/compiler/astalgo.nim b/compiler/astalgo.nim
index 7303e3ff0..7128102a8 100755
--- a/compiler/astalgo.nim
+++ b/compiler/astalgo.nim
@@ -583,6 +583,7 @@ proc StrTableIncl*(t: var TStrTable, n: PSym): bool =
   # returns true if n is already in the string table:
   # It is essential that `n` is written nevertheless!
   # This way the newest redefinition is picked by the semantic analyses!
+  assert n.name != nil
   var h: THash = n.name.h and high(t.data)
   while true: 
     var it = t.data[h]
diff --git a/compiler/semgnrc.nim b/compiler/semgnrc.nim
index a2e64e785..fb98e870b 100755
--- a/compiler/semgnrc.nim
+++ b/compiler/semgnrc.nim
@@ -246,7 +246,8 @@ proc semGenericStmt(c: PContext, n: PNode,
   of nkProcDef, nkMethodDef, nkConverterDef, nkMacroDef, nkTemplateDef, 
      nkIteratorDef, nkLambda: 
     checkSonsLen(n, bodyPos + 1)
-    addPrelimDecl(c, newSymS(skUnknown, getIdentNode(n.sons[0]), c))
+    if n.kind != nkLambda:
+      addPrelimDecl(c, newSymS(skUnknown, getIdentNode(n.sons[0]), c))
     openScope(c.tab)
     n.sons[genericParamsPos] = semGenericStmt(c, n.sons[genericParamsPos], 
                                               flags, toBind)
diff --git a/todo.txt b/todo.txt
index 091426bc5..5a6990520 100755
--- a/todo.txt
+++ b/todo.txt
@@ -1,8 +1,7 @@
 version 0.8.14
 ==============
 
-- BUG: type TX = TTable[string, int]
-- BUG: temp2.nim triggers weird compiler bug
+- fix remaining generics bugs
 - fix line info in assertions
 - implicit invokation of `items`/`pairs` seems nice; ensure items(23) does
   not compile though
@@ -48,6 +47,7 @@ Bugs
 - bug: stress testing basic method example (eval example) 
   without ``-d:release`` leaks memory; good way to figure out how a 
   fixed amount of stack can hold an arbitrary number of GC roots!
+- BUG: temp2.nim triggers weird compiler and except.nim bug
 
 
 version 0.9.XX