From 978143ce99a2db9da7bf5a7d46e9f7a3e9ad1e58 Mon Sep 17 00:00:00 2001 From: Thomas Pelletier Date: Fri, 19 Feb 2021 08:53:19 -0500 Subject: [PATCH] Ensure that slices have been allocated when entering array --- internal/reflectbuild/reflectbuild.go | 15 +++++++++++++++ unmarshal.go | 4 ++++ 2 files changed, 19 insertions(+) diff --git a/internal/reflectbuild/reflectbuild.go b/internal/reflectbuild/reflectbuild.go index d2ce732..4a67797 100644 --- a/internal/reflectbuild/reflectbuild.go +++ b/internal/reflectbuild/reflectbuild.go @@ -490,6 +490,21 @@ func (b *Builder) Set(v reflect.Value) error { return t.set(v) } +// EnsureSlice makes sure that the cursor points to a non-nil slice. +func (b *Builder) EnsureSlice() error { + t := b.top() + v := t.get() + if v.Kind() != reflect.Slice { + return IncorrectKindError{Actual: v.Kind(), Expected: reflect.Slice} + } + + if v.IsNil() { + v.Set(reflect.MakeSlice(v.Type(), 0, 0)) + } + + return nil +} + func checkKindInt(rt reflect.Type) error { switch rt.Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: diff --git a/unmarshal.go b/unmarshal.go index 43f8a94..3dd4559 100644 --- a/unmarshal.go +++ b/unmarshal.go @@ -65,6 +65,10 @@ func (u *unmarshaler) ArrayBegin() { return } u.builder.Save() + u.err = u.builder.EnsureSlice() + if u.err != nil { + return + } if u.assign { u.assign = false } else {