diff options
author | Araq <rumpf_a@web.de> | 2019-11-28 10:47:20 +0100 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2019-11-28 23:00:34 +0100 |
commit | 0996eb174fdafc2980d21149dae5b5a7c5889dff (patch) | |
tree | 05f8c484c8a423ea1c0c885980a99f3f58ba9d13 | |
parent | 87f0d534d6da2e8a7dc390e47ba60ca4d8bfb759 (diff) | |
download | Nim-0996eb174fdafc2980d21149dae5b5a7c5889dff.tar.gz |
fixes #11727 [backport]
-rw-r--r-- | compiler/vm.nim | 6 | ||||
-rw-r--r-- | compiler/vmdef.nim | 2 | ||||
-rw-r--r-- | compiler/vmgen.nim | 9 |
3 files changed, 12 insertions, 5 deletions
diff --git a/compiler/vm.nim b/compiler/vm.nim index 7e2ad692f..e16324355 100644 --- a/compiler/vm.nim +++ b/compiler/vm.nim @@ -280,7 +280,7 @@ type ExceptionGotoUnhandled proc findExceptionHandler(c: PCtx, f: PStackFrame, exc: PNode): - tuple[why: ExceptionGoto, where: int] = + tuple[why: ExceptionGoto, where: int] = let raisedType = exc.typ.skipTypes(abstractPtrs) while f.safePoints.len > 0: @@ -1345,9 +1345,11 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg = of opcQuit: if c.mode in {emRepl, emStaticExpr, emStaticStmt}: message(c.config, c.debug[pc], hintQuitCalled) - msgQuit(int8(toInt(getOrdValue(regs[ra].regToNode)))) + msgQuit(int8(toInt(getOrdValue(regs[ra].regToNode, onError = toInt128(1))))) else: return TFullReg(kind: rkNone) + of opcInvalidField: + stackTrace(c, tos, pc, errFieldXNotFound & regs[ra].node.strVal) of opcSetLenStr: decodeB(rkNode) #createStrKeepNode regs[ra] diff --git a/compiler/vmdef.nim b/compiler/vmdef.nim index 0ba4c2c78..81de277df 100644 --- a/compiler/vmdef.nim +++ b/compiler/vmdef.nim @@ -74,7 +74,7 @@ type opcContainsSet, opcRepr, opcSetLenStr, opcSetLenSeq, opcIsNil, opcOf, opcIs, opcSubStr, opcParseFloat, opcConv, opcCast, - opcQuit, + opcQuit, opcInvalidField, opcNarrowS, opcNarrowU, opcSignExtend, diff --git a/compiler/vmgen.nim b/compiler/vmgen.nim index 18397ec26..f8f4b81dd 100644 --- a/compiler/vmgen.nim +++ b/compiler/vmgen.nim @@ -1719,8 +1719,13 @@ proc genCheckedObjAccessAux(c: PCtx; n: PNode; dest: var TDest; flags: TGenFlags # If the check fails let the user know let lab1 = c.xjmp(n, if negCheck: opcFJmp else: opcTJmp, rs) c.freeTemp(rs) - # Not ideal but will do for the moment - c.gABC(n, opcQuit) + let strType = getSysType(c.graph, n.info, tyString) + var fieldNameRegister: TDest = c.getTemp(strType) + let strLit = newStrNode($accessExpr[1], accessExpr[1].info) + strLit.typ = strType + c.genLit(strLit, fieldNameRegister) + c.gABC(n, opcInvalidField, fieldNameRegister) + c.freeTemp(fieldNameRegister) c.patch(lab1) proc genCheckedObjAccess(c: PCtx; n: PNode; dest: var TDest; flags: TGenFlags) = |