diff options
author | Arne Döring <arne.doering@gmx.net> | 2019-08-07 15:53:16 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2019-08-07 15:53:16 +0200 |
commit | afbcd1b330f16294cee32efca1b2f9060874a497 (patch) | |
tree | d0406792478fa58d3c487ff6f72f999c29f25343 /compiler/ast.nim | |
parent | 8407a574992ebd6bccec647a902cf54a4de8db18 (diff) | |
download | Nim-afbcd1b330f16294cee32efca1b2f9060874a497.tar.gz |
int128 on firstOrd, lastOrd and lengthOrd (#11701)
* fixes #11847
Diffstat (limited to 'compiler/ast.nim')
-rw-r--r-- | compiler/ast.nim | 78 |
1 files changed, 60 insertions, 18 deletions
diff --git a/compiler/ast.nim b/compiler/ast.nim index 8d52f12ff..6238acb14 100644 --- a/compiler/ast.nim +++ b/compiler/ast.nim @@ -10,7 +10,9 @@ # abstract syntax tree + symbol table import - lineinfos, hashes, options, ropes, idents, idgen + lineinfos, hashes, options, ropes, idents, idgen, int128 + +export int128 type TCallingConvention* = enum @@ -1055,7 +1057,7 @@ template `[]`*(n: Indexable, i: BackwardsIndex): Indexable = n[n.len - i.int] template `[]=`*(n: Indexable, i: BackwardsIndex; x: Indexable) = n[n.len - i.int] = x when defined(useNodeIds): - const nodeIdToDebug* = -1 # 299750 # 300761 #300863 # 300879 + const nodeIdToDebug* = 2322967# 2322968 var gNodeId: int proc newNode*(kind: TNodeKind): PNode = @@ -1233,10 +1235,48 @@ proc newIntNode*(kind: TNodeKind, intVal: BiggestInt): PNode = result = newNode(kind) result.intVal = intVal -proc newIntTypeNode*(kind: TNodeKind, intVal: BiggestInt, typ: PType): PNode = - result = newIntNode(kind, intVal) +proc newIntNode*(kind: TNodeKind, intVal: Int128): PNode = + result = newNode(kind) + result.intVal = castToInt64(intVal) + +proc lastSon*(n: PType): PType = n.sons[^1] + +proc skipTypes*(t: PType, kinds: TTypeKinds): PType = + ## Used throughout the compiler code to test whether a type tree contains or + ## doesn't contain a specific type/types - it is often the case that only the + ## last child nodes of a type tree need to be searched. This is a really hot + ## path within the compiler! + result = t + while result.kind in kinds: result = lastSon(result) + +proc newIntTypeNode*(intVal: BiggestInt, typ: PType): PNode = + + # this is dirty. abstractVarRange isn't defined yet and therefor it + # is duplicated here. + const abstractVarRange = {tyGenericInst, tyRange, tyVar, tyDistinct, tyOrdinal, + tyTypeDesc, tyAlias, tyInferred, tySink, tyOwned} + case skipTypes(typ, abstractVarRange).kind + of tyInt: result = newNode(nkIntLit) + of tyInt8: result = newNode(nkInt8Lit) + of tyInt16: result = newNode(nkInt16Lit) + of tyInt32: result = newNode(nkInt32Lit) + of tyInt64: result = newNode(nkInt64Lit) + of tyChar: result = newNode(nkCharLit) + of tyUInt: result = newNode(nkUIntLit) + of tyUInt8: result = newNode(nkUInt8Lit) + of tyUInt16: result = newNode(nkUInt16Lit) + of tyUInt32: result = newNode(nkUInt32Lit) + of tyUInt64: result = newNode(nkUInt64Lit) + else: # tyBool, tyEnum + # XXX: does this really need to be the kind nkIntLit? + result = newNode(nkIntLit) + result.intVal = intVal result.typ = typ +proc newIntTypeNode*(intVal: Int128, typ: PType): PNode = + # XXX: introduce range check + newIntTypeNode(castToInt64(intVal), typ) + proc newFloatNode*(kind: TNodeKind, floatVal: BiggestFloat): PNode = result = newNode(kind) result.floatVal = floatVal @@ -1325,7 +1365,6 @@ proc sonsLen*(n: PType): int = n.sons.len proc len*(n: PType): int = n.sons.len proc sonsLen*(n: PNode): int = n.sons.len proc lastSon*(n: PNode): PNode = n.sons[^1] -proc lastSon*(n: PType): PType = n.sons[^1] proc assignType*(dest, src: PType) = dest.kind = src.kind @@ -1421,14 +1460,6 @@ proc initNodeTable*(x: var TNodeTable) = x.counter = 0 newSeq(x.data, StartSize) -proc skipTypes*(t: PType, kinds: TTypeKinds): PType = - ## Used throughout the compiler code to test whether a type tree contains or - ## doesn't contain a specific type/types - it is often the case that only the - ## last child nodes of a type tree need to be searched. This is a really hot - ## path within the compiler! - result = t - while result.kind in kinds: result = lastSon(result) - proc skipTypes*(t: PType, kinds: TTypeKinds; maxIters: int): PType = result = t var i = maxIters @@ -1604,14 +1635,25 @@ proc hasSubnodeWith*(n: PNode, kind: TNodeKind): bool = return true result = false -proc getInt*(a: PNode): BiggestInt = +proc getInt*(a: PNode): Int128 = + case a.kind + of nkCharLit, nkUIntLit..nkUInt64Lit: + result = toInt128(cast[uint64](a.intVal)) + of nkInt8Lit..nkInt64Lit: + result = toInt128(a.intVal) + of nkIntLit: + # XXX: enable this assert + # assert a.typ.kind notin {tyChar, tyUint..tyUInt64} + result = toInt128(a.intVal) + else: + raiseRecoverableError("cannot extract number from invalid AST node") + +proc getInt64*(a: PNode): int64 {.deprecated: "use getInt".} = case a.kind - of nkCharLit..nkUInt64Lit: result = a.intVal + of nkCharLit, nkUIntLit..nkUInt64Lit, nkIntLit..nkInt64Lit: + result = a.intVal else: raiseRecoverableError("cannot extract number from invalid AST node") - #internalError(a.info, "getInt") - #doAssert false, "getInt" - #result = 0 proc getFloat*(a: PNode): BiggestFloat = case a.kind |