diff options
author | Yuriy Glukhov <yuriy.glukhov@gmail.com> | 2015-09-03 12:51:21 +0300 |
---|---|---|
committer | Yuriy Glukhov <yuriy.glukhov@gmail.com> | 2015-09-05 14:18:37 +0300 |
commit | 04a4f354003457004d7535bf3c71b4c992f0f0ef (patch) | |
tree | 52ea2b07e7b53edadcbba426d301a01fcdab41d6 /compiler/vm.nim | |
parent | 0320c0c73b1065492c036eff09fb1a7b424223cc (diff) | |
download | Nim-04a4f354003457004d7535bf3c71b4c992f0f0ef.tar.gz |
VM produces objects.
Diffstat (limited to 'compiler/vm.nim')
-rw-r--r-- | compiler/vm.nim | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/compiler/vm.nim b/compiler/vm.nim index b7b09f4a3..05d00c19f 100644 --- a/compiler/vm.nim +++ b/compiler/vm.nim @@ -83,7 +83,7 @@ proc stackTrace(c: PCtx, tos: PStackFrame, pc: int, proc bailOut(c: PCtx; tos: PStackFrame) = stackTrace(c, tos, c.exceptionInstr, errUnhandledExceptionX, - c.currentExceptionA.sons[2].strVal) + c.currentExceptionA.sons[3].skipColon.strVal) when not defined(nimComputedGoto): {.pragma: computedGoto.} @@ -383,7 +383,7 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg = let instr = c.code[pc] let ra = instr.regA #if c.traceActive: - # echo "PC ", pc, " ", c.code[pc].opcode, " ra ", ra + #echo "PC ", pc, " ", c.code[pc].opcode, " ra ", ra, " rb ", instr.regB, " rc ", instr.regC # message(c.debug[pc], warnUser, "Trace") case instr.opcode @@ -475,14 +475,19 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg = decodeBC(rkNode) let src = regs[rb].node if src.kind notin {nkEmpty..nkNilLit}: - let n = src.sons[rc].skipColon + let n = src.sons[rc + ord(src.kind == nkObjConstr)].skipColon regs[ra].node = n else: stackTrace(c, tos, pc, errNilAccess) of opcWrObj: # a.b = c decodeBC(rkNode) - putIntoNode(regs[ra].node.sons[rb], regs[rc]) + let shiftedRb = rb + ord(regs[ra].node.kind == nkObjConstr) + let dest = regs[ra].node + if dest.sons[shiftedRb].kind == nkExprColonExpr: + putIntoNode(dest.sons[shiftedRb].sons[1], regs[rc]) + else: + putIntoNode(dest.sons[shiftedRb], regs[rc]) of opcWrStrIdx: decodeBC(rkNode) let idx = regs[rb].intVal.int |