fix macrocache implementation (#11404)

* macrocache improvements

* fix macrocache implementation
This commit is contained in:
andri lim
2019-06-05 19:56:45 +07:00
committed by Andreas Rumpf
parent efbf43d4a9
commit c16a753822
2 changed files with 62 additions and 8 deletions

View File

@@ -1786,25 +1786,27 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg =
regs[ra].intVal = getOrDefault(c.graph.cacheCounters, destKey)
of opcNccInc:
let g = c.graph
let destKey = regs[ra].node.strVal
let by = regs[instr.regB].intVal
declBC()
let destKey = regs[rb].node.strVal
let by = regs[rc].intVal
let v = getOrDefault(g.cacheCounters, destKey)
g.cacheCounters[destKey] = v+by
recordInc(c, c.debug[pc], destKey, by)
of opcNcsAdd:
let g = c.graph
let destKey = regs[ra].node.strVal
let val = regs[instr.regB].node
declBC()
let destKey = regs[rb].node.strVal
let val = regs[rc].node
if not contains(g.cacheSeqs, destKey):
g.cacheSeqs[destKey] = newTree(nkStmtList, val)
# newNodeI(nkStmtList, c.debug[pc])
else:
g.cacheSeqs[destKey].add val
recordAdd(c, c.debug[pc], destKey, val)
of opcNcsIncl:
let g = c.graph
let destKey = regs[ra].node.strVal
let val = regs[instr.regB].node
declBC()
let destKey = regs[rb].node.strVal
let val = regs[rc].node
if not contains(g.cacheSeqs, destKey):
g.cacheSeqs[destKey] = newTree(nkStmtList, val)
else:

View File

@@ -9,6 +9,7 @@ Infix
Ident "b"
Ident "cint"
NilLit
macrocache ok
'''
output: '''
@@ -25,7 +26,7 @@ x: some string
"""
import macros, sugar
import macros, sugar, macrocache
block tdump:
@@ -142,3 +143,54 @@ const cnst1 = bilookups(pairs)
echo cnst1
const cnst2 = bilookups2({"key": "val", "keyB": "2"})
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"