From 9f519f1665d80673abe16af77d79bedd104d6e79 Mon Sep 17 00:00:00 2001 From: Rod Vagg Date: Tue, 25 Apr 2023 10:56:48 +1000 Subject: [PATCH] fix: remove _skipAbsent labels --- node/bindnode/repr.go | 78 ++++++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 38 deletions(-) diff --git a/node/bindnode/repr.go b/node/bindnode/repr.go index cc351328..b724f2f5 100644 --- a/node/bindnode/repr.go +++ b/node/bindnode/repr.go @@ -344,16 +344,16 @@ type _tupleIteratorRepr struct { } func (w *_tupleIteratorRepr) Next() (index int64, value datamodel.Node, _ error) { -_skipAbsent: - idx := w.nextIndex - _, value, err := (*_structIterator)(w).Next() - if err != nil { - return 0, nil, err - } - if w.nextIndex > w.reprEnd { - goto _skipAbsent + for { + idx := w.nextIndex + _, value, err := (*_structIterator)(w).Next() + if err != nil { + return 0, nil, err + } + if w.nextIndex <= w.reprEnd { + return int64(idx), reprNode(value), nil + } } - return int64(idx), reprNode(value), nil } func (w *_tupleIteratorRepr) Done() bool { @@ -372,23 +372,24 @@ type _listpairsIteratorRepr struct { } func (w *_listpairsIteratorRepr) Next() (index int64, value datamodel.Node, _ error) { -_skipAbsent: - if w.Done() { - return 0, nil, datamodel.ErrIteratorOverread{} - } - idx := w.nextIndex - key, value, err := (*_structIterator)(w).Next() - if err != nil { - return 0, nil, err - } - if value.IsAbsent() || w.nextIndex > w.reprEnd { - goto _skipAbsent - } - field, err := buildListpairsField(key, value) - if err != nil { - return 0, nil, err + for { + if w.Done() { + return 0, nil, datamodel.ErrIteratorOverread{} + } + idx := w.nextIndex + key, value, err := (*_structIterator)(w).Next() + if err != nil { + return 0, nil, err + } + if value.IsAbsent() || w.nextIndex > w.reprEnd { + continue + } + field, err := buildListpairsField(key, value) + if err != nil { + return 0, nil, err + } + return int64(idx), field, nil } - return int64(idx), field, nil } func (w *_listpairsIteratorRepr) Done() bool { @@ -1257,20 +1258,21 @@ type _structIteratorRepr _structIterator func (w *_structIteratorRepr) Next() (key, value datamodel.Node, _ error) { switch stg := reprStrategy(w.schemaType).(type) { case schema.StructRepresentation_Map: - _skipAbsent: - key, value, err := (*_structIterator)(w).Next() - if err != nil { - return nil, nil, err - } - if value.IsAbsent() { - goto _skipAbsent - } - keyStr, _ := key.AsString() - mappedKey := outboundMappedKey(stg, keyStr) - if mappedKey != keyStr { - key = basicnode.NewString(mappedKey) + for { + key, value, err := (*_structIterator)(w).Next() + if err != nil { + return nil, nil, err + } + if value.IsAbsent() { + continue + } + keyStr, _ := key.AsString() + mappedKey := outboundMappedKey(stg, keyStr) + if mappedKey != keyStr { + key = basicnode.NewString(mappedKey) + } + return key, reprNode(value), nil } - return key, reprNode(value), nil default: return nil, nil, fmt.Errorf("bindnode Next TODO: %T", stg) }