From aa8a935f620a053cc9c3c65587b433f3e8d3a6e9 Mon Sep 17 00:00:00 2001 From: Rose Hogenson Date: Thu, 30 Oct 2025 18:45:11 -0700 Subject: Use a classic struct iterator instead of iter.Pull MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit iter.Pull doesn't provide much value here. Actually the lexer is probably simpler this way, and iter.Pull also destroys stack traces for panics in the lexer. Ouch goos: linux goarch: amd64 pkg: roseh.moe/pkg/ccl cpu: AMD Ryzen 9 5900X 12-Core Processor │ baseline.txt │ itern't.txt │ │ sec/op │ sec/op vs base │ Lex-24 1.436µ ± 0% 1.320µ ± 0% -8.05% (p=0.000 n=20) Parse-24 7.846µ ± 0% 4.801µ ± 0% -38.82% (p=0.000 n=20) geomean 3.356µ 2.517µ -24.99% --- ccl.go | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) (limited to 'ccl.go') diff --git a/ccl.go b/ccl.go index 3a444c1..6d97152 100644 --- a/ccl.go +++ b/ccl.go @@ -164,7 +164,6 @@ import ( "encoding/base64" "errors" "fmt" - "iter" "math" "reflect" "strconv" @@ -243,7 +242,7 @@ func fieldMap(out map[structField]int, types map[reflect.Type]bool, s reflect.Ty } type parser struct { - nextTok func() (token, error, bool) + nextTok func() (token, error) tok []byte err error data []byte @@ -261,11 +260,7 @@ func (p *parser) peek() ([]byte, error) { if p.err != nil || p.tok != nil { return p.tok, p.err } - tok, err, ok := p.nextTok() - if !ok { - p.err = errEOF - return nil, p.err - } + tok, err := p.nextTok() if err != nil { p.err = err return nil, p.err @@ -747,7 +742,5 @@ func Unmarshal(data []byte, v any) error { if err := fieldMap(fields, make(map[reflect.Type]bool), val.Type().Elem()); err != nil { return err } - nextToken, stop := iter.Pull2(tokens(data)) - defer stop() - return (&parser{nextTok: nextToken, data: data, fieldMap: fields}).parse(val.Elem()) + return (&parser{nextTok: newLexer(data).next, data: data, fieldMap: fields}).parse(val.Elem()) } -- cgit v1.3.1