summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2019-11-28 10:47:20 +0100
committerAndreas Rumpf <rumpf_a@web.de>2019-11-28 23:00:34 +0100
commit0996eb174fdafc2980d21149dae5b5a7c5889dff (patch)
tree05f8c484c8a423ea1c0c885980a99f3f58ba9d13
parent87f0d534d6da2e8a7dc390e47ba60ca4d8bfb759 (diff)
downloadNim-0996eb174fdafc2980d21149dae5b5a7c5889dff.tar.gz
fixes #11727 [backport]
-rw-r--r--compiler/vm.nim6
-rw-r--r--compiler/vmdef.nim2
-rw-r--r--compiler/vmgen.nim9
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) =