fixes #15939, fixes #15464, fixes #16169, fixes #16226 VM now supports addr(mystring[ind]) (index + index assignment) (#15987)
* fix #15939, fix #15464 VM now supports `addr(mystring[ind])` (index + index assignment), var char return etc * cleanups * cstring tests * add test for bug #15464 * improve test coverage
This commit is contained in:
parent
b1554cfeb5
commit
c731f7ab14
5 changed files with 94 additions and 5 deletions
|
|
@ -20,6 +20,7 @@ import
|
|||
|
||||
from semfold import leValueConv, ordinalValToString
|
||||
from evaltempl import evalTemplate
|
||||
from magicsys import getSysType
|
||||
|
||||
const
|
||||
traceCode = defined(nimVMDebug)
|
||||
|
|
@ -123,7 +124,7 @@ proc derefPtrToReg(address: BiggestInt, typ: PType, r: var TFullReg, isAssign: b
|
|||
else:
|
||||
r.ensureKind(rkind)
|
||||
let val = cast[ptr T](address)[]
|
||||
when T is SomeInteger:
|
||||
when T is SomeInteger | char:
|
||||
r.field = BiggestInt(val)
|
||||
else:
|
||||
r.field = val
|
||||
|
|
@ -131,6 +132,7 @@ proc derefPtrToReg(address: BiggestInt, typ: PType, r: var TFullReg, isAssign: b
|
|||
|
||||
## see also typeinfo.getBiggestInt
|
||||
case typ.kind
|
||||
of tyChar: fun(intVal, char, rkInt)
|
||||
of tyInt: fun(intVal, int, rkInt)
|
||||
of tyInt8: fun(intVal, int8, rkInt)
|
||||
of tyInt16: fun(intVal, int16, rkInt)
|
||||
|
|
@ -677,6 +679,23 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg =
|
|||
regs[ra].intVal = s[idx].ord
|
||||
else:
|
||||
stackTrace(c, tos, pc, formatErrorIndexBound(idx, s.len-1))
|
||||
of opcLdStrIdxAddr:
|
||||
# a = addr(b[c]); similar to opcLdArrAddr
|
||||
decodeBC(rkNode)
|
||||
if regs[rc].intVal > high(int):
|
||||
stackTrace(c, tos, pc, formatErrorIndexBound(regs[rc].intVal, high(int)))
|
||||
let idx = regs[rc].intVal.int
|
||||
let s = regs[rb].node.strVal.addr # or `byaddr`
|
||||
if idx <% s[].len:
|
||||
# `makePtrType` not accessible from vm.nim
|
||||
let typ = newType(tyPtr, nextId c.idgen, c.module.owner)
|
||||
typ.add getSysType(c.graph, c.debug[pc], tyChar)
|
||||
let node = newNodeIT(nkIntLit, c.debug[pc], typ) # xxx nkPtrLit
|
||||
node.intVal = cast[int](s[][idx].addr)
|
||||
node.flags.incl nfIsPtr
|
||||
regs[ra].node = node
|
||||
else:
|
||||
stackTrace(c, tos, pc, formatErrorIndexBound(idx, s[].len-1))
|
||||
of opcWrArr:
|
||||
# a[b] = c
|
||||
decodeBC(rkNode)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue