diff options
Diffstat (limited to 'lib/lowmemjson/decode.go')
-rw-r--r-- | lib/lowmemjson/decode.go | 46 |
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) |