From 46b1933afff6ae804ca45431bd8d1dd26d9223b5 Mon Sep 17 00:00:00 2001 From: Mark Spanbroek Date: Thu, 2 Dec 2021 11:13:50 +0100 Subject: [PATCH] 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. --- contractabi/decoding.nim | 60 +++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 34 deletions(-) diff --git a/contractabi/decoding.nim b/contractabi/decoding.nim index 18c5697..0219737 100644 --- a/contractabi/decoding.nim +++ b/contractabi/decoding.nim @@ -15,7 +15,6 @@ type Tuple = object start: int index: int - dynamic: bool Padding = enum padLeft, padRight @@ -23,11 +22,11 @@ type func read*(decoder: var AbiDecoder, T: type): ?!T -func init(_: type Tuple, offset: int, dynamic: bool): Tuple = - Tuple(start: offset, index: offset, dynamic: dynamic) +func init(_: type Tuple, offset: int): Tuple = + Tuple(start: offset, index: offset) 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 = decoder.stack[^1] @@ -105,42 +104,22 @@ func decode[I](decoder: var AbiDecoder, T: type array[I, byte]): ?!T = arr[0.. 1, "unable to finish a tuple that hasn't started" 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 = - const dynamic = AbiEncoder.isDynamic(T) var tupl: T - ?decoder.startTuple(dynamic) + ?decoder.startTuple() for element in tupl.fields: element = ?decoder.read(typeof(element)) decoder.finishTuple() @@ -157,7 +136,7 @@ func finish(decoder: var AbiDecoder): ?!void = func decode[T](decoder: var AbiDecoder, _: type seq[T]): ?!seq[T] = var sequence: seq[T] let len = ?decoder.read(uint64) - ?decoder.startTuple(dynamic=true) + ?decoder.startTuple() for _ in 0.. 1: + decoder.readTail(T) + else: + decoder.decode(T)