From: David Crawshaw Date: Fri, 25 Mar 2016 18:28:15 +0000 (-0400) Subject: reflect: test name data is aligned X-Git-Tag: go1.7beta1~1091 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=640164bc1ca8382fc02ab978f7857d01d4262eb7;p=gostls13.git reflect: test name data is aligned For #14962. Change-Id: I3539d882487c99dee99ac953e039b79c6b963cf9 Reviewed-on: https://go-review.googlesource.com/21150 Reviewed-by: Ian Lance Taylor Run-TryBot: David Crawshaw TryBot-Result: Gobot Gobot --- diff --git a/src/reflect/all_test.go b/src/reflect/all_test.go index b0a2608afb..ebd352ca46 100644 --- a/src/reflect/all_test.go +++ b/src/reflect/all_test.go @@ -5065,3 +5065,16 @@ func TestNames(t *testing.T) { } } } + +type embed struct { + EmbedWithUnexpMeth +} + +func TestNameBytesAreAligned(t *testing.T) { + typ := TypeOf(embed{}) + b := FirstMethodNameBytes(typ) + v := uintptr(unsafe.Pointer(b)) + if v%unsafe.Alignof((*byte)(nil)) != 0 { + t.Errorf("reflect.name.bytes pointer is not aligned: %x", v) + } +} diff --git a/src/reflect/export_test.go b/src/reflect/export_test.go index e518a16b53..9db6967ffa 100644 --- a/src/reflect/export_test.go +++ b/src/reflect/export_test.go @@ -70,3 +70,27 @@ func CachedBucketOf(m Type) Type { tt := (*mapType)(unsafe.Pointer(t)) return tt.bucket } + +type EmbedWithUnexpMeth struct{} + +func (EmbedWithUnexpMeth) f() {} + +type pinUnexpMeth interface { + f() +} + +var pinUnexpMethI = pinUnexpMeth(EmbedWithUnexpMeth{}) + +func FirstMethodNameBytes(t Type) *byte { + _ = pinUnexpMethI + + ut := t.uncommon() + if ut == nil { + panic("type has no methods") + } + m := ut.methods[0] + if *m.name.data(0)&(1<<2) == 0 { + panic("method name does not have pkgPath *string") + } + return m.name.bytes +}