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>
This commit is contained in:
parent
eed1b6df20
commit
ea0e45e62f
8 changed files with 550 additions and 162 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -1189,11 +1189,8 @@ proc genMagic(c: PCtx; n: PNode; dest: var TDest; m: TMagic) =
|
|||
d2 = c.genx(d2AsNode)
|
||||
var
|
||||
tmp1 = c.genx(n[1])
|
||||
tmp3 = c.genx(n[3])
|
||||
c.gABC(n, opcParseFloat, dest, tmp1, d2)
|
||||
c.gABC(n, opcParseFloat, tmp3)
|
||||
c.freeTemp(tmp1)
|
||||
c.freeTemp(tmp3)
|
||||
c.genAsgnPatch(d2AsNode, d2)
|
||||
c.freeTemp(d2)
|
||||
of mReset:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue