summary refs log tree commit diff stats
path: root/compiler
diff options
context:
space:
mode:
authorTimothee Cour <timothee.cour2@gmail.com>2021-01-11 01:16:20 -0800
committerGitHub <noreply@github.com>2021-01-11 10:16:20 +0100
commitf6c2450cdb7e24b5dbd118494560cc8452dd3688 (patch)
tree9c4f53378d6f32eb7e7485d3772ad21262144f1a /compiler
parent0286a0879bc44e5267a5fd36e6f4aac8f78713ea (diff)
downloadNim-f6c2450cdb7e24b5dbd118494560cc8452dd3688.tar.gz
fix #16555, fixes #16405: len, high honors '\0' for cstring in vm (#16610)
Diffstat (limited to 'compiler')
-rw-r--r--compiler/vm.nim4
-rw-r--r--compiler/vmdef.nim1
-rw-r--r--compiler/vmgen.nim12
3 files changed, 12 insertions, 5 deletions
diff --git a/compiler/vm.nim b/compiler/vm.nim
index 0f75faee3..b8df456e0 100644
--- a/compiler/vm.nim
+++ b/compiler/vm.nim
@@ -872,6 +872,10 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg =
       decodeBImm(rkInt)
       assert regs[rb].kind == rkNode
       regs[ra].intVal = regs[rb].node.strVal.len - imm
+    of opcLenCstring:
+      decodeBImm(rkInt)
+      assert regs[rb].kind == rkNode
+      regs[ra].intVal = regs[rb].node.strVal.cstring.len - imm
     of opcIncl:
       decodeB(rkNode)
       let b = regs[rb].regToNode
diff --git a/compiler/vmdef.nim b/compiler/vmdef.nim
index 6d6c55250..eab18f417 100644
--- a/compiler/vmdef.nim
+++ b/compiler/vmdef.nim
@@ -86,6 +86,7 @@ type
     opcSubImmInt,
     opcLenSeq,
     opcLenStr,
+    opcLenCstring,
 
     opcIncl, opcInclRange, opcExcl, opcCard, opcMulInt, opcDivInt, opcModInt,
     opcAddFloat, opcSubFloat, opcMulFloat, opcDivFloat,
diff --git a/compiler/vmgen.nim b/compiler/vmgen.nim
index 46931eb54..6790276a9 100644
--- a/compiler/vmgen.nim
+++ b/compiler/vmgen.nim
@@ -1034,7 +1034,10 @@ proc genMagic(c: PCtx; n: PNode; dest: var TDest; m: TMagic) =
   of mLengthOpenArray, mLengthArray, mLengthSeq:
     genUnaryABI(c, n, dest, opcLenSeq)
   of mLengthStr:
-    genUnaryABI(c, n, dest, opcLenStr)
+    case n[1].typ.kind
+    of tyString: genUnaryABI(c, n, dest, opcLenStr)
+    of tyCString: genUnaryABI(c, n, dest, opcLenCstring)
+    else: doAssert false, $n[1].typ.kind
   of mIncl, mExcl:
     unused(c, n, dest)
     var d = c.genx(n[1])
@@ -1178,10 +1181,9 @@ proc genMagic(c: PCtx; n: PNode; dest: var TDest; m: TMagic) =
     if dest < 0: dest = c.getTemp(n.typ)
     let tmp = c.genx(n[1])
     case n[1].typ.skipTypes(abstractVar-{tyTypeDesc}).kind:
-    of tyString, tyCString:
-      c.gABI(n, opcLenStr, dest, tmp, 1)
-    else:
-      c.gABI(n, opcLenSeq, dest, tmp, 1)
+    of tyString: c.gABI(n, opcLenStr, dest, tmp, 1)
+    of tyCString: c.gABI(n, opcLenCstring, dest, tmp, 1)
+    else: c.gABI(n, opcLenSeq, dest, tmp, 1)
     c.freeTemp(tmp)
   of mEcho:
     unused(c, n, dest)