mirror of
https://github.com/logos-storage/nim-contract-abi.git
synced 2026-01-07 16:13:06 +00:00
Decoder: tuples do not have an offset, their elements do
No longer read offset when starting dynamic tuple, read it when reading a dynamic element in a tuple. Remove Tuple.dynamic, because it's no longer needed.
This commit is contained in:
parent
f40101100e
commit
46b1933aff
@ -15,7 +15,6 @@ type
|
|||||||
Tuple = object
|
Tuple = object
|
||||||
start: int
|
start: int
|
||||||
index: int
|
index: int
|
||||||
dynamic: bool
|
|
||||||
Padding = enum
|
Padding = enum
|
||||||
padLeft,
|
padLeft,
|
||||||
padRight
|
padRight
|
||||||
@ -23,11 +22,11 @@ type
|
|||||||
|
|
||||||
func read*(decoder: var AbiDecoder, T: type): ?!T
|
func read*(decoder: var AbiDecoder, T: type): ?!T
|
||||||
|
|
||||||
func init(_: type Tuple, offset: int, dynamic: bool): Tuple =
|
func init(_: type Tuple, offset: int): Tuple =
|
||||||
Tuple(start: offset, index: offset, dynamic: dynamic)
|
Tuple(start: offset, index: offset)
|
||||||
|
|
||||||
func init(_: type AbiDecoder, bytes: seq[byte], offset=0): AbiDecoder =
|
func init(_: type AbiDecoder, bytes: seq[byte], offset=0): AbiDecoder =
|
||||||
AbiDecoder(bytes: bytes, stack: @[Tuple.init(offset, dynamic=false)])
|
AbiDecoder(bytes: bytes, stack: @[Tuple.init(offset)])
|
||||||
|
|
||||||
func currentTuple(decoder: var AbiDecoder): var Tuple =
|
func currentTuple(decoder: var AbiDecoder): var Tuple =
|
||||||
decoder.stack[^1]
|
decoder.stack[^1]
|
||||||
@ -105,42 +104,22 @@ func decode[I](decoder: var AbiDecoder, T: type array[I, byte]): ?!T =
|
|||||||
arr[0..<arr.len] = ?decoder.read(arr.len, padRight)
|
arr[0..<arr.len] = ?decoder.read(arr.len, padRight)
|
||||||
success arr
|
success arr
|
||||||
|
|
||||||
func readOffset(decoder: var AbiDecoder): ?!int =
|
|
||||||
let offset = ?decoder.read(uint64)
|
|
||||||
success decoder.currentTuple.start + offset.int
|
|
||||||
|
|
||||||
func readTail(decoder: var AbiDecoder): ?!seq[byte] =
|
|
||||||
let offset = ?decoder.readOffset()
|
|
||||||
var tailDecoder = AbiDecoder.init(decoder.bytes, offset)
|
|
||||||
result = tailDecoder.read(seq[byte])
|
|
||||||
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:
|
let len = ?decoder.read(uint64)
|
||||||
decoder.readTail()
|
decoder.read(len.int, padRight)
|
||||||
else:
|
|
||||||
let len = ?decoder.read(uint64)
|
|
||||||
decoder.read(len.int, padRight)
|
|
||||||
|
|
||||||
func startTuple(decoder: var AbiDecoder, dynamic: bool): ?!void =
|
func startTuple(decoder: var AbiDecoder): ?!void =
|
||||||
var start: int
|
decoder.stack.add(Tuple.init(decoder.index))
|
||||||
if decoder.currentTuple.dynamic and dynamic:
|
|
||||||
start = ?decoder.readOffset()
|
|
||||||
else:
|
|
||||||
start = decoder.index
|
|
||||||
decoder.stack.add(Tuple.init(start, dynamic))
|
|
||||||
success()
|
success()
|
||||||
|
|
||||||
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()
|
||||||
if not tupl.dynamic:
|
decoder.index = tupl.index
|
||||||
decoder.index = tupl.index
|
|
||||||
|
|
||||||
func decode[T: tuple](decoder: var AbiDecoder, _: typedesc[T]): ?!T =
|
func decode[T: tuple](decoder: var AbiDecoder, _: typedesc[T]): ?!T =
|
||||||
const dynamic = AbiEncoder.isDynamic(T)
|
|
||||||
var tupl: T
|
var tupl: T
|
||||||
?decoder.startTuple(dynamic)
|
?decoder.startTuple()
|
||||||
for element in tupl.fields:
|
for element in tupl.fields:
|
||||||
element = ?decoder.read(typeof(element))
|
element = ?decoder.read(typeof(element))
|
||||||
decoder.finishTuple()
|
decoder.finishTuple()
|
||||||
@ -157,7 +136,7 @@ func finish(decoder: var AbiDecoder): ?!void =
|
|||||||
func decode[T](decoder: var AbiDecoder, _: type seq[T]): ?!seq[T] =
|
func decode[T](decoder: var AbiDecoder, _: type seq[T]): ?!seq[T] =
|
||||||
var sequence: seq[T]
|
var sequence: seq[T]
|
||||||
let len = ?decoder.read(uint64)
|
let len = ?decoder.read(uint64)
|
||||||
?decoder.startTuple(dynamic=true)
|
?decoder.startTuple()
|
||||||
for _ in 0..<len:
|
for _ in 0..<len:
|
||||||
sequence.add(?decoder.read(T))
|
sequence.add(?decoder.read(T))
|
||||||
decoder.finishTuple()
|
decoder.finishTuple()
|
||||||
@ -165,8 +144,7 @@ func decode[T](decoder: var AbiDecoder, _: type seq[T]): ?!seq[T] =
|
|||||||
|
|
||||||
func decode[I,T](decoder: var AbiDecoder, _: type array[I,T]): ?!array[I,T] =
|
func decode[I,T](decoder: var AbiDecoder, _: type array[I,T]): ?!array[I,T] =
|
||||||
var arr: array[I, T]
|
var arr: array[I, T]
|
||||||
const dynamic = AbiEncoder.isDynamic(T)
|
?decoder.startTuple()
|
||||||
?decoder.startTuple(dynamic)
|
|
||||||
for i in 0..<arr.len:
|
for i in 0..<arr.len:
|
||||||
arr[i] = ?decoder.read(T)
|
arr[i] = ?decoder.read(T)
|
||||||
decoder.finishTuple()
|
decoder.finishTuple()
|
||||||
@ -181,5 +159,19 @@ func decode*(_: type AbiDecoder, bytes: seq[byte], T: type): ?!T =
|
|||||||
?decoder.finish()
|
?decoder.finish()
|
||||||
success value
|
success value
|
||||||
|
|
||||||
|
func readOffset(decoder: var AbiDecoder): ?!int =
|
||||||
|
let offset = ?decoder.read(uint64)
|
||||||
|
success decoder.currentTuple.start + offset.int
|
||||||
|
|
||||||
|
func readTail*(decoder: var AbiDecoder, T: type): ?!T =
|
||||||
|
let offset = ?decoder.readOffset()
|
||||||
|
var tailDecoder = AbiDecoder.init(decoder.bytes, offset.int)
|
||||||
|
result = tailDecoder.read(T)
|
||||||
|
decoder.updateLast(tailDecoder.last)
|
||||||
|
|
||||||
func read*(decoder: var AbiDecoder, T: type): ?!T =
|
func read*(decoder: var AbiDecoder, T: type): ?!T =
|
||||||
decoder.decode(T)
|
const dynamic = AbiEncoder.isDynamic(typeof(!result))
|
||||||
|
if dynamic and decoder.stack.len > 1:
|
||||||
|
decoder.readTail(T)
|
||||||
|
else:
|
||||||
|
decoder.decode(T)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user