diff options
author | Jason Beetham <beefers331@gmail.com> | 2022-10-24 12:50:54 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-24 14:50:54 -0400 |
commit | ea0e45e62f0f8dde71698c2b5d4468385374be94 (patch) | |
tree | 09ea816bb3405668596b212f0fc0a0eb8ce5fab7 /compiler/vm.nim | |
parent | eed1b6df20db6f73825eefaab6d7626acdf3a6af (diff) | |
download | Nim-ea0e45e62f0f8dde71698c2b5d4468385374be94.tar.gz |
Added 'openArray[char]' overloads to 'std/parseutils' (#20527)
* Added 'openarray[char]' overloads to 'std/parseutils' * Removed redundant `start` and `last` params from slice using procs * Fixed type for parseIdent overload * fixed one by off with 'substr' * removed missed start parameters for procedures * Added 'openarray[char]' overloads to 'std/parseutils' * Removed redundant `start` and `last` params from slice using procs * Fixed type for parseIdent overload * fixed one by off with 'substr' * removed missed start parameters for procedures * Fixed VM op to work with new 'opcSlice' * Corrected captureBetween's logic to work with openarray * js sys's parsefloat logic now uses openarray Co-authored-by: Clay Sweetser <Varriount@users.noreply.github.com>
Diffstat (limited to 'compiler/vm.nim')
-rw-r--r-- | compiler/vm.nim | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/compiler/vm.nim b/compiler/vm.nim index a8d256b72..865ee1ea6 100644 --- a/compiler/vm.nim +++ b/compiler/vm.nim @@ -1308,15 +1308,32 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg = regs[ra].intVal = ord(inSet(regs[rb].node, regs[rc].regToNode)) of opcParseFloat: decodeBC(rkInt) - inc pc - assert c.code[pc].opcode == opcParseFloat - let rd = c.code[pc].regA var rcAddr = addr(regs[rc]) if rcAddr.kind == rkRegisterAddr: rcAddr = rcAddr.regAddr elif regs[rc].kind != rkFloat: regs[rc] = TFullReg(kind: rkFloat) - regs[ra].intVal = parseBiggestFloat(regs[rb].node.strVal, - rcAddr.floatVal, regs[rd].intVal.int) + + let coll = regs[rb].node + + case coll.kind + of nkTupleConstr: + let + data = coll[0] + left = coll[1].intVal + right = coll[2].intVal + case data.kind + of nkStrKinds: + regs[ra].intVal = parseBiggestFloat(data.strVal.toOpenArray(int left, int right), rcAddr.floatVal) + of nkBracket: + var s = newStringOfCap(right - left + 1) + for i in left..right: + s.add char data[int i].intVal + regs[ra].intVal = parseBiggestFloat(s, rcAddr.floatVal) + else: + internalError(c.config, c.debug[pc], "opcParseFloat: Incorrectly created openarray") + else: + regs[ra].intVal = parseBiggestFloat(regs[ra].node.strVal, rcAddr.floatVal) + of opcRangeChck: let rb = instr.regB let rc = instr.regC |