]> Cypherpunks repositories - gostls13.git/commitdiff
reflect: in assignTo only allocate target if needed
authorIan Lance Taylor <iant@golang.org>
Sun, 17 Apr 2022 01:28:29 +0000 (18:28 -0700)
committerGopher Robot <gobot@golang.org>
Thu, 21 Apr 2022 23:38:34 +0000 (23:38 +0000)
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>
src/reflect/value.go

index 6fe3cee01717f07d80dea9f7622b7c2a0c87d078..de24d4c712101227bbbca427134ed53bfcf80c51 100644 (file)
@@ -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 {