diff options
author | Luke Shumaker <lukeshu@lukeshu.com> | 2023-02-07 12:18:29 -0700 |
---|---|---|
committer | Luke Shumaker <lukeshu@lukeshu.com> | 2023-02-07 14:05:26 -0700 |
commit | 2b9473f5e8816eeea76b2fdada184532be00d3a2 (patch) | |
tree | 387757b00f02521d1b3824a0e92f7778dbd32440 | |
parent | eab38672b2467810592b61fe5b0067086d3cbd2c (diff) |
internal: Split in to sub-packages
-rw-r--r-- | compat/json/compat_test.go | 14 | ||||
-rw-r--r-- | decode.go | 164 | ||||
-rw-r--r-- | decode_scan.go | 18 | ||||
-rw-r--r-- | decode_scan_test.go | 240 | ||||
-rw-r--r-- | encode_string.go | 26 | ||||
-rw-r--r-- | errors.go | 4 | ||||
-rw-r--r-- | internal/base64dec/base64.go (renamed from internal/base64.go) | 8 | ||||
-rw-r--r-- | internal/base64dec/base64_test.go (renamed from internal/base64_test.go) | 2 | ||||
-rw-r--r-- | internal/base64dec/testdata/fuzz/FuzzBase64Decoder/06e2c9db80a08b67fad7f1a4606dc7419750995a57828aa25ea57fe7099d5c03 (renamed from internal/testdata/fuzz/FuzzBase64Decoder/06e2c9db80a08b67fad7f1a4606dc7419750995a57828aa25ea57fe7099d5c03) | 0 | ||||
-rw-r--r-- | internal/base64dec/testdata/fuzz/FuzzBase64Decoder/24f53a36f8832fec65cac0aa0f3b43ec1c904414fa6d38f6fc288b0bbd69588a (renamed from internal/testdata/fuzz/FuzzBase64Decoder/24f53a36f8832fec65cac0aa0f3b43ec1c904414fa6d38f6fc288b0bbd69588a) | 0 | ||||
-rw-r--r-- | internal/base64dec/testdata/fuzz/FuzzBase64Decoder/2d49311ef22319f70a3590a86b406b9f2565987a4a3b6d7660ddc308b5b2fae2 (renamed from internal/testdata/fuzz/FuzzBase64Decoder/2d49311ef22319f70a3590a86b406b9f2565987a4a3b6d7660ddc308b5b2fae2) | 0 | ||||
-rw-r--r-- | internal/base64dec/testdata/fuzz/FuzzBase64Decoder/356e28f5914a0f16f3cef81330f1d92060be4d694a93dedd654bf48743a7d2bd (renamed from internal/testdata/fuzz/FuzzBase64Decoder/356e28f5914a0f16f3cef81330f1d92060be4d694a93dedd654bf48743a7d2bd) | 0 | ||||
-rw-r--r-- | internal/base64dec/testdata/fuzz/FuzzBase64Decoder/582528ddfad69eb57775199a43e0f9fd5c94bba343ce7bb6724d4ebafe311ed4 (renamed from internal/testdata/fuzz/FuzzBase64Decoder/582528ddfad69eb57775199a43e0f9fd5c94bba343ce7bb6724d4ebafe311ed4) | 0 | ||||
-rw-r--r-- | internal/base64dec/testdata/fuzz/FuzzBase64Decoder/60c81ee499a7f1e151b66b08f0a4ff81edd7cb53d00dce8ee0eaf31683996026 (renamed from internal/testdata/fuzz/FuzzBase64Decoder/60c81ee499a7f1e151b66b08f0a4ff81edd7cb53d00dce8ee0eaf31683996026) | 0 | ||||
-rw-r--r-- | internal/base64dec/testdata/fuzz/FuzzBase64Decoder/66498f377f38b53eebe1ceaa4a53e4de01a04efc02ac9cfda60f9815f80e9b9d (renamed from internal/testdata/fuzz/FuzzBase64Decoder/66498f377f38b53eebe1ceaa4a53e4de01a04efc02ac9cfda60f9815f80e9b9d) | 0 | ||||
-rw-r--r-- | internal/base64dec/testdata/fuzz/FuzzBase64Decoder/731951fe84fa6f3a7f6ee8adaa585d4f6a01f359a04737e51ffc70f16f480b9b (renamed from internal/testdata/fuzz/FuzzBase64Decoder/731951fe84fa6f3a7f6ee8adaa585d4f6a01f359a04737e51ffc70f16f480b9b) | 0 | ||||
-rw-r--r-- | internal/base64dec/testdata/fuzz/FuzzBase64Decoder/7d6367ba84cd18550920b5202cd1269174416ce32769c7f59376e76b7dd3129c (renamed from internal/testdata/fuzz/FuzzBase64Decoder/7d6367ba84cd18550920b5202cd1269174416ce32769c7f59376e76b7dd3129c) | 0 | ||||
-rw-r--r-- | internal/base64dec/testdata/fuzz/FuzzBase64Decoder/8727b16d337d7b8187433233f3a90099024e580a6ba319ea2bf539880c50bd7c (renamed from internal/testdata/fuzz/FuzzBase64Decoder/8727b16d337d7b8187433233f3a90099024e580a6ba319ea2bf539880c50bd7c) | 0 | ||||
-rw-r--r-- | internal/base64dec/testdata/fuzz/FuzzBase64Decoder/9201a772731543760326638b8915f80863feab0ba0108183b3093934bdc0420c (renamed from internal/testdata/fuzz/FuzzBase64Decoder/9201a772731543760326638b8915f80863feab0ba0108183b3093934bdc0420c) | 0 | ||||
-rw-r--r-- | internal/base64dec/testdata/fuzz/FuzzBase64Decoder/92f75f690317ace34aeaae3fe39f5f2ff9830777253ff371c5ef6f403a0f8f0f (renamed from internal/testdata/fuzz/FuzzBase64Decoder/92f75f690317ace34aeaae3fe39f5f2ff9830777253ff371c5ef6f403a0f8f0f) | 0 | ||||
-rw-r--r-- | internal/base64dec/testdata/fuzz/FuzzBase64Decoder/93d6f7bc0d93f998c7b7fe654ff46010d6fa76f0a142c3523c42454f8ad10b07 (renamed from internal/testdata/fuzz/FuzzBase64Decoder/93d6f7bc0d93f998c7b7fe654ff46010d6fa76f0a142c3523c42454f8ad10b07) | 0 | ||||
-rw-r--r-- | internal/base64dec/testdata/fuzz/FuzzBase64Decoder/a7450fd77fc7c53cc5bd136874415dddfff5c586e662f21420caa7a94131a56a (renamed from internal/testdata/fuzz/FuzzBase64Decoder/a7450fd77fc7c53cc5bd136874415dddfff5c586e662f21420caa7a94131a56a) | 0 | ||||
-rw-r--r-- | internal/base64dec/testdata/fuzz/FuzzBase64Decoder/a95d2a0f87501a643d54218d2ad8112204672cc1fb30be297853616788208a5c (renamed from internal/testdata/fuzz/FuzzBase64Decoder/a95d2a0f87501a643d54218d2ad8112204672cc1fb30be297853616788208a5c) | 0 | ||||
-rw-r--r-- | internal/base64dec/testdata/fuzz/FuzzBase64Decoder/beed435aa2fee4819eab217543561dfd8001d4a44f53ceb664aaba86cebfaf21 (renamed from internal/testdata/fuzz/FuzzBase64Decoder/beed435aa2fee4819eab217543561dfd8001d4a44f53ceb664aaba86cebfaf21) | 0 | ||||
-rw-r--r-- | internal/base64dec/testdata/fuzz/FuzzBase64Decoder/c2501043394e49f2477408be5ef9389790e33ed1886073dec445d4cf05bcd4b4 (renamed from internal/testdata/fuzz/FuzzBase64Decoder/c2501043394e49f2477408be5ef9389790e33ed1886073dec445d4cf05bcd4b4) | 0 | ||||
-rw-r--r-- | internal/base64dec/testdata/fuzz/FuzzBase64Decoder/caf81e9797b19c76c1fc4dbf537d4d81f389524539f402d13aa01f93a65ac7e9 (renamed from internal/testdata/fuzz/FuzzBase64Decoder/caf81e9797b19c76c1fc4dbf537d4d81f389524539f402d13aa01f93a65ac7e9) | 0 | ||||
-rw-r--r-- | internal/base64dec/testdata/fuzz/FuzzBase64Decoder/cc90a4a40ae9b3beac70baf6d7821a5a6f3a90cabb033575790be91723593680 (renamed from internal/testdata/fuzz/FuzzBase64Decoder/cc90a4a40ae9b3beac70baf6d7821a5a6f3a90cabb033575790be91723593680) | 0 | ||||
-rw-r--r-- | internal/base64dec/testdata/fuzz/FuzzBase64Decoder/ec72f669d648d8d9b9f75a3b303897c59b11e4bfb7622f25ff251a92f182bc2a (renamed from internal/testdata/fuzz/FuzzBase64Decoder/ec72f669d648d8d9b9f75a3b303897c59b11e4bfb7622f25ff251a92f182bc2a) | 0 | ||||
-rw-r--r-- | internal/base64dec/testdata/fuzz/FuzzBase64Decoder/f34630c44c11bb13d27531927c5c1e65d159b70f39cd161da0dba348c1221ab3 (renamed from internal/testdata/fuzz/FuzzBase64Decoder/f34630c44c11bb13d27531927c5c1e65d159b70f39cd161da0dba348c1221ab3) | 0 | ||||
-rw-r--r-- | internal/base64dec/testdata/fuzz/FuzzBase64Decoder/fd67efb09d433a1351a201281dbf6568628b4135c35c811dd9bce97620a75d43 (renamed from internal/testdata/fuzz/FuzzBase64Decoder/fd67efb09d433a1351a201281dbf6568628b4135c35c811dd9bce97620a75d43) | 0 | ||||
-rw-r--r-- | internal/fastio/allwriter.go (renamed from internal/allwriter.go) | 2 | ||||
-rw-r--r-- | internal/jsonparse/hex.go (renamed from internal/hex.go) | 2 | ||||
-rw-r--r-- | internal/jsonparse/parse.go (renamed from internal/parse.go) | 2 | ||||
-rw-r--r-- | internal/jsonparse/parse_test.go (renamed from internal/parse_test.go) | 2 | ||||
-rw-r--r-- | internal/jsontags/borrowed_tags.go (renamed from internal/borrowed_tags.go) | 2 | ||||
-rw-r--r-- | internal/jsontags/tags.go (renamed from internal/tags.go) | 2 | ||||
-rw-r--r-- | internal/jsontest/jsontest.go (renamed from internal/encode.go) | 2 | ||||
-rw-r--r-- | reencode.go | 95 | ||||
-rw-r--r-- | struct.go | 4 |
39 files changed, 299 insertions, 290 deletions
diff --git a/compat/json/compat_test.go b/compat/json/compat_test.go index feb850b..4b167d1 100644 --- a/compat/json/compat_test.go +++ b/compat/json/compat_test.go @@ -9,10 +9,12 @@ import ( "io" "git.lukeshu.com/go/lowmemjson" - "git.lukeshu.com/go/lowmemjson/internal" + "git.lukeshu.com/go/lowmemjson/internal/jsonparse" + "git.lukeshu.com/go/lowmemjson/internal/jsontags" + "git.lukeshu.com/go/lowmemjson/internal/jsontest" ) -var parseTag = internal.ParseTag +var parseTag = jsontags.ParseTag type scanner = lowmemjson.ReEncoderConfig @@ -21,13 +23,13 @@ func checkValid(in []byte, scan *lowmemjson.ReEncoderConfig) error { } func isValidNumber(s string) bool { - var parser internal.Parser + var parser jsonparse.Parser for _, r := range s { if t, _ := parser.HandleRune(r); !t.IsNumber() { return false } } - if t, _ := parser.HandleEOF(); t == internal.RuneTypeError { + if t, _ := parser.HandleEOF(); t == jsonparse.RuneTypeError { return false } return true @@ -51,9 +53,9 @@ type encodeState struct { } func (es *encodeState) string(str string, _ bool) { - internal.EncodeStringFromString(&es.Buffer, str) + jsontest.EncodeStringFromString(&es.Buffer, str) } func (es *encodeState) stringBytes(str []byte, _ bool) { - internal.EncodeStringFromBytes(&es.Buffer, str) + jsontest.EncodeStringFromBytes(&es.Buffer, str) } @@ -23,7 +23,9 @@ import ( "unicode/utf16" "unicode/utf8" - "git.lukeshu.com/go/lowmemjson/internal" + "git.lukeshu.com/go/lowmemjson/internal/base64dec" + "git.lukeshu.com/go/lowmemjson/internal/fastio" + "git.lukeshu.com/go/lowmemjson/internal/jsonparse" ) // Decodable is the interface implemented by types that can decode a @@ -105,7 +107,7 @@ func NewDecoder(r io.RuneScanner) *Decoder { return &Decoder{ io: runeTypeScanner{ inner: r, - parser: internal.Parser{ + parser: jsonparse.Parser{ MaxDepth: maxNestingDepth, }, }, @@ -145,7 +147,7 @@ func (dec *Decoder) More() bool { dec.io.Reset() _, _, t, e := dec.io.ReadRuneType() _ = dec.io.UnreadRune() // best effort - return e == nil && t != internal.RuneTypeEOF + return e == nil && t != jsonparse.RuneTypeEOF } func (dec *Decoder) posStackPush() { @@ -206,7 +208,7 @@ func (dec *Decoder) DecodeThenEOF(ptr any) (err error) { return err } c, s, t, _ := dec.io.ReadRuneType() - if t != internal.RuneTypeEOF { + if t != jsonparse.RuneTypeEOF { panic("should not happen") } if s > 0 { @@ -274,7 +276,7 @@ func (dec *Decoder) panicType(jTyp string, gTyp reflect.Type, err error) { }) } -func (dec *Decoder) readRune() (rune, internal.RuneType) { +func (dec *Decoder) readRune() (rune, jsonparse.RuneType) { c, _, t, e := dec.io.ReadRuneType() if e != nil { panic(decodeError{ @@ -295,20 +297,20 @@ func (dec *Decoder) unreadRune() { } } -func (dec *Decoder) peekRuneType() internal.RuneType { +func (dec *Decoder) peekRuneType() jsonparse.RuneType { _, t := dec.readRune() dec.unreadRune() return t } -func (dec *Decoder) expectRune(ec rune, et internal.RuneType) { +func (dec *Decoder) expectRune(ec rune, et jsonparse.RuneType) { ac, at := dec.readRune() if ac != ec || at != et { panic("should not happen") } } -func (dec *Decoder) expectRuneType(ec rune, et internal.RuneType, gt reflect.Type) { +func (dec *Decoder) expectRuneType(ec rune, et jsonparse.RuneType, gt reflect.Type) { ac, at := dec.readRune() if ac != ec || at != et { dec.panicType(at.JSONType(), gt, nil) @@ -325,7 +327,7 @@ func (sc *decRuneScanner) ReadRune() (rune, int, error) { return 0, 0, io.EOF } c, s, t, e := sc.dec.io.ReadRuneType() - if t == internal.RuneTypeEOF { + if t == jsonparse.RuneTypeEOF { sc.eof = true sc.dec.io.PopReadBarrier() return 0, 0, io.EOF @@ -412,7 +414,7 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) { dec.panicType(t.JSONType(), reflect.PointerTo(typ), err) } case val.CanAddr() && reflect.PointerTo(typ).Implements(textUnmarshalerType): - if nullOK && dec.peekRuneType() == internal.RuneTypeNullN { + if nullOK && dec.peekRuneType() == jsonparse.RuneTypeNullN { dec.decodeNull() return } @@ -425,13 +427,13 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) { default: switch kind := typ.Kind(); kind { case reflect.Bool: - if nullOK && dec.peekRuneType() == internal.RuneTypeNullN { + if nullOK && dec.peekRuneType() == jsonparse.RuneTypeNullN { dec.decodeNull() return } val.SetBool(dec.decodeBool(typ)) case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - if nullOK && dec.peekRuneType() == internal.RuneTypeNullN { + if nullOK && dec.peekRuneType() == jsonparse.RuneTypeNullN { dec.decodeNull() return } @@ -443,7 +445,7 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) { } val.SetInt(n) case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - if nullOK && dec.peekRuneType() == internal.RuneTypeNullN { + if nullOK && dec.peekRuneType() == jsonparse.RuneTypeNullN { dec.decodeNull() return } @@ -455,7 +457,7 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) { } val.SetUint(n) case reflect.Float32, reflect.Float64: - if nullOK && dec.peekRuneType() == internal.RuneTypeNullN { + if nullOK && dec.peekRuneType() == jsonparse.RuneTypeNullN { dec.decodeNull() return } @@ -467,7 +469,7 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) { } val.SetFloat(n) case reflect.String: - if nullOK && dec.peekRuneType() == internal.RuneTypeNullN { + if nullOK && dec.peekRuneType() == jsonparse.RuneTypeNullN { dec.decodeNull() return } @@ -508,25 +510,25 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) { // in the loop) because the only way it's possible is if there's // an interface in there, which'd break from the loop on its own. // - // ptr.CanSet() || dec.peekRuneType() != internal.RuneTypeNullN + // ptr.CanSet() || dec.peekRuneType() != jsonparse.RuneTypeNullN // // We only need the pointer itself to be settable if we're // decoding null. - if ptr.Elem() != val && (ptr.CanSet() || dec.peekRuneType() != internal.RuneTypeNullN) { + if ptr.Elem() != val && (ptr.CanSet() || dec.peekRuneType() != jsonparse.RuneTypeNullN) { dec.decode(ptr, false) break } } // Couldn't get type information from a pointer; fall back to untyped mode. switch dec.peekRuneType() { - case internal.RuneTypeNullN: + case jsonparse.RuneTypeNullN: dec.decodeNull() val.Set(reflect.Zero(typ)) default: val.Set(reflect.ValueOf(dec.decodeAny())) } case reflect.Struct: - if nullOK && dec.peekRuneType() == internal.RuneTypeNullN { + if nullOK && dec.peekRuneType() == jsonparse.RuneTypeNullN { dec.decodeNull() return } @@ -557,7 +559,7 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) { if dec.disallowUnknownFields { dec.panicType("", typ, fmt.Errorf("json: unknown field %q", name)) } - dec.scan(internal.Discard) + dec.scan(fastio.Discard) return } field := index.byPos[idx] @@ -569,7 +571,7 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) { fmt.Errorf("json: cannot set embedded pointer to unexported struct: %v", fVal.Type().Elem())) } - if dec.peekRuneType() != internal.RuneTypeNullN { + if dec.peekRuneType() != jsonparse.RuneTypeNullN { if fVal.IsNil() { fVal.Set(reflect.New(fVal.Type().Elem())) } @@ -580,7 +582,7 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) { } if field.Quote { switch t := dec.peekRuneType(); t { - case internal.RuneTypeNullN: + case jsonparse.RuneTypeNullN: dec.decodeNull() switch fVal.Kind() { // XXX: I can't justify this list, other than "it's what encoding/json @@ -590,7 +592,7 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) { default: // do nothing??? } - case internal.RuneTypeStringBeg: + case jsonparse.RuneTypeStringBeg: // TODO: Figure out how to do this without buffering, have correct offsets. var buf bytes.Buffer dec.decodeString(nil, &buf) @@ -612,10 +614,10 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) { }) case reflect.Map: switch t := dec.peekRuneType(); t { - case internal.RuneTypeNullN: + case jsonparse.RuneTypeNullN: dec.decodeNull() val.Set(reflect.Zero(typ)) - case internal.RuneTypeObjectBeg: + case jsonparse.RuneTypeObjectBeg: if val.IsNil() { val.Set(reflect.MakeMap(typ)) } @@ -670,24 +672,24 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) { } case reflect.Slice: switch { - case typ.Elem().Kind() == reflect.Uint8 && !(dec.peekRuneType() == internal.RuneTypeArrayBeg && (false || + case typ.Elem().Kind() == reflect.Uint8 && !(dec.peekRuneType() == jsonparse.RuneTypeArrayBeg && (false || reflect.PointerTo(typ.Elem()).Implements(decodableType) || reflect.PointerTo(typ.Elem()).Implements(jsonUnmarshalerType) || reflect.PointerTo(typ.Elem()).Implements(textUnmarshalerType))): switch t := dec.peekRuneType(); t { - case internal.RuneTypeNullN: + case jsonparse.RuneTypeNullN: dec.decodeNull() val.Set(reflect.Zero(typ)) - case internal.RuneTypeStringBeg: + case jsonparse.RuneTypeStringBeg: if typ.Elem() == byteType { var buf bytes.Buffer - dec.decodeString(typ, internal.NewBase64Decoder(&buf)) + dec.decodeString(typ, base64dec.NewBase64Decoder(&buf)) val.Set(reflect.ValueOf(buf.Bytes())) } else { // TODO: Surely there's a better way. At the very least, we should // avoid buffering. var buf bytes.Buffer - dec.decodeString(typ, internal.NewBase64Decoder(&buf)) + dec.decodeString(typ, base64dec.NewBase64Decoder(&buf)) bs := buf.Bytes() val.Set(reflect.MakeSlice(typ, len(bs), len(bs))) for i := 0; i < len(bs); i++ { @@ -699,10 +701,10 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) { } default: switch t := dec.peekRuneType(); t { - case internal.RuneTypeNullN: + case jsonparse.RuneTypeNullN: dec.decodeNull() val.Set(reflect.Zero(typ)) - case internal.RuneTypeArrayBeg: + case jsonparse.RuneTypeArrayBeg: if val.IsNil() { val.Set(reflect.MakeSlice(typ, 0, 0)) } @@ -725,7 +727,7 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) { } } case reflect.Array: - if nullOK && dec.peekRuneType() == internal.RuneTypeNullN { + if nullOK && dec.peekRuneType() == jsonparse.RuneTypeNullN { dec.decodeNull() return } @@ -741,7 +743,7 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) { dec.decode(mValPtr.Elem(), false) val.Index(i).Set(mValPtr.Elem()) } else { - dec.scan(internal.Discard) + dec.scan(fastio.Discard) } i++ }) @@ -750,7 +752,7 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) { } case reflect.Pointer: switch dec.peekRuneType() { - case internal.RuneTypeNullN: + case jsonparse.RuneTypeNullN: dec.decodeNull() val.Set(reflect.Zero(typ)) default: @@ -765,7 +767,7 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) { } } -func (dec *Decoder) scan(out internal.RuneWriter) { +func (dec *Decoder) scan(out fastio.RuneWriter) { limiter := dec.limitingScanner() for { c, _, err := limiter.ReadRune() @@ -776,7 +778,7 @@ func (dec *Decoder) scan(out internal.RuneWriter) { } } -func (dec *Decoder) scanNumber(gTyp reflect.Type, out internal.RuneWriter) { +func (dec *Decoder) scanNumber(gTyp reflect.Type, out fastio.RuneWriter) { if t := dec.peekRuneType(); !t.IsNumber() { dec.panicType(t.JSONType(), gTyp, nil) } @@ -901,23 +903,23 @@ func DecodeObject(r io.RuneScanner, decodeKey, decodeVal func(io.RuneScanner) er } func (dec *Decoder) decodeObject(gTyp reflect.Type, decodeKey, decodeVal func()) { - dec.expectRuneType('{', internal.RuneTypeObjectBeg, gTyp) + dec.expectRuneType('{', jsonparse.RuneTypeObjectBeg, gTyp) _, t := dec.readRune() switch t { - case internal.RuneTypeObjectEnd: + case jsonparse.RuneTypeObjectEnd: return - case internal.RuneTypeStringBeg: + case jsonparse.RuneTypeStringBeg: decodeMember: dec.unreadRune() decodeKey() - dec.expectRune(':', internal.RuneTypeObjectColon) + dec.expectRune(':', jsonparse.RuneTypeObjectColon) decodeVal() _, t := dec.readRune() switch t { - case internal.RuneTypeObjectComma: - dec.expectRune('"', internal.RuneTypeStringBeg) + case jsonparse.RuneTypeObjectComma: + dec.expectRune('"', jsonparse.RuneTypeStringBeg) goto decodeMember - case internal.RuneTypeObjectEnd: + case jsonparse.RuneTypeObjectEnd: return default: panic("should not happen") @@ -972,10 +974,10 @@ func DecodeArray(r io.RuneScanner, decodeMember func(r io.RuneScanner) error) (e } func (dec *Decoder) decodeArray(gTyp reflect.Type, decodeMember func()) { - dec.expectRuneType('[', internal.RuneTypeArrayBeg, gTyp) + dec.expectRuneType('[', jsonparse.RuneTypeArrayBeg, gTyp) _, t := dec.readRune() switch t { - case internal.RuneTypeArrayEnd: + case jsonparse.RuneTypeArrayEnd: return default: dec.unreadRune() @@ -983,9 +985,9 @@ func (dec *Decoder) decodeArray(gTyp reflect.Type, decodeMember func()) { decodeMember() _, t := dec.readRune() switch t { - case internal.RuneTypeArrayComma: + case jsonparse.RuneTypeArrayComma: goto decodeNextMember - case internal.RuneTypeArrayEnd: + case jsonparse.RuneTypeArrayEnd: return default: panic("should not happen") @@ -993,17 +995,17 @@ func (dec *Decoder) decodeArray(gTyp reflect.Type, decodeMember func()) { } } -func (dec *Decoder) decodeString(gTyp reflect.Type, out internal.RuneWriter) { - dec.expectRuneType('"', internal.RuneTypeStringBeg, gTyp) +func (dec *Decoder) decodeString(gTyp reflect.Type, out fastio.RuneWriter) { + dec.expectRuneType('"', jsonparse.RuneTypeStringBeg, gTyp) var uhex [4]byte for { c, t := dec.readRune() switch t { - case internal.RuneTypeStringChar: + case jsonparse.RuneTypeStringChar: _, _ = out.WriteRune(c) - case internal.RuneTypeStringEsc, internal.RuneTypeStringEscU: + case jsonparse.RuneTypeStringEsc, jsonparse.RuneTypeStringEscU: // do nothing - case internal.RuneTypeStringEsc1: + case jsonparse.RuneTypeStringEsc1: switch c { case '"': _, _ = out.WriteRune('"') @@ -1024,14 +1026,14 @@ func (dec *Decoder) decodeString(gTyp reflect.Type, out internal.RuneWriter) { default: panic("should not happen") } - case internal.RuneTypeStringEscUA: - uhex[0], _ = internal.HexToInt(c) - case internal.RuneTypeStringEscUB: - uhex[1], _ = internal.HexToInt(c) - case internal.RuneTypeStringEscUC: - uhex[2], _ = internal.HexToInt(c) - case internal.RuneTypeStringEscUD: - uhex[3], _ = internal.HexToInt(c) + case jsonparse.RuneTypeStringEscUA: + uhex[0], _ = jsonparse.HexToInt(c) + case jsonparse.RuneTypeStringEscUB: + uhex[1], _ = jsonparse.HexToInt(c) + case jsonparse.RuneTypeStringEscUC: + uhex[2], _ = jsonparse.HexToInt(c) + case jsonparse.RuneTypeStringEscUD: + uhex[3], _ = jsonparse.HexToInt(c) c = 0 | rune(uhex[0])<<12 | rune(uhex[1])<<8 | @@ -1039,25 +1041,25 @@ func (dec *Decoder) decodeString(gTyp reflect.Type, out internal.RuneWriter) { rune(uhex[3])<<0 handleUnicode: if utf16.IsSurrogate(c) { - if dec.peekRuneType() != internal.RuneTypeStringEsc { + if dec.peekRuneType() != jsonparse.RuneTypeStringEsc { _, _ = out.WriteRune(utf8.RuneError) break } - dec.expectRune('\\', internal.RuneTypeStringEsc) - if dec.peekRuneType() != internal.RuneTypeStringEscU { + dec.expectRune('\\', jsonparse.RuneTypeStringEsc) + if dec.peekRuneType() != jsonparse.RuneTypeStringEscU { _, _ = out.WriteRune(utf8.RuneError) break } - dec.expectRune('u', internal.RuneTypeStringEscU) + dec.expectRune('u', jsonparse.RuneTypeStringEscU) b, _ := dec.readRune() - uhex[0], _ = internal.HexToInt(b) + uhex[0], _ = jsonparse.HexToInt(b) b, _ = dec.readRune() - uhex[1], _ = internal.HexToInt(b) + uhex[1], _ = jsonparse.HexToInt(b) b, _ = dec.readRune() - uhex[2], _ = internal.HexToInt(b) + uhex[2], _ = jsonparse.HexToInt(b) b, _ = dec.readRune() - uhex[3], _ = internal.HexToInt(b) + uhex[3], _ = jsonparse.HexToInt(b) c2 := 0 | rune(uhex[0])<<12 | rune(uhex[1])<<8 | @@ -1073,7 +1075,7 @@ func (dec *Decoder) decodeString(gTyp reflect.Type, out internal.RuneWriter) { } else { _, _ = out.WriteRune(c) } - case internal.RuneTypeStringEnd: + case jsonparse.RuneTypeStringEnd: return default: panic("should not happen") @@ -1085,15 +1087,15 @@ func (dec *Decoder) decodeBool(gTyp reflect.Type) bool { c, t := dec.readRune() switch c { case 't': - dec.expectRune('r', internal.RuneTypeTrueR) - dec.expectRune('u', internal.RuneTypeTrueU) - dec.expectRune('e', internal.RuneTypeTrueE) + dec.expectRune('r', jsonparse.RuneTypeTrueR) + dec.expectRune('u', jsonparse.RuneTypeTrueU) + dec.expectRune('e', jsonparse.RuneTypeTrueE) return true case 'f': - dec.expectRune('a', internal.RuneTypeFalseA) - dec.expectRune('l', internal.RuneTypeFalseL) - dec.expectRune('s', internal.RuneTypeFalseS) - dec.expectRune('e', internal.RuneTypeFalseE) + dec.expectRune('a', jsonparse.RuneTypeFalseA) + dec.expectRune('l', jsonparse.RuneTypeFalseL) + dec.expectRune('s', jsonparse.RuneTypeFalseS) + dec.expectRune('e', jsonparse.RuneTypeFalseE) return false default: dec.panicType(t.JSONType(), gTyp, nil) @@ -1102,8 +1104,8 @@ func (dec *Decoder) decodeBool(gTyp reflect.Type) bool { } func (dec *Decoder) decodeNull() { - dec.expectRune('n', internal.RuneTypeNullN) - dec.expectRune('u', internal.RuneTypeNullU) - dec.expectRune('l', internal.RuneTypeNullL1) - dec.expectRune('l', internal.RuneTypeNullL2) + dec.expectRune('n', jsonparse.RuneTypeNullN) + dec.expectRune('u', jsonparse.RuneTypeNullU) + dec.expectRune('l', jsonparse.RuneTypeNullL1) + dec.expectRune('l', jsonparse.RuneTypeNullL2) } diff --git a/decode_scan.go b/decode_scan.go index 521c5c4..7a52975 100644 --- a/decode_scan.go +++ b/decode_scan.go @@ -7,7 +7,7 @@ package lowmemjson import ( "io" - "git.lukeshu.com/go/lowmemjson/internal" + "git.lukeshu.com/go/lowmemjson/internal/jsonparse" ) type runeTypeScanner struct { @@ -16,7 +16,7 @@ type runeTypeScanner struct { inner io.RuneScanner // initialized by constructor - parser internal.Parser // initialized by constructor + parser jsonparse.Parser // initialized by constructor offset int64 initialized bool @@ -24,13 +24,13 @@ type runeTypeScanner struct { rRune rune rSize int - rType internal.RuneType + rType jsonparse.RuneType rErr error } func (sc *runeTypeScanner) Reset() { sc.parser.Reset() - if sc.repeat || (sc.rType == internal.RuneTypeEOF && sc.rSize > 0) { + if sc.repeat || (sc.rType == jsonparse.RuneTypeEOF && sc.rSize > 0) { sc.repeat = false // re-figure the rType and rErr var err error @@ -57,9 +57,9 @@ func (sc *runeTypeScanner) Reset() { // end of both value and file: (_, 0, RuneTypeEOF, nil) // end of file in middle of value: (_, 0, RuneTypeError, &DecodeSyntaxError{Offset: offset: Err: io.ErrUnexepctedEOF}) // end of file at start of value: (_, 0, RuneTypeError, &DecodeSyntaxError{Offset: offset: Err: io.EOF}) -func (sc *runeTypeScanner) ReadRuneType() (rune, int, internal.RuneType, error) { +func (sc *runeTypeScanner) ReadRuneType() (rune, int, jsonparse.RuneType, error) { switch { - case sc.initialized && (sc.rType == internal.RuneTypeError || sc.rType == internal.RuneTypeEOF): + case sc.initialized && (sc.rType == jsonparse.RuneTypeError || sc.rType == jsonparse.RuneTypeEOF): // do nothing case sc.repeat: _, _, _ = sc.inner.ReadRune() @@ -80,7 +80,7 @@ func (sc *runeTypeScanner) ReadRuneType() (rune, int, internal.RuneType, error) } else { sc.rErr = nil } - if sc.rType == internal.RuneTypeSpace { + if sc.rType == jsonparse.RuneTypeSpace { goto again } case io.EOF: @@ -133,7 +133,7 @@ func (sc *runeTypeScanner) PushReadBarrier() { func (sc *runeTypeScanner) PopReadBarrier() { sc.parser.PopBarrier() - if sc.repeat || (sc.rType == internal.RuneTypeEOF && sc.rSize > 0) { + if sc.repeat || (sc.rType == jsonparse.RuneTypeEOF && sc.rSize > 0) { // re-figure the rType and rErr var err error sc.rType, err = sc.parser.HandleRune(sc.rRune) @@ -147,7 +147,7 @@ func (sc *runeTypeScanner) PopReadBarrier() { } // tell it to use that rType and rErr _ = sc.UnreadRune() // we set it up to always succeed - } else if sc.rType == internal.RuneTypeEOF { + } else if sc.rType == jsonparse.RuneTypeEOF { // re-figure the rType and rErr var err error sc.rType, err = sc.parser.HandleEOF() diff --git a/decode_scan_test.go b/decode_scan_test.go index d0725e5..1d61157 100644 --- a/decode_scan_test.go +++ b/decode_scan_test.go @@ -12,13 +12,13 @@ import ( "github.com/stretchr/testify/assert" - "git.lukeshu.com/go/lowmemjson/internal" + "git.lukeshu.com/go/lowmemjson/internal/jsonparse" ) type ReadRuneTypeResult struct { r rune s int - t internal.RuneType + t jsonparse.RuneType e error } @@ -54,149 +54,149 @@ func TestRuneTypeScanner(t *testing.T) { t.Parallel() testcases := map[string]runeTypeScannerTestcase{ "basic": {`{"foo": 12.0}`, ``, []ReadRuneTypeResult{ - {'{', 1, internal.RuneTypeObjectBeg, nil}, - {'"', 1, internal.RuneTypeStringBeg, nil}, - {'f', 1, internal.RuneTypeStringChar, nil}, - {'o', 1, internal.RuneTypeStringChar, nil}, - {'o', 1, internal.RuneTypeStringChar, nil}, - {'"', 1, internal.RuneTypeStringEnd, nil}, - {':', 1, internal.RuneTypeObjectColon, nil}, - {'1', 1, internal.RuneTypeNumberIntDig, nil}, - {'2', 1, internal.RuneTypeNumberIntDig, nil}, - {'.', 1, internal.RuneTypeNumberFracDot, nil}, - {'0', 1, internal.RuneTypeNumberFracDig, nil}, - {'}', 1, internal.RuneTypeObjectEnd, nil}, - {0, 0, internal.RuneTypeEOF, nil}, - {0, 0, internal.RuneTypeEOF, nil}, + {'{', 1, jsonparse.RuneTypeObjectBeg, nil}, + {'"', 1, jsonparse.RuneTypeStringBeg, nil}, + {'f', 1, jsonparse.RuneTypeStringChar, nil}, + {'o', 1, jsonparse.RuneTypeStringChar, nil}, + {'o', 1, jsonparse.RuneTypeStringChar, nil}, + {'"', 1, jsonparse.RuneTypeStringEnd, nil}, + {':', 1, jsonparse.RuneTypeObjectColon, nil}, + {'1', 1, jsonparse.RuneTypeNumberIntDig, nil}, + {'2', 1, jsonparse.RuneTypeNumberIntDig, nil}, + {'.', 1, jsonparse.RuneTypeNumberFracDot, nil}, + {'0', 1, jsonparse.RuneTypeNumberFracDig, nil}, + {'}', 1, jsonparse.RuneTypeObjectEnd, nil}, + {0, 0, jsonparse.RuneTypeEOF, nil}, + {0, 0, jsonparse.RuneTypeEOF, nil}, }}, "unread": {`{"foo": 12.0}`, ``, []ReadRuneTypeResult{ - {'{', 1, internal.RuneTypeObjectBeg, nil}, - {'"', 1, internal.RuneTypeStringBeg, nil}, - {'f', 1, internal.RuneTypeStringChar, nil}, - {'o', 1, internal.RuneTypeStringChar, nil}, - {'o', 1, internal.RuneTypeStringChar, nil}, - {'"', 1, internal.RuneTypeStringEnd, nil}, - {':', 1, internal.RuneTypeObjectColon, nil}, - {'1', 1, internal.RuneTypeNumberIntDig, nil}, + {'{', 1, jsonparse.RuneTypeObjectBeg, nil}, + {'"', 1, jsonparse.RuneTypeStringBeg, nil}, + {'f', 1, jsonparse.RuneTypeStringChar, nil}, + {'o', 1, jsonparse.RuneTypeStringChar, nil}, + {'o', 1, jsonparse.RuneTypeStringChar, nil}, + {'"', 1, jsonparse.RuneTypeStringEnd, nil}, + {':', 1, jsonparse.RuneTypeObjectColon, nil}, + {'1', 1, jsonparse.RuneTypeNumberIntDig, nil}, {0, unreadRune, 0, nil}, - {'1', 1, internal.RuneTypeNumberIntDig, nil}, - {'2', 1, internal.RuneTypeNumberIntDig, nil}, - {'.', 1, internal.RuneTypeNumberFracDot, nil}, - {'0', 1, internal.RuneTypeNumberFracDig, nil}, - {'}', 1, internal.RuneTypeObjectEnd, nil}, - {0, 0, internal.RuneTypeEOF, nil}, - {0, 0, internal.RuneTypeEOF, nil}, + {'1', 1, jsonparse.RuneTypeNumberIntDig, nil}, + {'2', 1, jsonparse.RuneTypeNumberIntDig, nil}, + {'.', 1, jsonparse.RuneTypeNumberFracDot, nil}, + {'0', 1, jsonparse.RuneTypeNumberFracDig, nil}, + {'}', 1, jsonparse.RuneTypeObjectEnd, nil}, + {0, 0, jsonparse.RuneTypeEOF, nil}, + {0, 0, jsonparse.RuneTypeEOF, nil}, }}, "unread2": {`{"foo": 12.0}`, ``, []ReadRuneTypeResult{ - {'{', 1, internal.RuneTypeObjectBeg, nil}, - {'"', 1, internal.RuneTypeStringBeg, nil}, - {'f', 1, internal.RuneTypeStringChar, nil}, - {'o', 1, internal.RuneTypeStringChar, nil}, - {'o', 1, internal.RuneTypeStringChar, nil}, - {'"', 1, internal.RuneTypeStringEnd, nil}, - {':', 1, internal.RuneTypeObjectColon, nil}, - {'1', 1, internal.RuneTypeNumberIntDig, nil}, + {'{', 1, jsonparse.RuneTypeObjectBeg, nil}, + {'"', 1, jsonparse.RuneTypeStringBeg, nil}, + {'f', 1, jsonparse.RuneTypeStringChar, nil}, + {'o', 1, jsonparse.RuneTypeStringChar, nil}, + {'o', 1, jsonparse.RuneTypeStringChar, nil}, + {'"', 1, jsonparse.RuneTypeStringEnd, nil}, + {':', 1, jsonparse.RuneTypeObjectColon, nil}, + {'1', 1, jsonparse.RuneTypeNumberIntDig, nil}, {0, unreadRune, 0, nil}, {0, unreadRune, 0, ErrInvalidUnreadRune}, - {'1', 1, internal.RuneTypeNumberIntDig, nil}, - {'2', 1, internal.RuneTypeNumberIntDig, nil}, - {'.', 1, internal.RuneTypeNumberFracDot, nil}, - {'0', 1, internal.RuneTypeNumberFracDig, nil}, - {'}', 1, internal.RuneTypeObjectEnd, nil}, - {0, 0, internal.RuneTypeEOF, nil}, - {0, 0, internal.RuneTypeEOF, nil}, + {'1', 1, jsonparse.RuneTypeNumberIntDig, nil}, + {'2', 1, jsonparse.RuneTypeNumberIntDig, nil}, + {'.', 1, jsonparse.RuneTypeNumberFracDot, nil}, + {'0', 1, jsonparse.RuneTypeNumberFracDig, nil}, + {'}', 1, jsonparse.RuneTypeObjectEnd, nil}, + {0, 0, jsonparse.RuneTypeEOF, nil}, + {0, 0, jsonparse.RuneTypeEOF, nil}, }}, "unread-eof": {`{"foo": 12.0}`, ``, []ReadRuneTypeResult{ - {'{', 1, internal.RuneTypeObjectBeg, nil}, - {'"', 1, internal.RuneTypeStringBeg, nil}, - {'f', 1, internal.RuneTypeStringChar, nil}, - {'o', 1, internal.RuneTypeStringChar, nil}, - {'o', 1, internal.RuneTypeStringChar, nil}, - {'"', 1, internal.RuneTypeStringEnd, nil}, - {':', 1, internal.RuneTypeObjectColon, nil}, - {'1', 1, internal.RuneTypeNumberIntDig, nil}, - {'2', 1, internal.RuneTypeNumberIntDig, nil}, - {'.', 1, internal.RuneTypeNumberFracDot, nil}, - {'0', 1, internal.RuneTypeNumberFracDig, nil}, - {'}', 1, internal.RuneTypeObjectEnd, nil}, - {0, 0, internal.RuneTypeEOF, nil}, + {'{', 1, jsonparse.RuneTypeObjectBeg, nil}, + {'"', 1, jsonparse.RuneTypeStringBeg, nil}, + {'f', 1, jsonparse.RuneTypeStringChar, nil}, + {'o', 1, jsonparse.RuneTypeStringChar, nil}, + {'o', 1, jsonparse.RuneTypeStringChar, nil}, + {'"', 1, jsonparse.RuneTypeStringEnd, nil}, + {':', 1, jsonparse.RuneTypeObjectColon, nil}, + {'1', 1, jsonparse.RuneTypeNumberIntDig, nil}, + {'2', 1, jsonparse.RuneTypeNumberIntDig, nil}, + {'.', 1, jsonparse.RuneTypeNumberFracDot, nil}, + {'0', 1, jsonparse.RuneTypeNumberFracDig, nil}, + {'}', 1, jsonparse.RuneTypeObjectEnd, nil}, + {0, 0, jsonparse.RuneTypeEOF, nil}, {0, unreadRune, 0, ErrInvalidUnreadRune}, - {0, 0, internal.RuneTypeEOF, nil}, - {0, 0, internal.RuneTypeEOF, nil}, + {0, 0, jsonparse.RuneTypeEOF, nil}, + {0, 0, jsonparse.RuneTypeEOF, nil}, }}, "tail-ws": {`{"foo": 12.0} `, ``, []ReadRuneTypeResult{ - {'{', 1, internal.RuneTypeObjectBeg, nil}, - {'"', 1, internal.RuneTypeStringBeg, nil}, - {'f', 1, internal.RuneTypeStringChar, nil}, - {'o', 1, internal.RuneTypeStringChar, nil}, - {'o', 1, internal.RuneTypeStringChar, nil}, - {'"', 1, internal.RuneTypeStringEnd, nil}, - {':', 1, internal.RuneTypeObjectColon, nil}, - {'1', 1, internal.RuneTypeNumberIntDig, nil}, - {'2', 1, internal.RuneTypeNumberIntDig, nil}, - {'.', 1, internal.RuneTypeNumberFracDot, nil}, - {'0', 1, internal.RuneTypeNumberFracDig, nil}, - {'}', 1, internal.RuneTypeObjectEnd, nil}, - {0, 0, internal.RuneTypeEOF, nil}, - {0, 0, internal.RuneTypeEOF, nil}, + {'{', 1, jsonparse.RuneTypeObjectBeg, nil}, + {'"', 1, jsonparse.RuneTypeStringBeg, nil}, + {'f', 1, jsonparse.RuneTypeStringChar, nil}, + {'o', 1, jsonparse.RuneTypeStringChar, nil}, + {'o', 1, jsonparse.RuneTypeStringChar, nil}, + {'"', 1, jsonparse.RuneTypeStringEnd, nil}, + {':', 1, jsonparse.RuneTypeObjectColon, nil}, + {'1', 1, jsonparse.RuneTypeNumberIntDig, nil}, + {'2', 1, jsonparse.RuneTypeNumberIntDig, nil}, + {'.', 1, jsonparse.RuneTypeNumberFracDot, nil}, + {'0', 1, jsonparse.RuneTypeNumberFracDig, nil}, + {'}', 1, jsonparse.RuneTypeObjectEnd, nil}, + {0, 0, jsonparse.RuneTypeEOF, nil}, + {0, 0, jsonparse.RuneTypeEOF, nil}, }}, "syntax-error": {`[[0,]`, ``, []ReadRuneTypeResult{ - {'[', 1, internal.RuneTypeArrayBeg, nil}, - {'[', 1, internal.RuneTypeArrayBeg, nil}, - {'0', 1, internal.RuneTypeNumberIntZero, nil}, - {',', 1, internal.RuneTypeArrayComma, nil}, - {']', 1, internal.RuneTypeError, &DecodeSyntaxError{Offset: 4, Err: fmt.Errorf("invalid character %q looking for beginning of value", ']')}}, - {']', 1, internal.RuneTypeError, &DecodeSyntaxError{Offset: 4, Err: fmt.Errorf("invalid character %q looking for beginning of value", ']')}}, - {']', 1, internal.RuneTypeError, &DecodeSyntaxError{Offset: 4, Err: fmt.Errorf("invalid character %q looking for beginning of value", ']')}}, + {'[', 1, jsonparse.RuneTypeArrayBeg, nil}, + {'[', 1, jsonparse.RuneTypeArrayBeg, nil}, + {'0', 1, jsonparse.RuneTypeNumberIntZero, nil}, + {',', 1, jsonparse.RuneTypeArrayComma, nil}, + {']', 1, jsonparse.RuneTypeError, &DecodeSyntaxError{Offset: 4, Err: fmt.Errorf("invalid character %q looking for beginning of value", ']')}}, + {']', 1, jsonparse.RuneTypeError, &DecodeSyntaxError{Offset: 4, Err: fmt.Errorf("invalid character %q looking for beginning of value", ']')}}, + {']', 1, jsonparse.RuneTypeError, &DecodeSyntaxError{Offset: 4, Err: fmt.Errorf("invalid character %q looking for beginning of value", ']')}}, }}, "multi-value": {`1{}`, `}`, []ReadRuneTypeResult{ - {'1', 1, internal.RuneTypeNumberIntDig, nil}, - {'{', 1, internal.RuneTypeEOF, nil}, - {'{', 1, internal.RuneTypeEOF, nil}, - {'{', 1, internal.RuneTypeEOF, nil}, + {'1', 1, jsonparse.RuneTypeNumberIntDig, nil}, + {'{', 1, jsonparse.RuneTypeEOF, nil}, + {'{', 1, jsonparse.RuneTypeEOF, nil}, + {'{', 1, jsonparse.RuneTypeEOF, nil}, }}, "early-eof": {` {`, ``, []ReadRuneTypeResult{ - {'{', 1, internal.RuneTypeObjectBeg, nil}, - {0, 0, internal.RuneTypeError, &DecodeSyntaxError{Offset: 2, Err: io.ErrUnexpectedEOF}}, - {0, 0, internal.RuneTypeError, &DecodeSyntaxError{Offset: 2, Err: io.ErrUnexpectedEOF}}, - {0, 0, internal.RuneTypeError, &DecodeSyntaxError{Offset: 2, Err: io.ErrUnexpectedEOF}}, + {'{', 1, jsonparse.RuneTypeObjectBeg, nil}, + {0, 0, jsonparse.RuneTypeError, &DecodeSyntaxError{Offset: 2, Err: io.ErrUnexpectedEOF}}, + {0, 0, jsonparse.RuneTypeError, &DecodeSyntaxError{Offset: 2, Err: io.ErrUnexpectedEOF}}, + {0, 0, jsonparse.RuneTypeError, &DecodeSyntaxError{Offset: 2, Err: io.ErrUnexpectedEOF}}, }}, "empty": {``, ``, []ReadRuneTypeResult{ - {0, 0, internal.RuneTypeError, &DecodeSyntaxError{Offset: 0, Err: io.EOF}}, - {0, 0, internal.RuneTypeError, &DecodeSyntaxError{Offset: 0, Err: io.EOF}}, - {0, 0, internal.RuneTypeError, &DecodeSyntaxError{Offset: 0, Err: io.EOF}}, + {0, 0, jsonparse.RuneTypeError, &DecodeSyntaxError{Offset: 0, Err: io.EOF}}, + {0, 0, jsonparse.RuneTypeError, &DecodeSyntaxError{Offset: 0, Err: io.EOF}}, + {0, 0, jsonparse.RuneTypeError, &DecodeSyntaxError{Offset: 0, Err: io.EOF}}, }}, "basic2": {`1`, ``, []ReadRuneTypeResult{ - {'1', 1, internal.RuneTypeNumberIntDig, nil}, - {0, 0, internal.RuneTypeEOF, nil}, - {0, 0, internal.RuneTypeEOF, nil}, - {0, 0, internal.RuneTypeEOF, nil}, + {'1', 1, jsonparse.RuneTypeNumberIntDig, nil}, + {0, 0, jsonparse.RuneTypeEOF, nil}, + {0, 0, jsonparse.RuneTypeEOF, nil}, + {0, 0, jsonparse.RuneTypeEOF, nil}, }}, "fragment": {`1,`, ``, []ReadRuneTypeResult{ - {'1', 1, internal.RuneTypeNumberIntDig, nil}, - {',', 1, internal.RuneTypeEOF, nil}, - {',', 1, internal.RuneTypeEOF, nil}, - {',', 1, internal.RuneTypeEOF, nil}, + {'1', 1, jsonparse.RuneTypeNumberIntDig, nil}, + {',', 1, jsonparse.RuneTypeEOF, nil}, + {',', 1, jsonparse.RuneTypeEOF, nil}, + {',', 1, jsonparse.RuneTypeEOF, nil}, }}, "elem": {` { "foo" : 12.0 } `, ``, []ReadRuneTypeResult{ - {'{', 1, internal.RuneTypeObjectBeg, nil}, - {'"', 1, internal.RuneTypeStringBeg, nil}, - {'f', 1, internal.RuneTypeStringChar, nil}, - {'o', 1, internal.RuneTypeStringChar, nil}, - {'o', 1, internal.RuneTypeStringChar, nil}, - {'"', 1, internal.RuneTypeStringEnd, nil}, - {':', 1, internal.RuneTypeObjectColon, nil}, + {'{', 1, jsonparse.RuneTypeObjectBeg, nil}, + {'"', 1, jsonparse.RuneTypeStringBeg, nil}, + {'f', 1, jsonparse.RuneTypeStringChar, nil}, + {'o', 1, jsonparse.RuneTypeStringChar, nil}, + {'o', 1, jsonparse.RuneTypeStringChar, nil}, + {'"', 1, jsonparse.RuneTypeStringEnd, nil}, + {':', 1, jsonparse.RuneTypeObjectColon, nil}, {0, pushReadBarrier, 0, nil}, - {'1', 1, internal.RuneTypeNumberIntDig, nil}, - {'2', 1, internal.RuneTypeNumberIntDig, nil}, - {'.', 1, internal.RuneTypeNumberFracDot, nil}, - {'0', 1, internal.RuneTypeNumberFracDig, nil}, - {'}', 1, internal.RuneTypeEOF, nil}, - {'}', 1, internal.RuneTypeEOF, nil}, + {'1', 1, jsonparse.RuneTypeNumberIntDig, nil}, + {'2', 1, jsonparse.RuneTypeNumberIntDig, nil}, + {'.', 1, jsonparse.RuneTypeNumberFracDot, nil}, + {'0', 1, jsonparse.RuneTypeNumberFracDig, nil}, + {'}', 1, jsonparse.RuneTypeEOF, nil}, + {'}', 1, jsonparse.RuneTypeEOF, nil}, {0, popReadBarrier, 0, nil}, - {'}', 1, internal.RuneTypeObjectEnd, nil}, - {0, 0, internal.RuneTypeEOF, nil}, - {0, 0, internal.RuneTypeEOF, nil}, + {'}', 1, jsonparse.RuneTypeObjectEnd, nil}, + {0, 0, jsonparse.RuneTypeEOF, nil}, + {0, 0, jsonparse.RuneTypeEOF, nil}, }}, } func() { @@ -214,9 +214,9 @@ func TestRuneTypeScanner(t *testing.T) { } tc.Input = `[1,` + tc.Input tc.Exp = append([]ReadRuneTypeResult{ - {'[', 1, internal.RuneTypeArrayBeg, nil}, - {'1', 1, internal.RuneTypeNumberIntDig, nil}, - {',', 1, internal.RuneTypeArrayComma, nil}, + {'[', 1, jsonparse.RuneTypeArrayBeg, nil}, + {'1', 1, jsonparse.RuneTypeNumberIntDig, nil}, + {',', 1, jsonparse.RuneTypeArrayComma, nil}, {0, pushReadBarrier, 0, nil}, }, tc.Exp...) for i := 2; i < len(tc.Exp); i++ { diff --git a/encode_string.go b/encode_string.go index 12f934e..a5d6633 100644 --- a/encode_string.go +++ b/encode_string.go @@ -8,17 +8,19 @@ import ( "io" "unicode/utf8" - "git.lukeshu.com/go/lowmemjson/internal" + "git.lukeshu.com/go/lowmemjson/internal/fastio" + "git.lukeshu.com/go/lowmemjson/internal/jsonparse" + "git.lukeshu.com/go/lowmemjson/internal/jsontest" ) func writeStringUnicodeEscape(w io.Writer, c rune) (int, error) { buf := [6]byte{ '\\', 'u', - internal.Hex[(c>>12)&0xf], - internal.Hex[(c>>8)&0xf], - internal.Hex[(c>>4)&0xf], - internal.Hex[(c>>0)&0xf], + jsonparse.Hex[(c>>12)&0xf], + jsonparse.Hex[(c>>8)&0xf], + jsonparse.Hex[(c>>4)&0xf], + jsonparse.Hex[(c>>0)&0xf], } return w.Write(buf[:]) } @@ -45,7 +47,7 @@ func writeStringShortEscape(w io.Writer, c rune) (int, error) { return w.Write(buf[:]) } -func writeStringChar(w internal.AllWriter, c rune, wasEscaped BackslashEscapeMode, escaper BackslashEscaper) (int, error) { +func writeStringChar(w fastio.AllWriter, c rune, wasEscaped BackslashEscapeMode, escaper BackslashEscaper) (int, error) { if escaper == nil { escaper = EscapeDefault } @@ -83,7 +85,7 @@ func writeStringChar(w internal.AllWriter, c rune, wasEscaped BackslashEscapeMod } } -func encodeStringFromString(w internal.AllWriter, escaper BackslashEscaper, str string) error { +func encodeStringFromString(w fastio.AllWriter, escaper BackslashEscaper, str string) error { if err := w.WriteByte('"'); err != nil { return err } @@ -98,7 +100,7 @@ func encodeStringFromString(w internal.AllWriter, escaper BackslashEscaper, str return nil } -func encodeStringFromBytes(w internal.AllWriter, escaper BackslashEscaper, str []byte) error { +func encodeStringFromBytes(w fastio.AllWriter, escaper BackslashEscaper, str []byte) error { if err := w.WriteByte('"'); err != nil { return err } @@ -116,13 +118,13 @@ func encodeStringFromBytes(w internal.AllWriter, escaper BackslashEscaper, str [ } func init() { - internal.EncodeStringFromString = func(w io.Writer, s string) { - if err := encodeStringFromString(internal.NewAllWriter(w), nil, s); err != nil { + jsontest.EncodeStringFromString = func(w io.Writer, s string) { + if err := encodeStringFromString(fastio.NewAllWriter(w), nil, s); err != nil { panic(err) } } - internal.EncodeStringFromBytes = func(w io.Writer, s []byte) { - if err := encodeStringFromBytes(internal.NewAllWriter(w), nil, s); err != nil { + jsontest.EncodeStringFromBytes = func(w io.Writer, s []byte) { + if err := encodeStringFromBytes(fastio.NewAllWriter(w), nil, s); err != nil { panic(err) } } @@ -11,7 +11,7 @@ import ( "reflect" "strings" - "git.lukeshu.com/go/lowmemjson/internal" + "git.lukeshu.com/go/lowmemjson/internal/jsonparse" ) // ErrInvalidUnreadRune is returned to Decodable.DecodeJSON(scanner) @@ -24,7 +24,7 @@ var ErrInvalidUnreadRune = errors.New("lowmemjson: invalid use of UnreadRune") // ErrParserExceededMaxDepth is the base error that a // *DecodeSyntaxError wraps when the depth of the JSON document // exceeds 10000. -var ErrParserExceededMaxDepth = internal.ErrParserExceededMaxDepth +var ErrParserExceededMaxDepth = jsonparse.ErrParserExceededMaxDepth // low-level decode errors ///////////////////////////////////////////////////////////////////////// // These will be wrapped in a *DecodeError. diff --git a/internal/base64.go b/internal/base64dec/base64.go index 291a229..dcb4b1c 100644 --- a/internal/base64.go +++ b/internal/base64dec/base64.go @@ -2,12 +2,14 @@ // // SPDX-License-Identifier: GPL-2.0-or-later -package internal +package base64dec import ( "encoding/base64" "io" "strings" + + "git.lukeshu.com/go/lowmemjson/internal/fastio" ) type base64Decoder struct { @@ -21,7 +23,7 @@ type base64Decoder struct { func NewBase64Decoder(w io.Writer) interface { io.WriteCloser - RuneWriter + fastio.RuneWriter } { return &base64Decoder{ dst: w, @@ -116,7 +118,7 @@ func (dec *base64Decoder) Write(dat []byte) (int, error) { } func (dec *base64Decoder) WriteRune(r rune) (int, error) { - return WriteRune(dec, r) + return fastio.WriteRune(dec, r) } func (dec *base64Decoder) Close() error { diff --git a/internal/base64_test.go b/internal/base64dec/base64_test.go index f18bcd7..cb3063d 100644 --- a/internal/base64_test.go +++ b/internal/base64dec/base64_test.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-2.0-or-later -package internal +package base64dec import ( "bytes" diff --git a/internal/testdata/fuzz/FuzzBase64Decoder/06e2c9db80a08b67fad7f1a4606dc7419750995a57828aa25ea57fe7099d5c03 b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/06e2c9db80a08b67fad7f1a4606dc7419750995a57828aa25ea57fe7099d5c03 index c3774e7..c3774e7 100644 --- a/internal/testdata/fuzz/FuzzBase64Decoder/06e2c9db80a08b67fad7f1a4606dc7419750995a57828aa25ea57fe7099d5c03 +++ b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/06e2c9db80a08b67fad7f1a4606dc7419750995a57828aa25ea57fe7099d5c03 diff --git a/internal/testdata/fuzz/FuzzBase64Decoder/24f53a36f8832fec65cac0aa0f3b43ec1c904414fa6d38f6fc288b0bbd69588a b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/24f53a36f8832fec65cac0aa0f3b43ec1c904414fa6d38f6fc288b0bbd69588a index 4c861db..4c861db 100644 --- a/internal/testdata/fuzz/FuzzBase64Decoder/24f53a36f8832fec65cac0aa0f3b43ec1c904414fa6d38f6fc288b0bbd69588a +++ b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/24f53a36f8832fec65cac0aa0f3b43ec1c904414fa6d38f6fc288b0bbd69588a diff --git a/internal/testdata/fuzz/FuzzBase64Decoder/2d49311ef22319f70a3590a86b406b9f2565987a4a3b6d7660ddc308b5b2fae2 b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/2d49311ef22319f70a3590a86b406b9f2565987a4a3b6d7660ddc308b5b2fae2 index 3d32e14..3d32e14 100644 --- a/internal/testdata/fuzz/FuzzBase64Decoder/2d49311ef22319f70a3590a86b406b9f2565987a4a3b6d7660ddc308b5b2fae2 +++ b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/2d49311ef22319f70a3590a86b406b9f2565987a4a3b6d7660ddc308b5b2fae2 diff --git a/internal/testdata/fuzz/FuzzBase64Decoder/356e28f5914a0f16f3cef81330f1d92060be4d694a93dedd654bf48743a7d2bd b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/356e28f5914a0f16f3cef81330f1d92060be4d694a93dedd654bf48743a7d2bd index d08ef92..d08ef92 100644 --- a/internal/testdata/fuzz/FuzzBase64Decoder/356e28f5914a0f16f3cef81330f1d92060be4d694a93dedd654bf48743a7d2bd +++ b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/356e28f5914a0f16f3cef81330f1d92060be4d694a93dedd654bf48743a7d2bd diff --git a/internal/testdata/fuzz/FuzzBase64Decoder/582528ddfad69eb57775199a43e0f9fd5c94bba343ce7bb6724d4ebafe311ed4 b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/582528ddfad69eb57775199a43e0f9fd5c94bba343ce7bb6724d4ebafe311ed4 index a96f559..a96f559 100644 --- a/internal/testdata/fuzz/FuzzBase64Decoder/582528ddfad69eb57775199a43e0f9fd5c94bba343ce7bb6724d4ebafe311ed4 +++ b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/582528ddfad69eb57775199a43e0f9fd5c94bba343ce7bb6724d4ebafe311ed4 diff --git a/internal/testdata/fuzz/FuzzBase64Decoder/60c81ee499a7f1e151b66b08f0a4ff81edd7cb53d00dce8ee0eaf31683996026 b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/60c81ee499a7f1e151b66b08f0a4ff81edd7cb53d00dce8ee0eaf31683996026 index 87c024d..87c024d 100644 --- a/internal/testdata/fuzz/FuzzBase64Decoder/60c81ee499a7f1e151b66b08f0a4ff81edd7cb53d00dce8ee0eaf31683996026 +++ b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/60c81ee499a7f1e151b66b08f0a4ff81edd7cb53d00dce8ee0eaf31683996026 diff --git a/internal/testdata/fuzz/FuzzBase64Decoder/66498f377f38b53eebe1ceaa4a53e4de01a04efc02ac9cfda60f9815f80e9b9d b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/66498f377f38b53eebe1ceaa4a53e4de01a04efc02ac9cfda60f9815f80e9b9d index 959401e..959401e 100644 --- a/internal/testdata/fuzz/FuzzBase64Decoder/66498f377f38b53eebe1ceaa4a53e4de01a04efc02ac9cfda60f9815f80e9b9d +++ b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/66498f377f38b53eebe1ceaa4a53e4de01a04efc02ac9cfda60f9815f80e9b9d diff --git a/internal/testdata/fuzz/FuzzBase64Decoder/731951fe84fa6f3a7f6ee8adaa585d4f6a01f359a04737e51ffc70f16f480b9b b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/731951fe84fa6f3a7f6ee8adaa585d4f6a01f359a04737e51ffc70f16f480b9b index bd1ae59..bd1ae59 100644 --- a/internal/testdata/fuzz/FuzzBase64Decoder/731951fe84fa6f3a7f6ee8adaa585d4f6a01f359a04737e51ffc70f16f480b9b +++ b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/731951fe84fa6f3a7f6ee8adaa585d4f6a01f359a04737e51ffc70f16f480b9b diff --git a/internal/testdata/fuzz/FuzzBase64Decoder/7d6367ba84cd18550920b5202cd1269174416ce32769c7f59376e76b7dd3129c b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/7d6367ba84cd18550920b5202cd1269174416ce32769c7f59376e76b7dd3129c index 09e0ad2..09e0ad2 100644 --- a/internal/testdata/fuzz/FuzzBase64Decoder/7d6367ba84cd18550920b5202cd1269174416ce32769c7f59376e76b7dd3129c +++ b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/7d6367ba84cd18550920b5202cd1269174416ce32769c7f59376e76b7dd3129c diff --git a/internal/testdata/fuzz/FuzzBase64Decoder/8727b16d337d7b8187433233f3a90099024e580a6ba319ea2bf539880c50bd7c b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/8727b16d337d7b8187433233f3a90099024e580a6ba319ea2bf539880c50bd7c index e8000f3..e8000f3 100644 --- a/internal/testdata/fuzz/FuzzBase64Decoder/8727b16d337d7b8187433233f3a90099024e580a6ba319ea2bf539880c50bd7c +++ b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/8727b16d337d7b8187433233f3a90099024e580a6ba319ea2bf539880c50bd7c diff --git a/internal/testdata/fuzz/FuzzBase64Decoder/9201a772731543760326638b8915f80863feab0ba0108183b3093934bdc0420c b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/9201a772731543760326638b8915f80863feab0ba0108183b3093934bdc0420c index aac6b7d..aac6b7d 100644 --- a/internal/testdata/fuzz/FuzzBase64Decoder/9201a772731543760326638b8915f80863feab0ba0108183b3093934bdc0420c +++ b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/9201a772731543760326638b8915f80863feab0ba0108183b3093934bdc0420c diff --git a/internal/testdata/fuzz/FuzzBase64Decoder/92f75f690317ace34aeaae3fe39f5f2ff9830777253ff371c5ef6f403a0f8f0f b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/92f75f690317ace34aeaae3fe39f5f2ff9830777253ff371c5ef6f403a0f8f0f index f3bf6d9..f3bf6d9 100644 --- a/internal/testdata/fuzz/FuzzBase64Decoder/92f75f690317ace34aeaae3fe39f5f2ff9830777253ff371c5ef6f403a0f8f0f +++ b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/92f75f690317ace34aeaae3fe39f5f2ff9830777253ff371c5ef6f403a0f8f0f diff --git a/internal/testdata/fuzz/FuzzBase64Decoder/93d6f7bc0d93f998c7b7fe654ff46010d6fa76f0a142c3523c42454f8ad10b07 b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/93d6f7bc0d93f998c7b7fe654ff46010d6fa76f0a142c3523c42454f8ad10b07 index 2e7f462..2e7f462 100644 --- a/internal/testdata/fuzz/FuzzBase64Decoder/93d6f7bc0d93f998c7b7fe654ff46010d6fa76f0a142c3523c42454f8ad10b07 +++ b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/93d6f7bc0d93f998c7b7fe654ff46010d6fa76f0a142c3523c42454f8ad10b07 diff --git a/internal/testdata/fuzz/FuzzBase64Decoder/a7450fd77fc7c53cc5bd136874415dddfff5c586e662f21420caa7a94131a56a b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/a7450fd77fc7c53cc5bd136874415dddfff5c586e662f21420caa7a94131a56a index c541f52..c541f52 100644 --- a/internal/testdata/fuzz/FuzzBase64Decoder/a7450fd77fc7c53cc5bd136874415dddfff5c586e662f21420caa7a94131a56a +++ b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/a7450fd77fc7c53cc5bd136874415dddfff5c586e662f21420caa7a94131a56a diff --git a/internal/testdata/fuzz/FuzzBase64Decoder/a95d2a0f87501a643d54218d2ad8112204672cc1fb30be297853616788208a5c b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/a95d2a0f87501a643d54218d2ad8112204672cc1fb30be297853616788208a5c index 5d56f29..5d56f29 100644 --- a/internal/testdata/fuzz/FuzzBase64Decoder/a95d2a0f87501a643d54218d2ad8112204672cc1fb30be297853616788208a5c +++ b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/a95d2a0f87501a643d54218d2ad8112204672cc1fb30be297853616788208a5c diff --git a/internal/testdata/fuzz/FuzzBase64Decoder/beed435aa2fee4819eab217543561dfd8001d4a44f53ceb664aaba86cebfaf21 b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/beed435aa2fee4819eab217543561dfd8001d4a44f53ceb664aaba86cebfaf21 index 4b4d59f..4b4d59f 100644 --- a/internal/testdata/fuzz/FuzzBase64Decoder/beed435aa2fee4819eab217543561dfd8001d4a44f53ceb664aaba86cebfaf21 +++ b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/beed435aa2fee4819eab217543561dfd8001d4a44f53ceb664aaba86cebfaf21 diff --git a/internal/testdata/fuzz/FuzzBase64Decoder/c2501043394e49f2477408be5ef9389790e33ed1886073dec445d4cf05bcd4b4 b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/c2501043394e49f2477408be5ef9389790e33ed1886073dec445d4cf05bcd4b4 index ef9f9d4..ef9f9d4 100644 --- a/internal/testdata/fuzz/FuzzBase64Decoder/c2501043394e49f2477408be5ef9389790e33ed1886073dec445d4cf05bcd4b4 +++ b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/c2501043394e49f2477408be5ef9389790e33ed1886073dec445d4cf05bcd4b4 diff --git a/internal/testdata/fuzz/FuzzBase64Decoder/caf81e9797b19c76c1fc4dbf537d4d81f389524539f402d13aa01f93a65ac7e9 b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/caf81e9797b19c76c1fc4dbf537d4d81f389524539f402d13aa01f93a65ac7e9 index 67322c7..67322c7 100644 --- a/internal/testdata/fuzz/FuzzBase64Decoder/caf81e9797b19c76c1fc4dbf537d4d81f389524539f402d13aa01f93a65ac7e9 +++ b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/caf81e9797b19c76c1fc4dbf537d4d81f389524539f402d13aa01f93a65ac7e9 diff --git a/internal/testdata/fuzz/FuzzBase64Decoder/cc90a4a40ae9b3beac70baf6d7821a5a6f3a90cabb033575790be91723593680 b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/cc90a4a40ae9b3beac70baf6d7821a5a6f3a90cabb033575790be91723593680 index f195330..f195330 100644 --- a/internal/testdata/fuzz/FuzzBase64Decoder/cc90a4a40ae9b3beac70baf6d7821a5a6f3a90cabb033575790be91723593680 +++ b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/cc90a4a40ae9b3beac70baf6d7821a5a6f3a90cabb033575790be91723593680 diff --git a/internal/testdata/fuzz/FuzzBase64Decoder/ec72f669d648d8d9b9f75a3b303897c59b11e4bfb7622f25ff251a92f182bc2a b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/ec72f669d648d8d9b9f75a3b303897c59b11e4bfb7622f25ff251a92f182bc2a index 5b0d392..5b0d392 100644 --- a/internal/testdata/fuzz/FuzzBase64Decoder/ec72f669d648d8d9b9f75a3b303897c59b11e4bfb7622f25ff251a92f182bc2a +++ b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/ec72f669d648d8d9b9f75a3b303897c59b11e4bfb7622f25ff251a92f182bc2a diff --git a/internal/testdata/fuzz/FuzzBase64Decoder/f34630c44c11bb13d27531927c5c1e65d159b70f39cd161da0dba348c1221ab3 b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/f34630c44c11bb13d27531927c5c1e65d159b70f39cd161da0dba348c1221ab3 index a389d3c..a389d3c 100644 --- a/internal/testdata/fuzz/FuzzBase64Decoder/f34630c44c11bb13d27531927c5c1e65d159b70f39cd161da0dba348c1221ab3 +++ b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/f34630c44c11bb13d27531927c5c1e65d159b70f39cd161da0dba348c1221ab3 diff --git a/internal/testdata/fuzz/FuzzBase64Decoder/fd67efb09d433a1351a201281dbf6568628b4135c35c811dd9bce97620a75d43 b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/fd67efb09d433a1351a201281dbf6568628b4135c35c811dd9bce97620a75d43 index 17d10b2..17d10b2 100644 --- a/internal/testdata/fuzz/FuzzBase64Decoder/fd67efb09d433a1351a201281dbf6568628b4135c35c811dd9bce97620a75d43 +++ b/internal/base64dec/testdata/fuzz/FuzzBase64Decoder/fd67efb09d433a1351a201281dbf6568628b4135c35c811dd9bce97620a75d43 diff --git a/internal/allwriter.go b/internal/fastio/allwriter.go index 187aa8e..9de8fdc 100644 --- a/internal/allwriter.go +++ b/internal/fastio/allwriter.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-2.0-or-later -package internal +package fastio import ( "io" diff --git a/internal/hex.go b/internal/jsonparse/hex.go index 62a818f..3ed5f01 100644 --- a/internal/hex.go +++ b/internal/jsonparse/hex.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-2.0-or-later -package internal +package jsonparse const Hex = "0123456789abcdef" diff --git a/internal/parse.go b/internal/jsonparse/parse.go index 36db4a9..7d97be0 100644 --- a/internal/parse.go +++ b/internal/jsonparse/parse.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-2.0-or-later -package internal +package jsonparse import ( "errors" diff --git a/internal/parse_test.go b/internal/jsonparse/parse_test.go index 34977fb..e531daf 100644 --- a/internal/parse_test.go +++ b/internal/jsonparse/parse_test.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-2.0-or-later -package internal +package jsonparse import ( "testing" diff --git a/internal/borrowed_tags.go b/internal/jsontags/borrowed_tags.go index 6eaf5da..aa94b9b 100644 --- a/internal/borrowed_tags.go +++ b/internal/jsontags/borrowed_tags.go @@ -4,7 +4,7 @@ // // SPDX-License-Identifier: BSD-3-Clause -package internal // MODIFIED: changed package name +package jsontags // MODIFIED: changed package name import ( "strings" diff --git a/internal/tags.go b/internal/jsontags/tags.go index bdf1f72..386824d 100644 --- a/internal/tags.go +++ b/internal/jsontags/tags.go @@ -2,6 +2,6 @@ // // SPDX-License-Identifier: GPL-2.0-or-later -package internal +package jsontags var ParseTag = parseTag diff --git a/internal/encode.go b/internal/jsontest/jsontest.go index 8aae673..fbc775d 100644 --- a/internal/encode.go +++ b/internal/jsontest/jsontest.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-2.0-or-later -package internal +package jsontest import ( "io" diff --git a/reencode.go b/reencode.go index 3e9cf37..232d91d 100644 --- a/reencode.go +++ b/reencode.go @@ -10,7 +10,8 @@ import ( "io" "unicode/utf8" - "git.lukeshu.com/go/lowmemjson/internal" + "git.lukeshu.com/go/lowmemjson/internal/fastio" + "git.lukeshu.com/go/lowmemjson/internal/jsonparse" ) // A ReEncoderConfig controls how a ReEncoder should behave. @@ -71,7 +72,7 @@ type ReEncoderConfig struct { func NewReEncoder(out io.Writer, cfg ReEncoderConfig) *ReEncoder { return &ReEncoder{ ReEncoderConfig: cfg, - out: internal.NewAllWriter(out), + out: fastio.NewAllWriter(out), specu: new(speculation), } } @@ -86,7 +87,7 @@ func NewReEncoder(out io.Writer, cfg ReEncoderConfig) *ReEncoder { // The memory use of a ReEncoder is O(CompactIfUnder+depth). type ReEncoder struct { ReEncoderConfig - out internal.AllWriter + out fastio.AllWriter // state: .Write's and .WriteString's utf8-decoding buffer buf [utf8.UTFMax]byte @@ -94,13 +95,13 @@ type ReEncoder struct { // state: .WriteRune err error - par internal.Parser + par jsonparse.Parser written int inputPos int64 // state: .handleRune - lastNonSpace internal.RuneType - lastNonSpaceNonEOF internal.RuneType + lastNonSpace jsonparse.RuneType + lastNonSpaceNonEOF jsonparse.RuneType wasNumber bool curIndent int uhex [4]byte // "\uABCD"-encoded characters in strings @@ -135,15 +136,15 @@ func (specu *speculation) Reset() { type inputTuple struct { c rune - t internal.RuneType + t jsonparse.RuneType stackSize int } // public API ////////////////////////////////////////////////////////////////// var ( - _ internal.AllWriter = (*ReEncoder)(nil) - _ io.Closer = (*ReEncoder)(nil) + _ fastio.AllWriter = (*ReEncoder)(nil) + _ io.Closer = (*ReEncoder)(nil) ) // Write implements io.Writer; it does what you'd expect. @@ -208,7 +209,7 @@ func (enc *ReEncoder) WriteString(p string) (int, error) { // WriteByte implements io.ByteWriter; it does what you'd expect. func (enc *ReEncoder) WriteByte(b byte) error { - return internal.WriteByte(enc, b) + return fastio.WriteByte(enc, b) } // Close implements io.Closer; it does what you'd expect, mostly. @@ -230,7 +231,7 @@ func (enc *ReEncoder) Close() error { return enc.err } if len(enc.barriers) == 0 { - if err := enc.handleRune(0, internal.RuneTypeError, enc.stackSize()); err != nil { + if err := enc.handleRune(0, jsonparse.RuneTypeError, enc.stackSize()); err != nil { enc.err = &ReEncodeSyntaxError{ Err: err, Offset: enc.inputPos, @@ -274,7 +275,7 @@ rehandle: return enc.written, enc.err } enc.err = enc.handleRune(c, t, enc.stackSize()) - if enc.err == nil && t == internal.RuneTypeEOF { + if enc.err == nil && t == jsonparse.RuneTypeEOF { if enc.AllowMultipleValues && len(enc.barriers) == 0 { enc.par.Reset() goto rehandle @@ -319,7 +320,7 @@ func (enc *ReEncoder) stackSize() int { return sz } -func (enc *ReEncoder) handleRune(c rune, t internal.RuneType, stackSize int) error { +func (enc *ReEncoder) handleRune(c rune, t jsonparse.RuneType, stackSize int) error { if enc.CompactIfUnder == 0 || enc.Compact || enc.Indent == "" { return enc.handleRuneNoSpeculation(c, t) } @@ -327,7 +328,7 @@ func (enc *ReEncoder) handleRune(c rune, t internal.RuneType, stackSize int) err // main if !enc.specu.speculating { // not speculating switch t { - case internal.RuneTypeObjectBeg, internal.RuneTypeArrayBeg: // start speculating + case jsonparse.RuneTypeObjectBeg, jsonparse.RuneTypeArrayBeg: // start speculating if err, _ := enc.handleRunePre(c, t); err != nil { return err } @@ -385,7 +386,7 @@ func (enc *ReEncoder) handleRune(c rune, t internal.RuneType, stackSize int) err return nil } -func (enc *ReEncoder) handleRuneNoSpeculation(c rune, t internal.RuneType) error { +func (enc *ReEncoder) handleRuneNoSpeculation(c rune, t jsonparse.RuneType) error { err, shouldHandle := enc.handleRunePre(c, t) if err != nil { return err @@ -398,9 +399,9 @@ func (enc *ReEncoder) handleRuneNoSpeculation(c rune, t internal.RuneType) error // handleRunePre handles buffered things that need to happen before // the new rune itself is handled. -func (enc *ReEncoder) handleRunePre(c rune, t internal.RuneType) (error, bool) { +func (enc *ReEncoder) handleRunePre(c rune, t jsonparse.RuneType) (error, bool) { // emit newlines between top-level values - if enc.lastNonSpace == internal.RuneTypeEOF { + if enc.lastNonSpace == jsonparse.RuneTypeEOF { switch { case enc.wasNumber && t.IsNumber(): if err := enc.emitByte('\n'); err != nil { @@ -415,10 +416,10 @@ func (enc *ReEncoder) handleRunePre(c rune, t internal.RuneType) (error, bool) { // shorten numbers switch t { // trim trailing '0's from the fraction-part, but don't remove all digits - case internal.RuneTypeNumberFracDot: + case jsonparse.RuneTypeNumberFracDot: enc.fracZeros = 0 - case internal.RuneTypeNumberFracDig: - if c == '0' && enc.lastNonSpace == internal.RuneTypeNumberFracDig { + case jsonparse.RuneTypeNumberFracDig: + if c == '0' && enc.lastNonSpace == jsonparse.RuneTypeNumberFracDig { enc.fracZeros++ return nil, false } @@ -432,9 +433,9 @@ func (enc *ReEncoder) handleRunePre(c rune, t internal.RuneType) (error, bool) { } } switch t { // trim leading '0's from the exponent-part, but don't remove all digits - case internal.RuneTypeNumberExpE, internal.RuneTypeNumberExpSign: + case jsonparse.RuneTypeNumberExpE, jsonparse.RuneTypeNumberExpSign: enc.expZero = true - case internal.RuneTypeNumberExpDig: + case jsonparse.RuneTypeNumberExpDig: if c == '0' && enc.expZero { return nil, false } @@ -451,18 +452,18 @@ func (enc *ReEncoder) handleRunePre(c rune, t internal.RuneType) (error, bool) { // whitespace switch { case enc.Compact: - if t == internal.RuneTypeSpace { + if t == jsonparse.RuneTypeSpace { return nil, false } case enc.Indent != "": switch t { - case internal.RuneTypeSpace: + case jsonparse.RuneTypeSpace: // let us manage whitespace, don't pass it through return nil, false - case internal.RuneTypeObjectEnd, internal.RuneTypeArrayEnd: + case jsonparse.RuneTypeObjectEnd, jsonparse.RuneTypeArrayEnd: enc.curIndent-- switch enc.lastNonSpace { - case internal.RuneTypeObjectBeg, internal.RuneTypeArrayBeg: + case jsonparse.RuneTypeObjectBeg, jsonparse.RuneTypeArrayBeg: // collapse default: if err := enc.emitNlIndent(); err != nil { @@ -471,17 +472,17 @@ func (enc *ReEncoder) handleRunePre(c rune, t internal.RuneType) (error, bool) { } default: switch enc.lastNonSpace { - case internal.RuneTypeObjectBeg, internal.RuneTypeObjectComma, internal.RuneTypeArrayBeg, internal.RuneTypeArrayComma: + case jsonparse.RuneTypeObjectBeg, jsonparse.RuneTypeObjectComma, jsonparse.RuneTypeArrayBeg, jsonparse.RuneTypeArrayComma: if err := enc.emitNlIndent(); err != nil { return err, false } - case internal.RuneTypeObjectColon: + case jsonparse.RuneTypeObjectColon: if err := enc.emitByte(' '); err != nil { return err, false } } switch t { - case internal.RuneTypeObjectBeg, internal.RuneTypeArrayBeg: + case jsonparse.RuneTypeObjectBeg, jsonparse.RuneTypeArrayBeg: enc.curIndent++ } } @@ -491,15 +492,15 @@ func (enc *ReEncoder) handleRunePre(c rune, t internal.RuneType) (error, bool) { } // handleRuneMain handles the new rune itself, not buffered things. -func (enc *ReEncoder) handleRuneMain(c rune, t internal.RuneType) error { +func (enc *ReEncoder) handleRuneMain(c rune, t jsonparse.RuneType) error { var err error switch t { - case internal.RuneTypeStringChar: + case jsonparse.RuneTypeStringChar: err = enc.emit(writeStringChar(enc.out, c, BackslashEscapeNone, enc.BackslashEscape)) - case internal.RuneTypeStringEsc, internal.RuneTypeStringEscU: + case jsonparse.RuneTypeStringEsc, jsonparse.RuneTypeStringEscU: // do nothing - case internal.RuneTypeStringEsc1: + case jsonparse.RuneTypeStringEsc1: switch c { case '"': err = enc.emit(writeStringChar(enc.out, '"', BackslashEscapeShort, enc.BackslashEscape)) @@ -520,14 +521,14 @@ func (enc *ReEncoder) handleRuneMain(c rune, t internal.RuneType) error { default: panic("should not happen") } - case internal.RuneTypeStringEscUA: - enc.uhex[0], _ = internal.HexToInt(c) - case internal.RuneTypeStringEscUB: - enc.uhex[1], _ = internal.HexToInt(c) - case internal.RuneTypeStringEscUC: - enc.uhex[2], _ = internal.HexToInt(c) - case internal.RuneTypeStringEscUD: - enc.uhex[3], _ = internal.HexToInt(c) + case jsonparse.RuneTypeStringEscUA: + enc.uhex[0], _ = jsonparse.HexToInt(c) + case jsonparse.RuneTypeStringEscUB: + enc.uhex[1], _ = jsonparse.HexToInt(c) + case jsonparse.RuneTypeStringEscUC: + enc.uhex[2], _ = jsonparse.HexToInt(c) + case jsonparse.RuneTypeStringEscUD: + enc.uhex[3], _ = jsonparse.HexToInt(c) c := 0 | rune(enc.uhex[0])<<12 | rune(enc.uhex[1])<<8 | @@ -535,24 +536,24 @@ func (enc *ReEncoder) handleRuneMain(c rune, t internal.RuneType) error { rune(enc.uhex[3])<<0 err = enc.emit(writeStringChar(enc.out, c, BackslashEscapeUnicode, enc.BackslashEscape)) - case internal.RuneTypeError: // EOF explicitly stated by .Close() + case jsonparse.RuneTypeError: // EOF explicitly stated by .Close() fallthrough - case internal.RuneTypeEOF: // EOF implied by the start of the next top-level value + case jsonparse.RuneTypeEOF: // EOF implied by the start of the next top-level value enc.wasNumber = enc.lastNonSpace.IsNumber() switch { case enc.ForceTrailingNewlines && len(enc.barriers) == 0: - t = internal.RuneTypeError // enc.lastNonSpace : an NL isn't needed (we already printed one) + t = jsonparse.RuneTypeError // enc.lastNonSpace : an NL isn't needed (we already printed one) err = enc.emitByte('\n') default: - t = internal.RuneTypeEOF // enc.lastNonSpace : an NL *might* be needed + t = jsonparse.RuneTypeEOF // enc.lastNonSpace : an NL *might* be needed } default: err = enc.emitByte(byte(c)) } - if t != internal.RuneTypeSpace { + if t != jsonparse.RuneTypeSpace { enc.lastNonSpace = t - if t != internal.RuneTypeEOF { + if t != jsonparse.RuneTypeEOF { enc.lastNonSpaceNonEOF = t } } @@ -9,7 +9,7 @@ import ( "git.lukeshu.com/go/typedsync" - "git.lukeshu.com/go/lowmemjson/internal" + "git.lukeshu.com/go/lowmemjson/internal/jsontags" ) type structField struct { @@ -157,7 +157,7 @@ func indexStructInner(typ reflect.Type, byPos *[]structField, byName map[string] if tag == "-" { continue } - tagName, opts := internal.ParseTag(tag) + tagName, opts := jsontags.ParseTag(tag) name := tagName if !isValidTag(name) { name = "" |