summaryrefslogtreecommitdiff
path: root/lib/lowmemjson/decode.go
diff options
context:
space:
mode:
Diffstat (limited to 'lib/lowmemjson/decode.go')
-rw-r--r--lib/lowmemjson/decode.go46
1 files changed, 30 insertions, 16 deletions
diff --git a/lib/lowmemjson/decode.go b/lib/lowmemjson/decode.go
index f9ea8a2..03d5b7a 100644
--- a/lib/lowmemjson/decode.go
+++ b/lib/lowmemjson/decode.go
@@ -449,17 +449,25 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) {
case reflect.Slice:
switch {
case typ.Elem().Kind() == reflect.Uint8:
- var buf bytes.Buffer
- dec.decodeString(newBase64Decoder(&buf))
- if typ.Elem() == byteType {
- val.Set(reflect.ValueOf(buf.Bytes()))
- } else {
- bs := buf.Bytes()
- // TODO: Surely there's a better way.
- val.Set(reflect.MakeSlice(typ, len(bs), len(bs)))
- for i := 0; i < len(bs); i++ {
- val.Index(i).Set(reflect.ValueOf(bs[i]).Convert(typ.Elem()))
+ switch dec.peekRune() {
+ case 'n':
+ dec.decodeNull()
+ val.Set(reflect.Zero(typ))
+ case '"':
+ var buf bytes.Buffer
+ dec.decodeString(newBase64Decoder(&buf))
+ if typ.Elem() == byteType {
+ val.Set(reflect.ValueOf(buf.Bytes()))
+ } else {
+ bs := buf.Bytes()
+ // TODO: Surely there's a better way.
+ val.Set(reflect.MakeSlice(typ, len(bs), len(bs)))
+ for i := 0; i < len(bs); i++ {
+ val.Index(i).Set(reflect.ValueOf(bs[i]).Convert(typ.Elem()))
+ }
}
+ default:
+ dec.panicSyntax(fmt.Errorf("byte slice: expected %q or %q but got %q", 'n', '"', dec.peekRune()))
}
default:
switch dec.peekRune() {
@@ -512,13 +520,15 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) {
switch dec.peekRune() {
case 'n':
dec.decodeNull()
- for typ.Elem().Kind() == reflect.Pointer {
- if val.IsNil() || !val.Elem().CanSet() {
- val.Set(reflect.New(typ.Elem()))
+ /*
+ for typ.Elem().Kind() == reflect.Pointer {
+ if val.IsNil() || !val.Elem().CanSet() {
+ val.Set(reflect.New(typ.Elem()))
+ }
+ val = val.Elem()
+ typ = val.Type()
}
- val = val.Elem()
- typ = val.Type()
- }
+ */
val.Set(reflect.Zero(typ))
default:
if val.IsNil() {
@@ -733,6 +743,10 @@ func (dec *Decoder) decodeString(out io.Writer) {
if _, err := writeRune(out, '\\'); err != nil {
dec.panicSyntax(err)
}
+ case '/':
+ if _, err := writeRune(out, '/'); err != nil {
+ dec.panicSyntax(err)
+ }
case 'b':
if _, err := writeRune(out, '\b'); err != nil {
dec.panicSyntax(err)