From: Ian Lance Taylor Date: Sun, 17 Apr 2022 01:28:29 +0000 (-0700) Subject: reflect: in assignTo only allocate target if needed X-Git-Tag: go1.19beta1~584 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=01837ca7eb7d83dcbf760c032e1b25320f200510;p=gostls13.git 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 TryBot-Result: Gopher Robot Reviewed-by: Dan Kortschak Reviewed-by: Brad Fitzpatrick Reviewed-by: Joseph Tsai Reviewed-by: Ian Lance Taylor Auto-Submit: Ian Lance Taylor Reviewed-by: Dmitri Shuralyov --- diff --git a/src/reflect/value.go b/src/reflect/value.go index 6fe3cee017..de24d4c712 100644 --- a/src/reflect/value.go +++ b/src/reflect/value.go @@ -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 {