Commit 1d6ccc5f by Ian Lance Taylor

reflect: fix StructOf hash and string

    
    Adjust the hash and string fields computed by StructOf to match the
    values that the compiler computes for a struct type with the same
    field names and types.  This makes the reflect code match the
    compiler's Type::hash_for_method and Type::reflection methods.
    
    Fixes golang/go#25284
    
    Reviewed-on: https://go-review.googlesource.com/116515

From-SVN: r261235
parent 1336795a
8b6c7f3f9762366bab96ea95b966e93e2593be13 baf289294a026ddd30c9e4341aff528084337763
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.
...@@ -4411,6 +4411,17 @@ func TestStructOf(t *testing.T) { ...@@ -4411,6 +4411,17 @@ func TestStructOf(t *testing.T) {
}) })
// check that type already in binary is found // check that type already in binary is found
checkSameType(t, StructOf(fields[2:3]), struct{ Y uint64 }{}) checkSameType(t, StructOf(fields[2:3]), struct{ Y uint64 }{})
// gccgo used to fail this test.
type structFieldType interface{}
checkSameType(t,
StructOf([]StructField{
StructField{
Name: "F",
Type: TypeOf((*structFieldType)(nil)).Elem(),
},
}),
struct{ F structFieldType }{})
} }
func TestStructOfExportRules(t *testing.T) { func TestStructOfExportRules(t *testing.T) {
......
...@@ -1912,7 +1912,7 @@ func isValidFieldName(fieldName string) bool { ...@@ -1912,7 +1912,7 @@ func isValidFieldName(fieldName string) bool {
// This limitation may be lifted in a future version. // This limitation may be lifted in a future version.
func StructOf(fields []StructField) Type { func StructOf(fields []StructField) Type {
var ( var (
hash = uint32(0) hash = uint32(12)
size uintptr size uintptr
typalign int8 typalign int8
comparable = true comparable = true
...@@ -1997,7 +1997,7 @@ func StructOf(fields []StructField) Type { ...@@ -1997,7 +1997,7 @@ func StructOf(fields []StructField) Type {
} }
fset[name] = struct{}{} fset[name] = struct{}{}
repr = append(repr, (" " + ft.String())...) repr = append(repr, (" " + *ft.string)...)
if f.tag != nil { if f.tag != nil {
repr = append(repr, (" " + strconv.Quote(*f.tag))...) repr = append(repr, (" " + strconv.Quote(*f.tag))...)
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment