summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2023-02-07 12:18:29 -0700
committerLuke Shumaker <lukeshu@lukeshu.com>2023-02-07 14:05:26 -0700
commit2b9473f5e8816eeea76b2fdada184532be00d3a2 (patch)
tree387757b00f02521d1b3824a0e92f7778dbd32440
parenteab38672b2467810592b61fe5b0067086d3cbd2c (diff)
internal: Split in to sub-packages
-rw-r--r--compat/json/compat_test.go14
-rw-r--r--decode.go164
-rw-r--r--decode_scan.go18
-rw-r--r--decode_scan_test.go240
-rw-r--r--encode_string.go26
-rw-r--r--errors.go4
-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.go95
-rw-r--r--struct.go4
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)
}
diff --git a/decode.go b/decode.go
index 8638148..3a9a4b1 100644
--- a/decode.go
+++ b/decode.go
@@ -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)
}
}
diff --git a/errors.go b/errors.go
index fe48723..0a47db4 100644
--- a/errors.go
+++ b/errors.go
@@ -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
}
}
diff --git a/struct.go b/struct.go
index 81bc22d..5ccb62f 100644
--- a/struct.go
+++ b/struct.go
@@ -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 = ""