Ensure that slices have been allocated when entering array
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user