mirror of
https://github.com/status-im/nim-contract-abi.git
synced 2025-02-21 15:08:13 +00:00
Move index field from AbiDecoder into Tuple
Fixes faiing decoding test.
This commit is contained in:
parent
243b9a12e9
commit
78b87cd138
@ -9,30 +9,39 @@ push: {.upraises:[].}
|
|||||||
type
|
type
|
||||||
AbiDecoder* = object
|
AbiDecoder* = object
|
||||||
bytes: seq[byte]
|
bytes: seq[byte]
|
||||||
index: int
|
|
||||||
stack: seq[Tuple]
|
stack: seq[Tuple]
|
||||||
|
last: int
|
||||||
Tuple = object
|
Tuple = object
|
||||||
start: int
|
start: int
|
||||||
finish: int
|
index: int
|
||||||
dynamic: bool
|
dynamic: bool
|
||||||
Padding = enum
|
Padding = enum
|
||||||
padLeft,
|
padLeft,
|
||||||
padRight
|
padRight
|
||||||
UInt = SomeUnsignedInt | StUint
|
UInt = SomeUnsignedInt | StUint
|
||||||
|
|
||||||
|
func init(_: type Tuple, offset: int, dynamic: bool): Tuple =
|
||||||
|
Tuple(start: offset, index: offset, dynamic: dynamic)
|
||||||
|
|
||||||
func init*(_: type AbiDecoder, bytes: seq[byte], offset=0): AbiDecoder =
|
func init*(_: type AbiDecoder, bytes: seq[byte], offset=0): AbiDecoder =
|
||||||
AbiDecoder(bytes: bytes, index: offset, stack: @[Tuple()])
|
AbiDecoder(bytes: bytes, stack: @[Tuple.init(offset, dynamic=false)])
|
||||||
|
|
||||||
func currentTuple(decoder: var AbiDecoder): var Tuple =
|
func currentTuple(decoder: var AbiDecoder): var Tuple =
|
||||||
decoder.stack[^1]
|
decoder.stack[^1]
|
||||||
|
|
||||||
func updateFinish(decoder: var AbiDecoder, index: int) =
|
func index(decoder: var AbiDecoder): var int =
|
||||||
if index > decoder.currentTuple.finish:
|
decoder.currentTuple.index
|
||||||
decoder.currentTuple.finish = index
|
|
||||||
|
func `index=`(decoder: var AbiDecoder, value: int) =
|
||||||
|
decoder.currentTuple.index = value
|
||||||
|
|
||||||
|
func updateLast(decoder: var AbiDecoder, index: int) =
|
||||||
|
if index > decoder.last:
|
||||||
|
decoder.last = index
|
||||||
|
|
||||||
func advance(decoder: var AbiDecoder, amount: int) =
|
func advance(decoder: var AbiDecoder, amount: int) =
|
||||||
decoder.index += amount
|
decoder.index += amount
|
||||||
decoder.updateFinish(decoder.index)
|
decoder.updateLast(decoder.index)
|
||||||
|
|
||||||
func read(decoder: var AbiDecoder, amount: int, padding = padLeft): seq[byte] =
|
func read(decoder: var AbiDecoder, amount: int, padding = padLeft): seq[byte] =
|
||||||
let padlen = (32 - amount mod 32) mod 32
|
let padlen = (32 - amount mod 32) mod 32
|
||||||
@ -66,15 +75,14 @@ func readTail(decoder: var AbiDecoder, T: type seq[byte]): T =
|
|||||||
let offset = decoder.readOffset()
|
let offset = decoder.readOffset()
|
||||||
var tailDecoder = AbiDecoder.init(decoder.bytes, offset)
|
var tailDecoder = AbiDecoder.init(decoder.bytes, offset)
|
||||||
result = tailDecoder.read(T)
|
result = tailDecoder.read(T)
|
||||||
decoder.updateFinish(tailDecoder.index)
|
decoder.updateLast(tailDecoder.index)
|
||||||
|
|
||||||
func decode*(decoder: var AbiDecoder, T: type seq[byte]): T =
|
func decode*(decoder: var AbiDecoder, T: type seq[byte]): T =
|
||||||
if decoder.currentTuple.dynamic:
|
if decoder.currentTuple.dynamic:
|
||||||
decoder.readTail(T)
|
decoder.readTail(T)
|
||||||
else:
|
else:
|
||||||
let len = decoder.read(uint64).int
|
let len = decoder.read(uint64).int
|
||||||
let bytes = decoder.read(len, padRight)
|
decoder.read(len, padRight)
|
||||||
bytes
|
|
||||||
|
|
||||||
func startTuple*(decoder: var AbiDecoder, dynamic: bool) =
|
func startTuple*(decoder: var AbiDecoder, dynamic: bool) =
|
||||||
var start: int
|
var start: int
|
||||||
@ -82,19 +90,18 @@ func startTuple*(decoder: var AbiDecoder, dynamic: bool) =
|
|||||||
start = decoder.readOffset()
|
start = decoder.readOffset()
|
||||||
else:
|
else:
|
||||||
start = decoder.index
|
start = decoder.index
|
||||||
decoder.stack.add(Tuple(start: start, finish: start, dynamic: dynamic))
|
decoder.stack.add(Tuple.init(start, dynamic))
|
||||||
decoder.index = decoder.currentTuple.start
|
|
||||||
|
|
||||||
func finishTuple*(decoder: var AbiDecoder) =
|
func finishTuple*(decoder: var AbiDecoder) =
|
||||||
doAssert decoder.stack.len > 1, "unable to finish a tuple that hasn't started"
|
doAssert decoder.stack.len > 1, "unable to finish a tuple that hasn't started"
|
||||||
let tupl = decoder.stack.pop()
|
let tupl = decoder.stack.pop()
|
||||||
decoder.updateFinish(tupl.finish)
|
if not tupl.dynamic:
|
||||||
decoder.index = tupl.finish
|
decoder.index = tupl.index
|
||||||
|
|
||||||
func finish*(decoder: var AbiDecoder) =
|
func finish*(decoder: var AbiDecoder) =
|
||||||
doAssert decoder.stack.len == 1, "not all tuples were finished"
|
doAssert decoder.stack.len == 1, "not all tuples were finished"
|
||||||
doAssert decoder.index == decoder.bytes.len, "unread trailing bytes found"
|
doAssert decoder.last == decoder.bytes.len, "unread trailing bytes found"
|
||||||
doAssert decoder.index mod 32 == 0, "encoding variant broken"
|
doAssert decoder.last mod 32 == 0, "encoding variant broken"
|
||||||
|
|
||||||
func decode*[T](decoder: var AbiDecoder, _: type seq[T]): seq[T] =
|
func decode*[T](decoder: var AbiDecoder, _: type seq[T]): seq[T] =
|
||||||
let len = decoder.read(uint64)
|
let len = decoder.read(uint64)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user