summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2012-08-13 18:51:06 +0200
committerAraq <rumpf_a@web.de>2012-08-13 18:51:06 +0200
commit8805829d7ff2d3fc6c692cfa4931439d25d1bb6e (patch)
tree1137763811fa33f6b5a8eef963b61fabd561fb30
parent244c14db0ba5c71a04be9486704994c774c5648b (diff)
downloadNim-8805829d7ff2d3fc6c692cfa4931439d25d1bb6e.tar.gz
first steps for varargs support
-rwxr-xr-xcompiler/ast.nim2
-rwxr-xr-xcompiler/semtypes.nim15
-rwxr-xr-xtodo.txt2
3 files changed, 17 insertions, 2 deletions
diff --git a/compiler/ast.nim b/compiler/ast.nim
index d37fbe1f0..c150bec9f 100755
--- a/compiler/ast.nim
+++ b/compiler/ast.nim
@@ -421,7 +421,7 @@ type
     mSwap, mIsNil, mArrToSeq, mCopyStr, mCopyStrLast, 
     mNewString, mNewStringOfCap,
     mReset,
-    mArray, mOpenArray, mRange, mSet, mSeq, 
+    mArray, mOpenArray, mRange, mSet, mSeq, mVarargs,
     mOrdinal,
     mInt, mInt8, mInt16, mInt32, mInt64,
     mUInt, mUInt8, mUInt16, mUInt32, mUInt64,
diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim
index 1525f93af..35b841c71 100755
--- a/compiler/semtypes.nim
+++ b/compiler/semtypes.nim
@@ -106,6 +106,17 @@ proc semContainer(c: PContext, n: PNode, kind: TTypeKind, kindStr: string,
     LocalError(n.info, errXExpectsOneTypeParam, kindStr)
     addSonSkipIntLit(result, errorType(c))
 
+proc semVarargs(c: PContext, n: PNode, prev: PType): PType =
+  result = newOrPrevType(tyVarargs, prev, c)
+  if sonsLen(n) == 2 or sonsLen(n) == 3:
+    var base = semTypeNode(c, n.sons[1], nil)
+    addSonSkipIntLit(result, base)
+    if sonsLen(n) == 3:
+      result.n = newIdentNode(considerAcc(n.sons[2]), n.sons[2].info)
+  else:
+    LocalError(n.info, errXExpectsOneTypeParam, "varargs")
+    addSonSkipIntLit(result, errorType(c))
+  
 proc semAnyRef(c: PContext, n: PNode, kind: TTypeKind, prev: PType): PType = 
   if sonsLen(n) == 1:
     result = newOrPrevType(kind, prev, c)
@@ -823,6 +834,7 @@ proc semTypeNode(c: PContext, n: PNode, prev: PType): PType =
     of mSet: result = semSet(c, n, prev)
     of mOrdinal: result = semOrdinal(c, n, prev)
     of mSeq: result = semContainer(c, n, tySequence, "seq", prev)
+    of mVarargs: result = semVarargs(c, n, prev)
     else: result = semGeneric(c, n, s, prev)
   of nkIdent, nkDotExpr, nkAccQuoted: 
     var s = semTypeIdent(c, n)
@@ -916,7 +928,8 @@ proc processMagicType(c: PContext, m: PSym) =
   of mTypeDesc: setMagicType(m, tyTypeDesc, 0)
   of mVoidType: setMagicType(m, tyEmpty, 0)
   of mArray: setMagicType(m, tyArray, 0)
-  of mOpenArray: setMagicType(m, tyOpenArray, 0) 
+  of mOpenArray: setMagicType(m, tyOpenArray, 0)
+  of mVarargs: setMagicType(m, tyVarargs, 0)
   of mRange: setMagicType(m, tyRange, 0)
   of mSet: setMagicType(m, tySet, 0) 
   of mSeq: setMagicType(m, tySequence, 0)
diff --git a/todo.txt b/todo.txt
index 8515759ec..3bd3bfc74 100755
--- a/todo.txt
+++ b/todo.txt
@@ -5,6 +5,8 @@ version 0.9.0
 - implement for loop transformation for first class iterators
 
 - implicit deref for parameter matching; implement ``varargs[T, `$`]``
+- ``final`` should be the default for objects
+- ``bycopy`` pragma for imported C types
 - optimize genericAssign in the code generator
 - the lookup rules for generics really are too permissive
 - fix remaining closure bugs: