]> Cypherpunks repositories - gostls13.git/commitdiff
reflect: use Value.Len instead of conversion to slice header
authorNevkontakte <aleks@nevkontakte.com>
Mon, 13 Sep 2021 22:40:30 +0000 (22:40 +0000)
committerIan Lance Taylor <iant@golang.org>
Tue, 14 Sep 2021 00:16:36 +0000 (00:16 +0000)
This change is functionally equivalent, but reduces reliance on unsafe
features. This would allow GopherJS to avoid an additional patch to the
standard library we'd have to maintain in order to remain compatible
with Go 1.17+.

Change-Id: I4f113db0c572ec0b81ebfecf5a137145f6c8c41d
GitHub-Last-Rev: 94ebb393bac93579b6455555822691c0d69e2d42
GitHub-Pull-Request: golang/go#48346
Reviewed-on: https://go-review.googlesource.com/c/go/+/349469
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Trust: Keith Randall <khr@golang.org>
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>

src/reflect/value.go

index bc48a76ce665b9fe9b7c394ef7bd3b4ea1efd1a2..33b81d72092e19c1020893fb00b7baa8020f07be 100644 (file)
@@ -2940,8 +2940,7 @@ func (v Value) CanConvert(t Type) bool {
        // from slice to pointer-to-array.
        if vt.Kind() == Slice && t.Kind() == Ptr && t.Elem().Kind() == Array {
                n := t.Elem().Len()
-               h := (*unsafeheader.Slice)(v.ptr)
-               if n > h.Len {
+               if n > v.Len() {
                        return false
                }
        }
@@ -3208,10 +3207,10 @@ func cvtStringRunes(v Value, t Type) Value {
 // convertOp: []T -> *[N]T
 func cvtSliceArrayPtr(v Value, t Type) Value {
        n := t.Elem().Len()
-       h := (*unsafeheader.Slice)(v.ptr)
-       if n > h.Len {
-               panic("reflect: cannot convert slice with length " + itoa.Itoa(h.Len) + " to pointer to array with length " + itoa.Itoa(n))
+       if n > v.Len() {
+               panic("reflect: cannot convert slice with length " + itoa.Itoa(v.Len()) + " to pointer to array with length " + itoa.Itoa(n))
        }
+       h := (*unsafeheader.Slice)(v.ptr)
        return Value{t.common(), h.Data, v.flag&^(flagIndir|flagAddr|flagKindMask) | flag(Ptr)}
 }