Allocate slice if needed

This commit is contained in:
Thomas Pelletier
2021-03-08 21:41:03 -05:00
parent 87b9d1cf98
commit a1c9b661b4
3 changed files with 15 additions and 14 deletions
@@ -1827,9 +1827,7 @@ type arrayTooSmallStruct struct {
func TestUnmarshalSlice(t *testing.T) {
var actual sliceStruct
err := toml.Unmarshal(sliceTomlDemo, &actual)
if err != nil {
t.Error("shound not err", err)
}
require.NoError(t, err)
expected := sliceStruct{
Slice: []string{"Howdy", "Hey There"},
SlicePtr: &[]string{"Howdy", "Hey There"},
@@ -1838,10 +1836,7 @@ func TestUnmarshalSlice(t *testing.T) {
StructSlice: []basicMarshalTestSubStruct{{"1"}, {"2"}},
StructSlicePtr: &[]basicMarshalTestSubStruct{{"1"}, {"2"}},
}
if !reflect.DeepEqual(actual, expected) {
t.Errorf("Bad unmarshal: expected %v, got %v", expected, actual)
}
assert.Equal(t, expected, actual)
}
func TestUnmarshalSliceFail(t *testing.T) {
+6
View File
@@ -380,6 +380,12 @@ func (b *Builder) SliceNewElem() error {
v := t.get()
if v.Kind() == reflect.Ptr {
// if the pointer is nil we need to allocate the slice
if v.IsNil() {
x := reflect.New(v.Type().Elem())
v.Set(x)
}
// target the slice itself
v = v.Elem()
}
+7 -7
View File
@@ -165,7 +165,7 @@ func (u *unmarshaler) BoolValue(b bool) {
if u.skipping() || u.err != nil {
return
}
if u.builder.IsSlice() {
if u.builder.IsSliceOrPtr() {
u.builder.Save()
u.err = u.builder.SliceAppend(reflect.ValueOf(&b))
if u.err != nil {
@@ -181,7 +181,7 @@ func (u *unmarshaler) FloatValue(n float64) {
if u.skipping() || u.err != nil {
return
}
if u.builder.IsSlice() {
if u.builder.IsSliceOrPtr() {
u.builder.Save()
u.err = u.builder.SliceAppend(reflect.ValueOf(&n))
if u.err != nil {
@@ -198,7 +198,7 @@ func (u *unmarshaler) IntValue(n int64) {
if u.skipping() || u.err != nil {
return
}
if u.builder.IsSlice() {
if u.builder.IsSliceOrPtr() {
u.builder.Save()
u.err = u.builder.SliceAppend(reflect.ValueOf(&n))
if u.err != nil {
@@ -214,7 +214,7 @@ func (u *unmarshaler) LocalDateValue(date LocalDate) {
if u.skipping() || u.err != nil {
return
}
if u.builder.IsSlice() {
if u.builder.IsSliceOrPtr() {
u.builder.Save()
u.err = u.builder.SliceAppend(reflect.ValueOf(&date))
if u.err != nil {
@@ -230,7 +230,7 @@ func (u *unmarshaler) LocalDateTimeValue(dt LocalDateTime) {
if u.skipping() || u.err != nil {
return
}
if u.builder.IsSlice() {
if u.builder.IsSliceOrPtr() {
u.builder.Save()
u.err = u.builder.SliceAppend(reflect.ValueOf(&dt))
if u.err != nil {
@@ -246,7 +246,7 @@ func (u *unmarshaler) DateTimeValue(dt time.Time) {
if u.skipping() || u.err != nil {
return
}
if u.builder.IsSlice() {
if u.builder.IsSliceOrPtr() {
u.builder.Save()
u.err = u.builder.SliceAppend(reflect.ValueOf(&dt))
if u.err != nil {
@@ -262,7 +262,7 @@ func (u *unmarshaler) LocalTimeValue(localTime LocalTime) {
if u.skipping() || u.err != nil {
return
}
if u.builder.IsSlice() {
if u.builder.IsSliceOrPtr() {
u.builder.Save()
u.err = u.builder.SliceAppend(reflect.ValueOf(&localTime))
if u.err != nil {