aboutsummaryrefslogtreecommitdiffstats
path: root/ccl.go
diff options
context:
space:
mode:
authorRose Hogenson <rosehogenson@posteo.net>2025-10-30 18:45:11 -0700
committerRose Hogenson <rosehogenson@posteo.net>2025-10-30 18:50:19 -0700
commitaa8a935f620a053cc9c3c65587b433f3e8d3a6e9 (patch)
treea786b3174c1a901f19fc10485c4856d60ef93d6b /ccl.go
parentDon't allocate an intermediate map[string]any (diff)
downloadccl-aa8a935f620a053cc9c3c65587b433f3e8d3a6e9.tar.zst
Use a classic struct iterator instead of iter.Pull
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%
Diffstat (limited to 'ccl.go')
-rw-r--r--ccl.go13
1 files changed, 3 insertions, 10 deletions
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())
}