summary refs log tree commit diff stats
path: root/compiler/vm.nim
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/vm.nim')
-rw-r--r--compiler/vm.nim64
1 files changed, 38 insertions, 26 deletions
diff --git a/compiler/vm.nim b/compiler/vm.nim
index 019aa08e8..3e33e8256 100644
--- a/compiler/vm.nim
+++ b/compiler/vm.nim
@@ -1576,86 +1576,98 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg =
     of opcNccValue:
       decodeB(rkInt)
       let destKey = regs[rb].node.strVal
-      regs[ra].intVal = getOrDefault(c.cacheCounters, destKey)
+      regs[ra].intVal = getOrDefault(c.graph.cacheCounters, destKey)
     of opcNccInc:
-      let rb = instr.regB
+      let g = c.graph
       let destKey = regs[ra].node.strVal
-      let by = regs[rb].intVal
-      let v = getOrDefault(c.cacheCounters, destKey)
-      c.cacheCounters[destKey] = v+by
+      let by = regs[instr.regB].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
-      if not contains(c.cacheSeqs, destKey):
-        c.cacheSeqs[destKey] = newTree(nkStmtList, val)
+      if not contains(g.cacheSeqs, destKey):
+        g.cacheSeqs[destKey] = newTree(nkStmtList, val)
         # newNodeI(nkStmtList, c.debug[pc])
       else:
-        c.cacheSeqs[destKey].add val
+        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
-      if not contains(c.cacheSeqs, destKey):
-        c.cacheSeqs[destKey] = newTree(nkStmtList, val)
+      if not contains(g.cacheSeqs, destKey):
+        g.cacheSeqs[destKey] = newTree(nkStmtList, val)
       else:
         block search:
-          for existing in c.cacheSeqs[destKey]:
+          for existing in g.cacheSeqs[destKey]:
             if exprStructuralEquivalent(existing, val, strictSymEquality=true):
               break search
-          c.cacheSeqs[destKey].add val
+          g.cacheSeqs[destKey].add val
       recordIncl(c, c.debug[pc], destKey, val)
     of opcNcsLen:
+      let g = c.graph
       decodeB(rkInt)
       let destKey = regs[rb].node.strVal
       regs[ra].intVal =
-        if contains(c.cacheSeqs, destKey): c.cacheSeqs[destKey].len else: 0
+        if contains(g.cacheSeqs, destKey): g.cacheSeqs[destKey].len else: 0
     of opcNcsAt:
+      let g = c.graph
       decodeBC(rkNode)
       let idx = regs[rc].intVal
       let destKey = regs[rb].node.strVal
-      if contains(c.cacheSeqs, destKey) and idx <% c.cacheSeqs[destKey].len:
-        regs[ra].node = c.cacheSeqs[destKey][idx.int]
+      if contains(g.cacheSeqs, destKey) and idx <% g.cacheSeqs[destKey].len:
+        regs[ra].node = g.cacheSeqs[destKey][idx.int]
       else:
         stackTrace(c, tos, pc, errIndexOutOfBounds)
     of opcNctPut:
+      let g = c.graph
       let destKey = regs[ra].node.strVal
       let key = regs[instr.regB].node.strVal
       let val = regs[instr.regC].node
-      if not contains(c.cacheTables, destKey):
-        c.cacheTables[destKey] = initBTree[string, PNode]()
-      if not contains(c.cacheTables[destKey], key):
-        c.cacheTables[destKey].add(key, val)
+      if not contains(g.cacheTables, destKey):
+        g.cacheTables[destKey] = initBTree[string, PNode]()
+      if not contains(g.cacheTables[destKey], key):
+        g.cacheTables[destKey].add(key, val)
         recordPut(c, c.debug[pc], destKey, key, val)
       else:
         stackTrace(c, tos, pc, "key already exists: " & key)
     of opcNctLen:
+      let g = c.graph
       decodeB(rkInt)
       let destKey = regs[rb].node.strVal
       regs[ra].intVal =
-        if contains(c.cacheTables, destKey): c.cacheTables[destKey].len else: 0
+        if contains(g.cacheTables, destKey): g.cacheTables[destKey].len else: 0
     of opcNctGet:
+      let g = c.graph
       decodeBC(rkNode)
       let destKey = regs[rb].node.strVal
       let key = regs[rc].node.strVal
-      if contains(c.cacheTables, destKey):
-        if contains(c.cacheTables[destKey], key):
-          regs[ra].node = getOrDefault(c.cacheTables[destKey], key)
+      if contains(g.cacheTables, destKey):
+        if contains(g.cacheTables[destKey], key):
+          regs[ra].node = getOrDefault(g.cacheTables[destKey], key)
         else:
           stackTrace(c, tos, pc, "key does not exist: " & key)
       else:
         stackTrace(c, tos, pc, "key does not exist: " & destKey)
     of opcNctHasNext:
+      let g = c.graph
       decodeBC(rkInt)
       let destKey = regs[rb].node.strVal
       regs[ra].intVal =
-        btrees.hasNext(c.cacheTables[destKey], regs[rc].intVal.int) else: 0
+        if g.cacheTables.contains(destKey):
+          ord(btrees.hasNext(g.cacheTables[destKey], regs[rc].intVal.int))
+        else:
+          0
     of opcNctNext:
+      let g = c.graph
       decodeBC(rkNode)
       let destKey = regs[rb].node.strVal
       let index = regs[rc].intVal
-      if contains(c.cacheTables, destKey):
-        let (k, v, nextIndex) = btrees.next(c.cacheTables[destKey], index.int)
+      if contains(g.cacheTables, destKey):
+        let (k, v, nextIndex) = btrees.next(g.cacheTables[destKey], index.int)
         regs[ra].node = newTree(nkTupleConstr, newStrNode(k, c.debug[pc]), v,
                                 newIntNode(nkIntLit, nextIndex))
       else: