diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2016-05-28 17:14:52 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2016-05-28 17:14:52 +0200 |
commit | d3fe4a2db15355f5830395a6f68ff8ec1c8a7a88 (patch) | |
tree | 4145531b00b51a9c121934b5d44c3e8569927491 /compiler/vm.nim | |
parent | 0b84ee167b766ef3ecb2ba6374e32725ea1b2794 (diff) | |
parent | 0356f53b5619782c650f56a6842cbaf91a82137d (diff) | |
download | Nim-d3fe4a2db15355f5830395a6f68ff8ec1c8a7a88.tar.gz |
Merge pull request #4113 from jcosborn/gettypeinst
getTypeInst
Diffstat (limited to 'compiler/vm.nim')
-rw-r--r-- | compiler/vm.nim | 40 |
1 files changed, 28 insertions, 12 deletions
diff --git a/compiler/vm.nim b/compiler/vm.nim index f799334d6..cddb57f17 100644 --- a/compiler/vm.nim +++ b/compiler/vm.nim @@ -1185,19 +1185,35 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg = of opcNGetType: let rb = instr.regB let rc = instr.regC - if rc == 0: - ensureKind(rkNode) - if regs[rb].kind == rkNode and regs[rb].node.typ != nil: - regs[ra].node = opMapTypeToAst(regs[rb].node.typ, c.debug[pc]) + case rc: + of 0: + # getType opcode: + ensureKind(rkNode) + if regs[rb].kind == rkNode and regs[rb].node.typ != nil: + regs[ra].node = opMapTypeToAst(regs[rb].node.typ, c.debug[pc]) + else: + stackTrace(c, tos, pc, errGenerated, "node has no type") + of 1: + # typeKind opcode: + ensureKind(rkInt) + if regs[rb].kind == rkNode and regs[rb].node.typ != nil: + regs[ra].intVal = ord(regs[rb].node.typ.kind) + #else: + # stackTrace(c, tos, pc, errGenerated, "node has no type") + of 2: + # getTypeInst opcode: + ensureKind(rkNode) + if regs[rb].kind == rkNode and regs[rb].node.typ != nil: + regs[ra].node = opMapTypeInstToAst(regs[rb].node.typ, c.debug[pc]) + else: + stackTrace(c, tos, pc, errGenerated, "node has no type") else: - stackTrace(c, tos, pc, errGenerated, "node has no type") - else: - # typeKind opcode: - ensureKind(rkInt) - if regs[rb].kind == rkNode and regs[rb].node.typ != nil: - regs[ra].intVal = ord(regs[rb].node.typ.kind) - #else: - # stackTrace(c, tos, pc, errGenerated, "node has no type") + # getTypeImpl opcode: + ensureKind(rkNode) + if regs[rb].kind == rkNode and regs[rb].node.typ != nil: + regs[ra].node = opMapTypeImplToAst(regs[rb].node.typ, c.debug[pc]) + else: + stackTrace(c, tos, pc, errGenerated, "node has no type") of opcNStrVal: decodeB(rkNode) createStr regs[ra] |