Convert returns pointer if a pointer is passed

This commit is contained in:
Thomas Pelletier
2021-03-08 10:01:56 -05:00
parent f698c102c7
commit c35bcc5519
+10 -10
View File
@@ -428,12 +428,9 @@ func (b *Builder) SliceAppend(value reflect.Value) error {
value = value.Elem()
}
if v.Type().Elem() != value.Type() {
//nv, err := convert(v.Type().Elem(), value)
//if err != nil {
return fmt.Errorf("cannot assign '%s' to '%s'", value.Type(), v.Type().Elem())
//}
//value = nv
value, err = convert(v.Type().Elem(), value)
if err != nil {
return err
}
newSlice := reflect.Append(v, value)
@@ -455,12 +452,11 @@ func (b *Builder) SliceAppend(value reflect.Value) error {
// TODO: this function acts as a switchboard. Runtime has enough information to
// generate per-type functions avoiding the double type switches.
func convert(t reflect.Type, value reflect.Value) (reflect.Value, error) {
result := value
if value.Type().AssignableTo(t) {
return result, nil
return value, nil
}
returnPtr := false
if value.Kind() == reflect.Ptr {
if t.Kind() != reflect.Ptr {
return reflect.Value{}, fmt.Errorf("cannot convert pointer to non-pointer")
@@ -468,6 +464,7 @@ func convert(t reflect.Type, value reflect.Value) (reflect.Value, error) {
value = value.Elem()
t = t.Elem()
returnPtr = true
}
var err error
@@ -486,8 +483,11 @@ func convert(t reflect.Type, value reflect.Value) (reflect.Value, error) {
return value, err
}
result = reflect.New(t)
result := reflect.New(t) // TODO: remove alloc
result.Elem().Set(value.Convert(t))
if returnPtr {
return result, nil
}
return result.Elem(), nil
}