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() value = value.Elem()
} }
if v.Type().Elem() != value.Type() { value, err = convert(v.Type().Elem(), value)
//nv, err := convert(v.Type().Elem(), value) if err != nil {
//if err != nil { return err
return fmt.Errorf("cannot assign '%s' to '%s'", value.Type(), v.Type().Elem())
//}
//value = nv
} }
newSlice := reflect.Append(v, value) 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 // TODO: this function acts as a switchboard. Runtime has enough information to
// generate per-type functions avoiding the double type switches. // generate per-type functions avoiding the double type switches.
func convert(t reflect.Type, value reflect.Value) (reflect.Value, error) { func convert(t reflect.Type, value reflect.Value) (reflect.Value, error) {
result := value
if value.Type().AssignableTo(t) { if value.Type().AssignableTo(t) {
return result, nil return value, nil
} }
returnPtr := false
if value.Kind() == reflect.Ptr { if value.Kind() == reflect.Ptr {
if t.Kind() != reflect.Ptr { if t.Kind() != reflect.Ptr {
return reflect.Value{}, fmt.Errorf("cannot convert pointer to non-pointer") 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() value = value.Elem()
t = t.Elem() t = t.Elem()
returnPtr = true
} }
var err error var err error
@@ -486,8 +483,11 @@ func convert(t reflect.Type, value reflect.Value) (reflect.Value, error) {
return value, err return value, err
} }
result = reflect.New(t) result := reflect.New(t) // TODO: remove alloc
result.Elem().Set(value.Convert(t)) result.Elem().Set(value.Convert(t))
if returnPtr {
return result, nil
}
return result.Elem(), nil return result.Elem(), nil
} }