ccgutils: code cleanup, no globals
This commit is contained in:
parent
635451591d
commit
479212995a
1 changed files with 1 additions and 108 deletions
|
|
@ -52,112 +52,7 @@ proc hashString*(s: string): BiggestInt =
|
||||||
a = a +% `shl`(a, 15'i32)
|
a = a +% `shl`(a, 15'i32)
|
||||||
result = a
|
result = a
|
||||||
|
|
||||||
var
|
template getUniqueType*(key: PType): PType = key
|
||||||
gTypeTable: array[TTypeKind, TIdTable] # XXX globals here
|
|
||||||
gCanonicalTypes: array[TTypeKind, PType]
|
|
||||||
|
|
||||||
proc initTypeTables() =
|
|
||||||
for i in countup(low(TTypeKind), high(TTypeKind)): initIdTable(gTypeTable[i])
|
|
||||||
|
|
||||||
proc resetCaches* =
|
|
||||||
## XXX: fix that more properly
|
|
||||||
initTypeTables()
|
|
||||||
for i in low(gCanonicalTypes)..high(gCanonicalTypes):
|
|
||||||
gCanonicalTypes[i] = nil
|
|
||||||
|
|
||||||
when false:
|
|
||||||
proc echoStats*() =
|
|
||||||
for i in countup(low(TTypeKind), high(TTypeKind)):
|
|
||||||
echo i, " ", gTypeTable[i].counter
|
|
||||||
|
|
||||||
proc slowSearch(key: PType; k: TTypeKind): PType =
|
|
||||||
# tuples are quite horrible as C does not support them directly and
|
|
||||||
# tuple[string, string] is a (strange) subtype of
|
|
||||||
# tuple[nameA, nameB: string]. This bites us here, so we
|
|
||||||
# use 'sameBackendType' instead of 'sameType'.
|
|
||||||
if idTableHasObjectAsKey(gTypeTable[k], key): return key
|
|
||||||
for h in countup(0, high(gTypeTable[k].data)):
|
|
||||||
var t = PType(gTypeTable[k].data[h].key)
|
|
||||||
if t != nil and sameBackendType(t, key):
|
|
||||||
return t
|
|
||||||
idTablePut(gTypeTable[k], key, key)
|
|
||||||
result = key
|
|
||||||
|
|
||||||
proc getUniqueType*(key: PType): PType =
|
|
||||||
# this is a hotspot in the compiler!
|
|
||||||
result = key
|
|
||||||
when false:
|
|
||||||
if key == nil: return
|
|
||||||
var k = key.kind
|
|
||||||
case k
|
|
||||||
of tyBool, tyChar, tyInt..tyUInt64:
|
|
||||||
# no canonicalization for integral types, so that e.g. ``pid_t`` is
|
|
||||||
# produced instead of ``NI``.
|
|
||||||
result = key
|
|
||||||
of tyEmpty, tyNil, tyExpr, tyStmt, tyPointer, tyString,
|
|
||||||
tyCString, tyNone, tyVoid:
|
|
||||||
result = gCanonicalTypes[k]
|
|
||||||
if result == nil:
|
|
||||||
gCanonicalTypes[k] = key
|
|
||||||
result = key
|
|
||||||
of tyTypeDesc, tyTypeClasses, tyGenericParam, tyFromExpr:
|
|
||||||
if key.isResolvedUserTypeClass:
|
|
||||||
return getUniqueType(lastSon(key))
|
|
||||||
if key.sym != nil:
|
|
||||||
internalError(key.sym.info, "metatype not eliminated")
|
|
||||||
else:
|
|
||||||
internalError("metatype not eliminated")
|
|
||||||
of tyDistinct:
|
|
||||||
if key.deepCopy != nil: result = key
|
|
||||||
else: result = getUniqueType(lastSon(key))
|
|
||||||
of tyGenericInst, tyOrdinal, tyStatic, tyAlias, tySink, tyInferred:
|
|
||||||
result = getUniqueType(lastSon(key))
|
|
||||||
#let obj = lastSon(key)
|
|
||||||
#if obj.sym != nil and obj.sym.name.s == "TOption":
|
|
||||||
# echo "for ", typeToString(key), " I returned "
|
|
||||||
# debug result
|
|
||||||
of tyPtr, tyRef, tyVar, tyLent:
|
|
||||||
let elemType = lastSon(key)
|
|
||||||
if elemType.kind in {tyBool, tyChar, tyInt..tyUInt64}:
|
|
||||||
# no canonicalization for integral types, so that e.g. ``ptr pid_t`` is
|
|
||||||
# produced instead of ``ptr NI``.
|
|
||||||
result = key
|
|
||||||
else:
|
|
||||||
result = slowSearch(key, k)
|
|
||||||
of tyGenericInvocation, tyGenericBody,
|
|
||||||
tyOpenArray, tyArray, tySet, tyRange, tyTuple,
|
|
||||||
tySequence, tyForward, tyVarargs, tyProxy, tyOpt:
|
|
||||||
# we have to do a slow linear search because types may need
|
|
||||||
# to be compared by their structure:
|
|
||||||
result = slowSearch(key, k)
|
|
||||||
of tyObject:
|
|
||||||
if tfFromGeneric notin key.flags:
|
|
||||||
# fast case; lookup per id suffices:
|
|
||||||
result = PType(idTableGet(gTypeTable[k], key))
|
|
||||||
if result == nil:
|
|
||||||
idTablePut(gTypeTable[k], key, key)
|
|
||||||
result = key
|
|
||||||
else:
|
|
||||||
# ugly slow case: need to compare by structure
|
|
||||||
if idTableHasObjectAsKey(gTypeTable[k], key): return key
|
|
||||||
for h in countup(0, high(gTypeTable[k].data)):
|
|
||||||
var t = PType(gTypeTable[k].data[h].key)
|
|
||||||
if t != nil and sameBackendType(t, key):
|
|
||||||
return t
|
|
||||||
idTablePut(gTypeTable[k], key, key)
|
|
||||||
result = key
|
|
||||||
of tyEnum:
|
|
||||||
result = PType(idTableGet(gTypeTable[k], key))
|
|
||||||
if result == nil:
|
|
||||||
idTablePut(gTypeTable[k], key, key)
|
|
||||||
result = key
|
|
||||||
of tyProc:
|
|
||||||
if key.callConv != ccClosure:
|
|
||||||
result = key
|
|
||||||
else:
|
|
||||||
# ugh, we need the canon here:
|
|
||||||
result = slowSearch(key, k)
|
|
||||||
of tyUnused, tyOptAsRef, tyUnused1, tyUnused2: internalError("getUniqueType")
|
|
||||||
|
|
||||||
proc makeSingleLineCString*(s: string): string =
|
proc makeSingleLineCString*(s: string): string =
|
||||||
result = "\""
|
result = "\""
|
||||||
|
|
@ -210,5 +105,3 @@ proc mangle*(name: string): string =
|
||||||
requiresUnderscore = true
|
requiresUnderscore = true
|
||||||
if requiresUnderscore:
|
if requiresUnderscore:
|
||||||
result.add "_"
|
result.add "_"
|
||||||
|
|
||||||
initTypeTables()
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue