diff options
author | Araq <rumpf_a@web.de> | 2012-08-13 18:51:06 +0200 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2012-08-13 18:51:06 +0200 |
commit | 8805829d7ff2d3fc6c692cfa4931439d25d1bb6e (patch) | |
tree | 1137763811fa33f6b5a8eef963b61fabd561fb30 | |
parent | 244c14db0ba5c71a04be9486704994c774c5648b (diff) | |
download | Nim-8805829d7ff2d3fc6c692cfa4931439d25d1bb6e.tar.gz |
first steps for varargs support
-rwxr-xr-x | compiler/ast.nim | 2 | ||||
-rwxr-xr-x | compiler/semtypes.nim | 15 | ||||
-rwxr-xr-x | todo.txt | 2 |
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: |