fix macrocache implementation (#11404)
* macrocache improvements * fix macrocache implementation
This commit is contained in:
parent
efbf43d4a9
commit
c16a753822
2 changed files with 62 additions and 8 deletions
|
|
@ -1786,25 +1786,27 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg =
|
||||||
regs[ra].intVal = getOrDefault(c.graph.cacheCounters, destKey)
|
regs[ra].intVal = getOrDefault(c.graph.cacheCounters, destKey)
|
||||||
of opcNccInc:
|
of opcNccInc:
|
||||||
let g = c.graph
|
let g = c.graph
|
||||||
let destKey = regs[ra].node.strVal
|
declBC()
|
||||||
let by = regs[instr.regB].intVal
|
let destKey = regs[rb].node.strVal
|
||||||
|
let by = regs[rc].intVal
|
||||||
let v = getOrDefault(g.cacheCounters, destKey)
|
let v = getOrDefault(g.cacheCounters, destKey)
|
||||||
g.cacheCounters[destKey] = v+by
|
g.cacheCounters[destKey] = v+by
|
||||||
recordInc(c, c.debug[pc], destKey, by)
|
recordInc(c, c.debug[pc], destKey, by)
|
||||||
of opcNcsAdd:
|
of opcNcsAdd:
|
||||||
let g = c.graph
|
let g = c.graph
|
||||||
let destKey = regs[ra].node.strVal
|
declBC()
|
||||||
let val = regs[instr.regB].node
|
let destKey = regs[rb].node.strVal
|
||||||
|
let val = regs[rc].node
|
||||||
if not contains(g.cacheSeqs, destKey):
|
if not contains(g.cacheSeqs, destKey):
|
||||||
g.cacheSeqs[destKey] = newTree(nkStmtList, val)
|
g.cacheSeqs[destKey] = newTree(nkStmtList, val)
|
||||||
# newNodeI(nkStmtList, c.debug[pc])
|
|
||||||
else:
|
else:
|
||||||
g.cacheSeqs[destKey].add val
|
g.cacheSeqs[destKey].add val
|
||||||
recordAdd(c, c.debug[pc], destKey, val)
|
recordAdd(c, c.debug[pc], destKey, val)
|
||||||
of opcNcsIncl:
|
of opcNcsIncl:
|
||||||
let g = c.graph
|
let g = c.graph
|
||||||
let destKey = regs[ra].node.strVal
|
declBC()
|
||||||
let val = regs[instr.regB].node
|
let destKey = regs[rb].node.strVal
|
||||||
|
let val = regs[rc].node
|
||||||
if not contains(g.cacheSeqs, destKey):
|
if not contains(g.cacheSeqs, destKey):
|
||||||
g.cacheSeqs[destKey] = newTree(nkStmtList, val)
|
g.cacheSeqs[destKey] = newTree(nkStmtList, val)
|
||||||
else:
|
else:
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ Infix
|
||||||
Ident "b"
|
Ident "b"
|
||||||
Ident "cint"
|
Ident "cint"
|
||||||
NilLit
|
NilLit
|
||||||
|
macrocache ok
|
||||||
'''
|
'''
|
||||||
|
|
||||||
output: '''
|
output: '''
|
||||||
|
|
@ -25,7 +26,7 @@ x: some string
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
import macros, sugar
|
import macros, sugar, macrocache
|
||||||
|
|
||||||
|
|
||||||
block tdump:
|
block tdump:
|
||||||
|
|
@ -142,3 +143,54 @@ const cnst1 = bilookups(pairs)
|
||||||
echo cnst1
|
echo cnst1
|
||||||
const cnst2 = bilookups2({"key": "val", "keyB": "2"})
|
const cnst2 = bilookups2({"key": "val", "keyB": "2"})
|
||||||
echo cnst2
|
echo cnst2
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# macrocache #11404
|
||||||
|
const
|
||||||
|
mcTable = CacheTable"nimTest"
|
||||||
|
mcSeq = CacheSeq"nimTest"
|
||||||
|
mcCounter = CacheCounter"nimTest"
|
||||||
|
|
||||||
|
static:
|
||||||
|
doAssert(mcCounter.value == 0) # CacheCounter.value
|
||||||
|
mcCounter.inc # CacheCounter.inc
|
||||||
|
doAssert(mcCounter.value == 1) # CacheCounter.value
|
||||||
|
|
||||||
|
let a = newLit(1)
|
||||||
|
let b = newLit(2)
|
||||||
|
let c = newLit(3)
|
||||||
|
let d = newLit(4)
|
||||||
|
|
||||||
|
mcSeq.add a # CacheSeq.add
|
||||||
|
mcSeq.add b # CacheSeq.add
|
||||||
|
mcSeq.add c # CacheSeq.add
|
||||||
|
|
||||||
|
doAssert(mcSeq.len == 3) # CacheSeq.len
|
||||||
|
#doAssert(c in mcSeq) # CacheSeq.contains
|
||||||
|
#doAssert(d notin mcSeq) # CacheSeq.contains
|
||||||
|
|
||||||
|
mcSeq.incl d # CacheSeq.incl
|
||||||
|
doAssert(mcSeq.len == 4) # CacheSeq.len
|
||||||
|
|
||||||
|
mcSeq.incl c # CacheSeq.incl
|
||||||
|
doAssert(mcSeq.len == 4) # CacheSeq.len
|
||||||
|
|
||||||
|
doAssert(mcSeq[3] == d) # CacheSeq.[]
|
||||||
|
|
||||||
|
#doAssert(mcSeq.pop() == d)# CacheSeq.pop
|
||||||
|
#doAssert(mcSeq.len == 3) # CacheSeq.len
|
||||||
|
|
||||||
|
doAssert(mcTable.len == 0) # CacheTable.len
|
||||||
|
mcTable["a"] = a # CacheTable.[]=
|
||||||
|
doAssert(mcTable.len == 1) # CacheTable.len
|
||||||
|
|
||||||
|
doAssert(mcTable["a"] == a) # CacheTable.[]
|
||||||
|
#doAssert("a" in mcTable) # CacheTable.contains
|
||||||
|
#doAssert(mcTable.hasKey("a"))# CacheTable.hasKey
|
||||||
|
|
||||||
|
for k, v in mcTable: # CacheTable.items
|
||||||
|
doAssert(k == "a")
|
||||||
|
doAssert(v == a)
|
||||||
|
|
||||||
|
echo "macrocache ok"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue