mirror of
https://github.com/golang/go
synced 2024-11-24 06:50:17 -07:00
reflect: in assignTo only allocate target if needed
Also correct parameter name in comment. Change-Id: Ic9486e08c2eea184faccf181cda7da808793def6 Reviewed-on: https://go-review.googlesource.com/c/go/+/400674 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Dan Kortschak <dan@kortschak.io> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Joseph Tsai <joetsai@digital-static.net> Reviewed-by: Ian Lance Taylor <iant@google.com> Auto-Submit: Ian Lance Taylor <iant@google.com> Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
This commit is contained in:
parent
bb004a179a
commit
01837ca7eb
@ -3056,9 +3056,10 @@ func NewAt(typ Type, p unsafe.Pointer) Value {
|
||||
return Value{t.ptrTo(), p, fl}
|
||||
}
|
||||
|
||||
// assignTo returns a value v that can be assigned directly to typ.
|
||||
// It panics if v is not assignable to typ.
|
||||
// For a conversion to an interface type, target is a suggested scratch space to use.
|
||||
// assignTo returns a value v that can be assigned directly to dst.
|
||||
// It panics if v is not assignable to dst.
|
||||
// For a conversion to an interface type, target, if not nil,
|
||||
// is a suggested scratch space to use.
|
||||
// target must be initialized memory (or nil).
|
||||
func (v Value) assignTo(context string, dst *rtype, target unsafe.Pointer) Value {
|
||||
if v.flag&flagMethod != 0 {
|
||||
@ -3074,9 +3075,6 @@ func (v Value) assignTo(context string, dst *rtype, target unsafe.Pointer) Value
|
||||
return Value{dst, v.ptr, fl}
|
||||
|
||||
case implements(dst, v.typ):
|
||||
if target == nil {
|
||||
target = unsafe_New(dst)
|
||||
}
|
||||
if v.Kind() == Interface && v.IsNil() {
|
||||
// A nil ReadWriter passed to nil Reader is OK,
|
||||
// but using ifaceE2I below will panic.
|
||||
@ -3084,6 +3082,9 @@ func (v Value) assignTo(context string, dst *rtype, target unsafe.Pointer) Value
|
||||
return Value{dst, nil, flag(Interface)}
|
||||
}
|
||||
x := valueInterface(v, false)
|
||||
if target == nil {
|
||||
target = unsafe_New(dst)
|
||||
}
|
||||
if dst.NumMethod() == 0 {
|
||||
*(*any)(target) = x
|
||||
} else {
|
||||
|
Loading…
Reference in New Issue
Block a user