implements display based subtype checking (6.4x faster without threads; 2.8x faster with threads) (#20781)

* WIP: fast 'of' operator based on the literature
* implement  display based subtype checking

Co-authored-by: Araq <rumpf_a@web.de>
This commit is contained in:
ringabout 2022-11-08 20:08:01 +08:00 • committed by GitHub
commit 7d15fdd375
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 83 additions and 52 deletions

View file

@ -1592,7 +1592,9 @@ when not defined(js) and defined(nimV2):
TNimTypeV2 {.compilerproc.} = object
destructor: pointer
size: int
align: int
align: int16
depth: int16
display: ptr UncheckedArray[uint32] # classToken
name: cstring
traceImpl: pointer
typeInfoV1: pointer # for backwards compat, usually nil

View file

@ -227,8 +227,6 @@ template tearDownForeignThreadGc* =
## With `--gc:arc` a nop.
discard
type ObjCheckCache = array[0..1, PNimTypeV2]
proc memcmp(str1, str2: cstring, n: csize_t): cint {.importc, header: "<string.h>".}
func endsWith(s, suffix: cstring): bool {.inline.} =
@ -242,19 +240,8 @@ func endsWith(s, suffix: cstring): bool {.inline.} =
proc isObj(obj: PNimTypeV2, subclass: cstring): bool {.compilerRtl, inl.} =
result = endsWith(obj.name, subclass)
proc isObjSlowPath(obj: PNimTypeV2, subclass: cstring, cache: var ObjCheckCache): bool {.compilerRtl, inline.} =
if endsWith(obj.name, subclass):
cache[1] = obj
result = true
else:
cache[0] = obj
result = false
proc isObjWithCache(obj: PNimTypeV2, subclass: cstring, cache: var ObjCheckCache): bool {.compilerRtl.} =
if cache[0] == obj: result = false
elif cache[1] == obj: result = true
else:
result = isObjSlowPath(obj, subclass, cache)
proc isObjDisplayCheck(source: PNimTypeV2, targetDepth: int16, token: uint32): bool {.compilerRtl, inline.} =
result = targetDepth <= source.depth and source.display[targetDepth] == token
proc chckObj(obj: PNimTypeV2, subclass: cstring) {.compilerRtl.} =
# checks if obj is of type subclass: