Convert returns pointer if a pointer is passed
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user