diff options
author | Zahary Karadjov <zahary@gmail.com> | 2012-06-10 23:33:05 +0300 |
---|---|---|
committer | Zahary Karadjov <zahary@gmail.com> | 2012-06-11 21:38:01 +0300 |
commit | e2d38a57ecdc3aa7b5cd81a9f2f588eb0dc5586f (patch) | |
tree | 396ef1c332c4ec460cd91ec0358a9ec02f76052c /compiler | |
parent | ce933c90a48ddf0331016edbc684ba6937412e22 (diff) | |
download | Nim-e2d38a57ecdc3aa7b5cd81a9f2f588eb0dc5586f.tar.gz |
better support for unsigned integers.
Diffstat (limited to 'compiler')
-rwxr-xr-x | compiler/ast.nim | 40 | ||||
-rwxr-xr-x | compiler/ccgexprs.nim | 12 | ||||
-rwxr-xr-x | compiler/ccgtypes.nim | 12 | ||||
-rwxr-xr-x | compiler/ccgutils.nim | 4 | ||||
-rw-r--r-- | compiler/cgendata.nim | 8 | ||||
-rwxr-xr-x | compiler/docgen.nim | 4 | ||||
-rwxr-xr-x | compiler/evals.nim | 2 | ||||
-rwxr-xr-x | compiler/extccomp.nim | 2 | ||||
-rwxr-xr-x | compiler/lexer.nim | 41 | ||||
-rwxr-xr-x | compiler/magicsys.nim | 6 | ||||
-rwxr-xr-x | compiler/parser.nim | 24 | ||||
-rwxr-xr-x | compiler/renderer.nim | 6 | ||||
-rwxr-xr-x | compiler/semexprs.nim | 36 | ||||
-rwxr-xr-x | compiler/semfold.nim | 12 | ||||
-rwxr-xr-x | compiler/semtypes.nim | 6 | ||||
-rwxr-xr-x | compiler/sigmatch.nim | 8 | ||||
-rwxr-xr-x | compiler/types.nim | 22 |
17 files changed, 186 insertions, 59 deletions
diff --git a/compiler/ast.nim b/compiler/ast.nim index 0c25b24a1..eb258e383 100755 --- a/compiler/ast.nim +++ b/compiler/ast.nim @@ -52,9 +52,15 @@ type nkInt16Lit, nkInt32Lit, nkInt64Lit, + nkUIntLit, # an unsigned integer literal + nkUInt8Lit, + nkUInt16Lit, + nkUInt32Lit, + nkUInt64Lit, nkFloatLit, # a floating point literal nkFloat32Lit, nkFloat64Lit, + nkFloat128Lit, nkStrLit, # a string literal "" nkRStrLit, # a raw string literal r"" nkTripleStrLit, # a triple string literal """ @@ -323,6 +329,7 @@ type tfEnumHasHoles, # enum cannot be mapped into a range tfShallow, # type can be shallow copied on assignment tfThread, # proc type is marked as ``thread`` + tfLiteral # type represents literal value tfFromGeneric # type is an instantiation of a generic; this is needed # because for instantiations of objects, structural # type equality has to be used @@ -406,8 +413,11 @@ type mNewString, mNewStringOfCap, mReset, mArray, mOpenArray, mRange, mSet, mSeq, - mOrdinal, mInt, mInt8, mInt16, mInt32, - mInt64, mFloat, mFloat32, mFloat64, mBool, mChar, mString, mCstring, + mOrdinal, + mInt, mInt8, mInt16, mInt32, mInt64, + mUInt, mUInt8, mUInt16, mUInt32, mUInt64, + mFloat, mFloat32, mFloat64, mFloat128, + mBool, mChar, mString, mCstring, mPointer, mEmptySet, mIntSetBaseType, mNil, mExpr, mStmt, mTypeDesc, mVoidType, mPNimrodNode, mIsMainModule, mCompileDate, mCompileTime, mNimrodVersion, mNimrodMajor, @@ -462,11 +472,11 @@ type info*: TLineInfo flags*: TNodeFlags case Kind*: TNodeKind - of nkCharLit..nkInt64Lit: + of nkCharLit..nkUInt64Lit: intVal*: biggestInt - of nkFloatLit..nkFloat64Lit: + of nkFloatLit..nkFloat128Lit: floatVal*: biggestFloat - of nkStrLit..nkTripleStrLit: + of nkStrLit..nkTripleStrLit: strVal*: string of nkSym: sym*: PSym @@ -763,8 +773,8 @@ const # for all kind of hash tables: proc ValueToString*(a: PNode): string = case a.kind - of nkCharLit..nkInt64Lit: result = $(a.intVal) - of nkFloatLit, nkFloat32Lit, nkFloat64Lit: result = $(a.floatVal) + of nkCharLit..nkUInt64Lit: result = $(a.intVal) + of nkFloatLit..nkFloat128Lit: result = $(a.floatVal) of nkStrLit..nkTripleStrLit: result = a.strVal else: InternalError(a.info, "valueToString") @@ -1019,8 +1029,8 @@ proc copyNode(src: PNode): PNode = result.typ = src.typ result.flags = src.flags * PersistentNodeFlags case src.Kind - of nkCharLit..nkInt64Lit: result.intVal = src.intVal - of nkFloatLit, nkFloat32Lit, nkFloat64Lit: result.floatVal = src.floatVal + of nkCharLit..nkUInt64Lit: result.intVal = src.intVal + of nkFloatLit..nkFloat128Lit: result.floatVal = src.floatVal of nkSym: result.sym = src.sym of nkIdent: result.ident = src.ident of nkStrLit..nkTripleStrLit: result.strVal = src.strVal @@ -1034,8 +1044,8 @@ proc shallowCopy*(src: PNode): PNode = result.typ = src.typ result.flags = src.flags * PersistentNodeFlags case src.Kind - of nkCharLit..nkInt64Lit: result.intVal = src.intVal - of nkFloatLit, nkFloat32Lit, nkFloat64Lit: result.floatVal = src.floatVal + of nkCharLit..nkUInt64Lit: result.intVal = src.intVal + of nkFloatLit..nkFloat128Lit: result.floatVal = src.floatVal of nkSym: result.sym = src.sym of nkIdent: result.ident = src.ident of nkStrLit..nkTripleStrLit: result.strVal = src.strVal @@ -1050,8 +1060,8 @@ proc copyTree(src: PNode): PNode = result.typ = src.typ result.flags = src.flags * PersistentNodeFlags case src.Kind - of nkCharLit..nkInt64Lit: result.intVal = src.intVal - of nkFloatLit, nkFloat32Lit, nkFloat64Lit: result.floatVal = src.floatVal + of nkCharLit..nkUInt64Lit: result.intVal = src.intVal + of nkFloatLit..nkFloat128Lit: result.floatVal = src.floatVal of nkSym: result.sym = src.sym of nkIdent: result.ident = src.ident of nkStrLit..nkTripleStrLit: result.strVal = src.strVal @@ -1101,14 +1111,14 @@ proc sonsNotNil(n: PNode): bool = proc getInt*(a: PNode): biggestInt = case a.kind - of nkIntLit..nkInt64Lit: result = a.intVal + of nkIntLit..nkUInt64Lit: result = a.intVal else: internalError(a.info, "getInt") result = 0 proc getFloat*(a: PNode): biggestFloat = case a.kind - of nkFloatLit..nkFloat64Lit: result = a.floatVal + of nkFloatLit..nkFloat128Lit: result = a.floatVal else: internalError(a.info, "getFloat") result = 0.0 diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index 5b04111b3..a929b5af0 100755 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -34,7 +34,7 @@ proc int32Literal(i: Int): PRope = proc genHexLiteral(v: PNode): PRope = # hex literals are unsigned in C # so we don't generate hex literals any longer. - if not (v.kind in {nkIntLit..nkInt64Lit}): + if not (v.kind in {nkIntLit..nkUInt64Lit}): internalError(v.info, "genHexLiteral") result = intLiteral(v.intVal) @@ -47,7 +47,7 @@ proc getStrLit(m: BModule, s: string): PRope = proc genLiteral(p: BProc, v: PNode, ty: PType): PRope = if ty == nil: internalError(v.info, "genLiteral: ty is nil") case v.kind - of nkCharLit..nkInt64Lit: + of nkCharLit..nkUInt64Lit: case skipTypes(ty, abstractVarRange).kind of tyChar, tyInt64, tyNil: result = intLiteral(v.intVal) @@ -277,7 +277,7 @@ proc genAssignment(p: BProc, dest, src: TLoc, flags: TAssignmentFlags) = else: appcg(p, cpsStmts, "$1 = $2;$n", [rdLoc(dest), rdLoc(src)]) of tyPtr, tyPointer, tyChar, tyBool, tyEnum, tyCString, - tyInt..tyFloat128, tyRange: + tyInt..tyUInt64, tyRange: appcg(p, cpsStmts, "$1 = $2;$n", [rdLoc(dest), rdLoc(src)]) else: InternalError("genAssignment(" & $ty.kind & ')') @@ -582,7 +582,7 @@ proc genTupleElem(p: BProc, e: PNode, d: var TLoc) = var ty = a.t var r = rdLoc(a) case e.sons[1].kind - of nkIntLit..nkInt64Lit: i = int(e.sons[1].intVal) + of nkIntLit..nkUInt64Lit: i = int(e.sons[1].intVal) else: internalError(e.info, "genTupleElem") when false: if ty.n != nil: @@ -1684,8 +1684,8 @@ proc expr(p: BProc, e: PNode, d: var TLoc) = InternalError(e.info, "expr: param not init " & sym.name.s) putLocIntoDest(p, d, sym.loc) else: InternalError(e.info, "expr(" & $sym.kind & "); unknown symbol") - of nkStrLit..nkTripleStrLit, nkIntLit..nkInt64Lit, nkFloatLit..nkFloat64Lit, - nkNilLit, nkCharLit: + of nkStrLit..nkTripleStrLit, nkIntLit..nkUInt64Lit, + nkFloatLit..nkFloat128Lit, nkNilLit, nkCharLit: putIntoDest(p, d, e.typ, genLiteral(p, e)) of nkCall, nkHiddenCallConv, nkInfix, nkPrefix, nkPostfix, nkCommand, nkCallStrLit: diff --git a/compiler/ccgtypes.nim b/compiler/ccgtypes.nim index 4492c2fea..e456a1eaa 100755 --- a/compiler/ccgtypes.nim +++ b/compiler/ccgtypes.nim @@ -174,7 +174,7 @@ proc mapType(typ: PType): TCTypeKind = of tyProc: result = if typ.callConv != ccClosure: ctProc else: ctStruct of tyString: result = ctNimStr of tyCString: result = ctCString - of tyInt..tyFloat128: + of tyInt..tyUInt64: result = TCTypeKind(ord(typ.kind) - ord(tyInt) + ord(ctInt)) else: InternalError("mapType") @@ -313,8 +313,10 @@ proc typeNameOrLiteral(t: PType, literal: string): PRope = proc getSimpleTypeDesc(m: BModule, typ: PType): PRope = const - NumericalTypeToStr: array[tyInt..tyFloat128, string] = ["NI", "NI8", - "NI16", "NI32", "NI64", "NF", "NF32", "NF64", "NF128"] + NumericalTypeToStr: array[tyInt..tyUInt64, string] = [ + "NI", "NI8", "NI16", "NI32", "NI64", + "NF", "NF32", "NF64", "NF128", + "NU", "NU8", "NU16", "NU32", "NU64",] case typ.Kind of tyPointer: result = typeNameOrLiteral(typ, "void*") @@ -337,7 +339,7 @@ proc getSimpleTypeDesc(m: BModule, typ: PType): PRope = of tyBool: result = typeNameOrLiteral(typ, "NIM_BOOL") of tyChar: result = typeNameOrLiteral(typ, "NIM_CHAR") of tyNil: result = typeNameOrLiteral(typ, "0") - of tyInt..tyFloat128, tyUInt..tyUInt64: + of tyInt..tyUInt64: result = typeNameOrLiteral(typ, NumericalTypeToStr[typ.Kind]) of tyRange: result = getSimpleTypeDesc(m, typ.sons[0]) else: result = nil @@ -871,7 +873,7 @@ proc genTypeInfo(m: BModule, typ: PType): PRope = if dataGenerated: return case t.kind of tyEmpty: result = toRope"0" - of tyPointer, tyBool, tyChar, tyCString, tyString, tyInt..tyFloat128, tyVar: + of tyPointer, tyBool, tyChar, tyCString, tyString, tyInt..tyUInt64, tyVar: genTypeInfoAuxBase(gNimDat, t, result, toRope"0") of tyProc: if t.callConv != ccClosure: diff --git a/compiler/ccgutils.nim b/compiler/ccgutils.nim index 5ba523070..de49897c5 100755 --- a/compiler/ccgutils.nim +++ b/compiler/ccgutils.nim @@ -70,9 +70,7 @@ proc GetUniqueType*(key: PType): PType = var k = key.kind case k of tyBool, tyChar, - tyInt, tyInt8, tyInt16, tyInt32, tyInt64, - tyFloat, tyFloat32, tyFloat64, tyFloat128, - tyUInt, tyUInt8, tyUInt16, tyUInt32, tyUInt64: + tyInt..tyUInt64: # no canonicalization for integral types, so that e.g. ``pid_t`` is # produced instead of ``NI``. result = key diff --git a/compiler/cgendata.nim b/compiler/cgendata.nim index bcdf53afd..72c7ceae5 100644 --- a/compiler/cgendata.nim +++ b/compiler/cgendata.nim @@ -37,9 +37,11 @@ type cfsDynLibDeinit # section for deinitialization of dynamic # libraries TCTypeKind* = enum # describes the type kind of a C type - ctVoid, ctChar, ctBool, ctUInt, ctUInt8, ctUInt16, ctUInt32, ctUInt64, - ctInt, ctInt8, ctInt16, ctInt32, ctInt64, ctFloat, ctFloat32, ctFloat64, - ctFloat128, ctArray, ctStruct, ctPtr, ctNimStr, ctNimSeq, ctProc, ctCString + ctVoid, ctChar, ctBool, + ctInt, ctInt8, ctInt16, ctInt32, ctInt64, + ctFloat, ctFloat32, ctFloat64, ctFloat128, + ctUInt, ctUInt8, ctUInt16, ctUInt32, ctUInt64, + ctArray, ctStruct, ctPtr, ctNimStr, ctNimSeq, ctProc, ctCString TCFileSections* = array[TCFileSection, PRope] # represents a generated C file TCProcSection* = enum # the sections a generated C proc consists of cpsLocals, # section of local variables for C proc diff --git a/compiler/docgen.nim b/compiler/docgen.nim index 6e249b888..ae654fda4 100755 --- a/compiler/docgen.nim +++ b/compiler/docgen.nim @@ -206,10 +206,10 @@ proc genItem(d: PDoc, n, nameNode: PNode, k: TSymKind) = of tkCharLit: dispA(result, "<span class=\"CharLit\">$1</span>", "\\spanCharLit{$1}", [toRope(esc(d.target, literal))]) - of tkIntLit..tkInt64Lit: + of tkIntLit..tkUInt64Lit: dispA(result, "<span class=\"DecNumber\">$1</span>", "\\spanDecNumber{$1}", [toRope(esc(d.target, literal))]) - of tkFloatLit..tkFloat64Lit: + of tkFloatLit..tkFloat128Lit: dispA(result, "<span class=\"FloatNumber\">$1</span>", "\\spanFloatNumber{$1}", [toRope(esc(d.target, literal))]) of tkSymbol: diff --git a/compiler/evals.nim b/compiler/evals.nim index 5c77a4d94..62649cb08 100755 --- a/compiler/evals.nim +++ b/compiler/evals.nim @@ -235,6 +235,8 @@ proc getNullValue(typ: PType, info: TLineInfo): PNode = case t.kind of tyBool, tyEnum, tyChar, tyInt..tyInt64: result = newNodeIT(nkIntLit, info, t) + of tyUInt..tyUInt64: + result = newNodeIT(nkUIntLit, info, t) of tyFloat..tyFloat128: result = newNodeIt(nkFloatLit, info, t) of tyVar, tyPointer, tyPtr, tyRef, tyCString, tySequence, tyString, tyExpr, diff --git a/compiler/extccomp.nim b/compiler/extccomp.nim index fb2e5f3f5..2872f28a7 100755 --- a/compiler/extccomp.nim +++ b/compiler/extccomp.nim @@ -597,7 +597,7 @@ proc CallCCompiler*(projectfile: string) = proc genMappingFiles(list: TLinkedList): PRope = var it = PStrEntry(list.head) while it != nil: - appf(result, "--file:r\"$1\"$n", [toRope(AddFileExt(it.data, cExt))]) + appf(result, "--file:r\"$1\"$N", [toRope(AddFileExt(it.data, cExt))]) it = PStrEntry(it.next) proc writeMapping*(gSymbolMapping: PRope) = diff --git a/compiler/lexer.nim b/compiler/lexer.nim index a17871e3a..73a818e32 100755 --- a/compiler/lexer.nim +++ b/compiler/lexer.nim @@ -45,8 +45,10 @@ type tkTemplate, tkTry, tkTuple, tkType, tkVar, tkWhen, tkWhile, tkWith, tkWithout, tkXor, tkYield, # end of keywords - tkIntLit, tkInt8Lit, tkInt16Lit, tkInt32Lit, tkInt64Lit, tkFloatLit, - tkFloat32Lit, tkFloat64Lit, tkStrLit, tkRStrLit, tkTripleStrLit, + tkIntLit, tkInt8Lit, tkInt16Lit, tkInt32Lit, tkInt64Lit, + tkUIntLit, tkUInt8Lit, tkUInt16Lit, tkUInt32Lit, tkUInt64Lit, + tkFloatLit, tkFloat32Lit, tkFloat64Lit, tkFloat128Lit, + tkStrLit, tkRStrLit, tkTripleStrLit, tkGStrLit, tkGTripleStrLit, tkCharLit, tkParLe, tkParRi, tkBracketLe, tkBracketRi, tkCurlyLe, tkCurlyRi, tkBracketDotLe, tkBracketDotRi, # [. and .] @@ -77,8 +79,10 @@ const "template", "try", "tuple", "type", "var", "when", "while", "with", "without", "xor", "yield", - "tkIntLit", "tkInt8Lit", "tkInt16Lit", "tkInt32Lit", "tkInt64Lit", - "tkFloatLit", "tkFloat32Lit", "tkFloat64Lit", "tkStrLit", "tkRStrLit", + "tkIntLit", "tkInt8Lit", "tkInt16Lit", "tkInt32Lit", "tkInt64Lit", + "tkUIntLit", "tkUInt8Lit", "tkUInt16Lit", "tkUInt32Lit", "tkUInt64Lit", + "tkFloatLit", "tkFloat32Lit", "tkFloat64Lit", "tkFloat128Lit", + "tkStrLit", "tkRStrLit", "tkTripleStrLit", "tkGStrLit", "tkGTripleStrLit", "tkCharLit", "(", ")", "[", "]", "{", "}", "[.", ".]", "{.", ".}", "(.", ".)", ",", ";", @@ -283,12 +287,17 @@ proc GetNumber(L: var TLexer): TToken = case L.buf[endpos] of 'f', 'F': inc(endpos) - if (L.buf[endpos] == '6') and (L.buf[endpos + 1] == '4'): - result.tokType = tkFloat64Lit - inc(endpos, 2) - elif (L.buf[endpos] == '3') and (L.buf[endpos + 1] == '2'): + if (L.buf[endpos] == '3') and (L.buf[endpos + 1] == '2'): result.tokType = tkFloat32Lit inc(endpos, 2) + elif (L.buf[endpos] == '6') and (L.buf[endpos + 1] == '4'): + result.tokType = tkFloat64Lit + inc(endpos, 2) + elif (L.buf[endpos] == '1') and + (L.buf[endpos + 1] == '2') and + (L.buf[endpos + 2] == '8'): + result.tokType = tkFloat128Lit + inc(endpos, 3) else: lexMessage(L, errInvalidNumber, result.literal & "'f" & L.buf[endpos]) of 'i', 'I': @@ -307,6 +316,22 @@ proc GetNumber(L: var TLexer): TToken = inc(endpos) else: lexMessage(L, errInvalidNumber, result.literal & "'i" & L.buf[endpos]) + of 'u', 'U': + inc(endpos) + if (L.buf[endpos] == '6') and (L.buf[endpos + 1] == '4'): + result.tokType = tkUInt64Lit + inc(endpos, 2) + elif (L.buf[endpos] == '3') and (L.buf[endpos + 1] == '2'): + result.tokType = tkUInt32Lit + inc(endpos, 2) + elif (L.buf[endpos] == '1') and (L.buf[endpos + 1] == '6'): + result.tokType = tkUInt16Lit + inc(endpos, 2) + elif (L.buf[endpos] == '8'): + result.tokType = tkUInt8Lit + inc(endpos) + else: + result.tokType = tkUIntLit else: lexMessage(L, errInvalidNumber, result.literal & "'" & L.buf[endpos]) else: L.bufpos = pos # restore position diff --git a/compiler/magicsys.nim b/compiler/magicsys.nim index 5b9987efa..a69b40fbf 100755 --- a/compiler/magicsys.nim +++ b/compiler/magicsys.nim @@ -53,9 +53,15 @@ proc getSysType(kind: TTypeKind): PType = of tyInt16: result = sysTypeFromName("int16") of tyInt32: result = sysTypeFromName("int32") of tyInt64: result = sysTypeFromName("int64") + of tyUInt: result = sysTypeFromName("uint") + of tyUInt8: result = sysTypeFromName("uint8") + of tyUInt16: result = sysTypeFromName("uint16") + of tyUInt32: result = sysTypeFromName("uint32") + of tyUInt64: result = sysTypeFromName("uint64") of tyFloat: result = sysTypeFromName("float") of tyFloat32: result = sysTypeFromName("float32") of tyFloat64: result = sysTypeFromName("float64") + of tyFloat128: result = sysTypeFromName("float128") of tyBool: result = sysTypeFromName("bool") of tyChar: result = sysTypeFromName("char") of tyString: result = sysTypeFromName("string") diff --git a/compiler/parser.nim b/compiler/parser.nim index 4baee5b43..d1042b04d 100755 --- a/compiler/parser.nim +++ b/compiler/parser.nim @@ -416,6 +416,26 @@ proc identOrLiteral(p: var TParser): PNode = result = newIntNodeP(nkInt64Lit, p.tok.iNumber, p) setBaseFlags(result, p.tok.base) getTok(p) + of tkUIntLit: + result = newIntNodeP(nkUIntLit, p.tok.iNumber, p) + setBaseFlags(result, p.tok.base) + getTok(p) + of tkUInt8Lit: + result = newIntNodeP(nkUInt8Lit, p.tok.iNumber, p) + setBaseFlags(result, p.tok.base) + getTok(p) + of tkUInt16Lit: + result = newIntNodeP(nkUInt16Lit, p.tok.iNumber, p) + setBaseFlags(result, p.tok.base) + getTok(p) + of tkUInt32Lit: + result = newIntNodeP(nkUInt32Lit, p.tok.iNumber, p) + setBaseFlags(result, p.tok.base) + getTok(p) + of tkUInt64Lit: + result = newIntNodeP(nkUInt64Lit, p.tok.iNumber, p) + setBaseFlags(result, p.tok.base) + getTok(p) of tkFloatLit: result = newFloatNodeP(nkFloatLit, p.tok.fNumber, p) setBaseFlags(result, p.tok.base) @@ -428,6 +448,10 @@ proc identOrLiteral(p: var TParser): PNode = result = newFloatNodeP(nkFloat64Lit, p.tok.fNumber, p) setBaseFlags(result, p.tok.base) getTok(p) + of tkFloat128Lit: + result = newFloatNodeP(nkFloat128Lit, p.tok.fNumber, p) + setBaseFlags(result, p.tok.base) + getTok(p) of tkStrLit: result = newStrNodeP(nkStrLit, p.tok.literal, p) getTok(p) diff --git a/compiler/renderer.nim b/compiler/renderer.nim index a5e79762c..21b0f2287 100755 --- a/compiler/renderer.nim +++ b/compiler/renderer.nim @@ -705,9 +705,15 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) = of nkInt16Lit: put(g, tkInt16Lit, atom(n)) of nkInt32Lit: put(g, tkInt32Lit, atom(n)) of nkInt64Lit: put(g, tkInt64Lit, atom(n)) + of nkUIntLit: put(g, tkUIntLit, atom(n)) + of nkUInt8Lit: put(g, tkUInt8Lit, atom(n)) + of nkUInt16Lit: put(g, tkUInt16Lit, atom(n)) + of nkUInt32Lit: put(g, tkUInt32Lit, atom(n)) + of nkUInt64Lit: put(g, tkUInt64Lit, atom(n)) of nkFloatLit: put(g, tkFloatLit, atom(n)) of nkFloat32Lit: put(g, tkFloat32Lit, atom(n)) of nkFloat64Lit: put(g, tkFloat64Lit, atom(n)) + of nkFloat128Lit: put(g, tkFloat128Lit, atom(n)) of nkStrLit: put(g, tkStrLit, atom(n)) of nkRStrLit: put(g, tkRStrLit, atom(n)) of nkCharLit: put(g, tkCharLit, atom(n)) diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index ac9075d4f..8910e54c2 100755 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -132,10 +132,10 @@ proc checkConversionBetweenObjects(info: TLineInfo, castDest, src: PType) = proc checkConvertible(info: TLineInfo, castDest, src: PType) = const - IntegralTypes = {tyBool, tyEnum, tyChar, tyInt..tyFloat128} + IntegralTypes = {tyBool, tyEnum, tyChar, tyInt..tyUInt64} if sameType(castDest, src) and castDest.sym == src.sym: # don't annoy conversions that may be needed on another processor: - if not (castDest.kind in {tyInt..tyFloat128, tyNil}): + if not (castDest.kind in {tyInt..tyUInt64, tyNil}): Message(info, hintConvFromXtoItselfNotNeeded, typeToString(castDest)) return var d = skipTypes(castDest, abstractVar) @@ -143,7 +143,7 @@ proc checkConvertible(info: TLineInfo, castDest, src: PType) = while (d != nil) and (d.Kind in {tyPtr, tyRef}) and (d.Kind == s.Kind): d = base(d) s = base(s) - if d == nil: + if d == nil: GlobalError(info, errGenerated, msgKindToString(errIllegalConvFromXtoY) % [ src.typeToString, castDest.typeToString]) elif d.Kind == tyObject and s.Kind == tyObject: @@ -1283,6 +1283,20 @@ proc semMacroStmt(c: PContext, n: PNode, semCheck = true): PNode = GlobalError(n.info, errInvalidExpressionX, renderTree(a, {renderNoComments})) +proc litIntType(kind: TTypeKind): PType = + result = getSysType(kind).copyType(getCurrOwner(), true) + result.flags.incl(tfLiteral) + +template memoize(e: expr): expr = + var `*guard` {.global.} = false + var `*memo` {.global.} : type(e) + + if not `*guard`: + `*memo` = e + `*guard` = true + + `*memo` + proc semExpr(c: PContext, n: PNode, flags: TExprFlags = {}): PNode = result = n if gCmd == cmdIdeTools: suggestExpr(c, n) @@ -1303,9 +1317,9 @@ proc semExpr(c: PContext, n: PNode, flags: TExprFlags = {}): PNode = if result.typ == nil: let i = result.intVal if i >= low(int32) and i <= high(int32): - result.typ = getSysType(tyInt) + result.typ = litIntType(tyInt).memoize else: - result.typ = getSysType(tyInt64) + result.typ = litIntType(tyInt64).memoize of nkInt8Lit: if result.typ == nil: result.typ = getSysType(tyInt8) of nkInt16Lit: @@ -1314,12 +1328,24 @@ proc semExpr(c: PContext, n: PNode, flags: TExprFlags = {}): PNode = if result.typ == nil: result.typ = getSysType(tyInt32) of nkInt64Lit: if result.typ == nil: result.typ = getSysType(tyInt64) + of nkUIntLit: + if result.typ == nil: result.typ = getSysType(tyUInt) + of nkUInt8Lit: + if result.typ == nil: result.typ = getSysType(tyUInt8) + of nkUInt16Lit: + if result.typ == nil: result.typ = getSysType(tyUInt16) + of nkUInt32Lit: + if result.typ == nil: result.typ = getSysType(tyUInt32) + of nkUInt64Lit: + if result.typ == nil: result.typ = getSysType(tyUInt64) of nkFloatLit: if result.typ == nil: result.typ = getSysType(tyFloat) of nkFloat32Lit: if result.typ == nil: result.typ = getSysType(tyFloat32) of nkFloat64Lit: if result.typ == nil: result.typ = getSysType(tyFloat64) + of nkFloat128Lit: + if result.typ == nil: result.typ = getSysType(tyFloat128) of nkStrLit..nkTripleStrLit: if result.typ == nil: result.typ = getSysType(tyString) of nkCharLit: diff --git a/compiler/semfold.nim b/compiler/semfold.nim index 565155791..f67e58e2f 100755 --- a/compiler/semfold.nim +++ b/compiler/semfold.nim @@ -258,15 +258,15 @@ proc partialOrExpr(c: PSym, n: PNode): PNode = proc leValueConv(a, b: PNode): bool = result = false case a.kind - of nkCharLit..nkInt64Lit: + of nkCharLit..nkUInt64Lit: case b.kind - of nkCharLit..nkInt64Lit: result = a.intVal <= b.intVal - of nkFloatLit..nkFloat64Lit: result = a.intVal <= round(b.floatVal) + of nkCharLit..nkUInt64Lit: result = a.intVal <= b.intVal + of nkFloatLit..nkFloat128Lit: result = a.intVal <= round(b.floatVal) else: InternalError(a.info, "leValueConv") - of nkFloatLit..nkFloat64Lit: + of nkFloatLit..nkFloat128Lit: case b.kind - of nkFloatLit..nkFloat64Lit: result = a.floatVal <= b.floatVal - of nkCharLit..nkInt64Lit: result = a.floatVal <= toFloat(int(b.intVal)) + of nkFloatLit..nkFloat128Lit: result = a.floatVal <= b.floatVal + of nkCharLit..nkUInt64Lit: result = a.floatVal <= toFloat(int(b.intVal)) else: InternalError(a.info, "leValueConv") else: InternalError(a.info, "leValueConv") diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim index 19f37f405..e68ea007e 100755 --- a/compiler/semtypes.nim +++ b/compiler/semtypes.nim @@ -822,9 +822,15 @@ proc processMagicType(c: PContext, m: PSym) = of mInt16: setMagicType(m, tyInt16, 2) of mInt32: setMagicType(m, tyInt32, 4) of mInt64: setMagicType(m, tyInt64, 8) + of mUInt: setMagicType(m, tyUInt, intSize) + of mUInt8: setMagicType(m, tyUInt8, 1) + of mUInt16: setMagicType(m, tyUInt16, 2) + of mUInt32: setMagicType(m, tyUInt32, 4) + of mUInt64: setMagicType(m, tyUInt64, 8) of mFloat: setMagicType(m, tyFloat, floatSize) of mFloat32: setMagicType(m, tyFloat32, 4) of mFloat64: setMagicType(m, tyFloat64, 8) + of mFloat128: setMagicType(m, tyFloat128, 16) of mBool: setMagicType(m, tyBool, 1) of mChar: setMagicType(m, tyChar, 1) of mString: diff --git a/compiler/sigmatch.nim b/compiler/sigmatch.nim index 9881e84a3..168936ed4 100755 --- a/compiler/sigmatch.nim +++ b/compiler/sigmatch.nim @@ -163,6 +163,9 @@ proc handleRange(f, a: PType, min, max: TTypeKind): TTypeRelation = var k = skipTypes(a, {tyRange}).kind if k == f.kind: result = isSubtype elif f.kind == tyInt and k in {tyInt..tyInt32}: result = isIntConv + elif f.kind == tyUInt and k in {tyUInt..tyUInt32}: result = isIntConv + elif f.kind in {tyUInt..tyUInt64} and k == tyInt and tfLiteral in a.flags: + result = isIntConv elif k >= min and k <= max: result = isConvertible else: result = isNone @@ -306,6 +309,11 @@ proc typeRel(mapping: var TIdTable, f, a: PType): TTypeRelation = of tyInt16: result = handleRange(f, a, tyInt8, tyInt16) of tyInt32: result = handleRange(f, a, tyInt, tyInt32) of tyInt64: result = handleRange(f, a, tyInt, tyInt64) + of tyUInt: result = handleRange(f, a, tyUInt8, tyUInt32) + of tyUInt8: result = handleRange(f, a, tyUInt8, tyUInt8) + of tyUInt16: result = handleRange(f, a, tyUInt8, tyUInt16) + of tyUInt32: result = handleRange(f, a, tyUInt, tyUInt32) + of tyUInt64: result = handleRange(f, a, tyUInt, tyUInt64) of tyFloat: result = handleFloatRange(f, a) of tyFloat32: result = handleFloatRange(f, a) of tyFloat64: result = handleFloatRange(f, a) diff --git a/compiler/types.nim b/compiler/types.nim index ecc250a5a..fb0e9a123 100755 --- a/compiler/types.nim +++ b/compiler/types.nim @@ -141,7 +141,7 @@ proc skipTypes(t: PType, kinds: TTypeKinds): PType = proc isOrdinalType(t: PType): bool = assert(t != nil) - result = (t.Kind in {tyChar, tyInt..tyInt64, tyBool, tyEnum}) or + result = (t.Kind in {tyChar, tyInt..tyInt64, tyUInt..tyUInt64, tyBool, tyEnum}) or (t.Kind in {tyRange, tyOrdinal, tyConst, tyMutable, tyGenericInst}) and isOrdinalType(t.sons[0]) @@ -386,10 +386,11 @@ proc TypeToString(typ: PType, prefer: TPreferedDesc = preferName): string = "GenericInvokation", "GenericBody", "GenericInst", "GenericParam", "distinct $1", "enum", "ordinal[$1]", "array[$1, $2]", "object", "tuple", "set[$1]", "range[$1]", "ptr ", "ref ", "var ", "seq[$1]", "proc", - "pointer", "OpenArray[$1]", "string", "CString", "Forward", "int", "int8", - "int16", "int32", "int64", "float", "float32", "float64", "float128", - - "uint", "uint8", "uint16", "uint32", "uint64", "bignum", "const ", + "pointer", "OpenArray[$1]", "string", "CString", "Forward", + "int", "int8", "int16", "int32", "int64", + "float", "float32", "float64", "float128", + "uint", "uint8", "uint16", "uint32", "uint64", + "bignum", "const ", "!", "varargs[$1]", "iter[$1]", "proxy[$1]", "TypeClass" ] var t = typ result = "" @@ -494,6 +495,7 @@ proc firstOrd(t: PType): biggestInt = of tyInt16: result = - 32768 of tyInt32: result = - 2147483646 - 2 of tyInt64: result = 0x8000000000000000'i64 + of tyUInt..tyUInt64: result = 0 of tyEnum: # if basetype <> nil then return firstOrd of basetype if (sonsLen(t) > 0) and (t.sons[0] != nil): @@ -524,6 +526,13 @@ proc lastOrd(t: PType): biggestInt = of tyInt16: result = 0x00007FFF of tyInt32: result = 0x7FFFFFFF of tyInt64: result = 0x7FFFFFFFFFFFFFFF'i64 + of tyUInt: + if platform.intSize == 4: result = 0xFFFFFFFF + else: result = 0x7FFFFFFFFFFFFFFF'i64 + of tyUInt8: result = 0x7F # XXX: Fix these + of tyUInt16: result = 0x7FFF + of tyUInt32: result = 0x7FFFFFFF + of tyUInt64: result = 0x7FFFFFFFFFFFFFFF'i64 of tyEnum: assert(t.n.sons[sonsLen(t.n) - 1].kind == nkSym) result = t.n.sons[sonsLen(t.n) - 1].sym.position @@ -980,6 +989,9 @@ proc computeSizeAux(typ: PType, a: var biggestInt): biggestInt = of tyInt64, tyUInt64, tyFloat64: result = 8 a = result + of tyFloat128: + result = 16 + a = result of tyFloat: result = floatSize a = result |