first steps for varargs support

This commit is contained in:
Araq
2012-08-13 18:51:06 +02:00
parent 244c14db0b
commit 8805829d7f
3 changed files with 17 additions and 2 deletions

View File

@@ -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,

View File

@@ -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)

View File

@@ -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: