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)
|
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 {
|
func checkKindInt(rt reflect.Type) error {
|
||||||
switch rt.Kind() {
|
switch rt.Kind() {
|
||||||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
||||||
|
|||||||
@@ -65,6 +65,10 @@ func (u *unmarshaler) ArrayBegin() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
u.builder.Save()
|
u.builder.Save()
|
||||||
|
u.err = u.builder.EnsureSlice()
|
||||||
|
if u.err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
if u.assign {
|
if u.assign {
|
||||||
u.assign = false
|
u.assign = false
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user