diff options
author | Yvan Roux <yvan.roux@linaro.org> | 2015-11-10 10:30:16 +0100 |
---|---|---|
committer | Yvan Roux <yvan.roux@linaro.org> | 2015-11-12 19:23:23 +0000 |
commit | 4c4566ae0c0962f52ccb4270c9c111dd17c6ac1a (patch) | |
tree | abe90f6ec33b35a2b3a11e80948f3951195d260f /libgo | |
parent | 9846c8ca894521dc270ac5f8df290a0ae2264a64 (diff) |
Merge branches/gcc-5-branch rev 230068.
Change-Id: I95e1aeee6fd98bc5771de9c6c3c8e7fcfad72976
Diffstat (limited to 'libgo')
-rw-r--r-- | libgo/go/encoding/json/decode_test.go | 16 | ||||
-rw-r--r-- | libgo/go/encoding/json/encode.go | 2 | ||||
-rw-r--r-- | libgo/go/encoding/xml/marshal_test.go | 10 | ||||
-rw-r--r-- | libgo/go/encoding/xml/typeinfo.go | 2 | ||||
-rw-r--r-- | libgo/go/reflect/export_test.go | 4 | ||||
-rw-r--r-- | libgo/go/reflect/type.go | 2 | ||||
-rw-r--r-- | libgo/go/reflect/value.go | 29 |
7 files changed, 47 insertions, 18 deletions
diff --git a/libgo/go/encoding/json/decode_test.go b/libgo/go/encoding/json/decode_test.go index 7235969b9fe..0e6e3c0e26b 100644 --- a/libgo/go/encoding/json/decode_test.go +++ b/libgo/go/encoding/json/decode_test.go @@ -117,6 +117,7 @@ type Top struct { Loop Embed0p // has Point with X, Y, used Embed0q // has Point with Z, used + embed // contains exported field } type Embed0 struct { @@ -147,6 +148,10 @@ type Embed0q struct { Point } +type embed struct { + Q int +} + type Loop struct { Loop1 int `json:",omitempty"` Loop2 int `json:",omitempty"` @@ -321,7 +326,8 @@ var unmarshalTests = []unmarshalTest{ "Loop2": 14, "X": 15, "Y": 16, - "Z": 17 + "Z": 17, + "Q": 18 }`, ptr: new(Top), out: Top{ @@ -351,6 +357,9 @@ var unmarshalTests = []unmarshalTest{ Embed0q: Embed0q{ Point: Point{Z: 17}, }, + embed: embed{ + Q: 18, + }, }, }, { @@ -497,12 +506,15 @@ func TestMarshalEmbeds(t *testing.T) { Embed0q: Embed0q{ Point: Point{Z: 17}, }, + embed: embed{ + Q: 18, + }, } b, err := Marshal(top) if err != nil { t.Fatal(err) } - want := "{\"Level0\":1,\"Level1b\":2,\"Level1c\":3,\"Level1a\":5,\"LEVEL1B\":6,\"e\":{\"Level1a\":8,\"Level1b\":9,\"Level1c\":10,\"Level1d\":11,\"x\":12},\"Loop1\":13,\"Loop2\":14,\"X\":15,\"Y\":16,\"Z\":17}" + want := "{\"Level0\":1,\"Level1b\":2,\"Level1c\":3,\"Level1a\":5,\"LEVEL1B\":6,\"e\":{\"Level1a\":8,\"Level1b\":9,\"Level1c\":10,\"Level1d\":11,\"x\":12},\"Loop1\":13,\"Loop2\":14,\"X\":15,\"Y\":16,\"Z\":17,\"Q\":18}" if string(b) != want { t.Errorf("Wrong marshal result.\n got: %q\nwant: %q", b, want) } diff --git a/libgo/go/encoding/json/encode.go b/libgo/go/encoding/json/encode.go index fca2a0980b2..80709bb764e 100644 --- a/libgo/go/encoding/json/encode.go +++ b/libgo/go/encoding/json/encode.go @@ -1024,7 +1024,7 @@ func typeFields(t reflect.Type) []field { // Scan f.typ for fields to include. for i := 0; i < f.typ.NumField(); i++ { sf := f.typ.Field(i) - if sf.PkgPath != "" { // unexported + if sf.PkgPath != "" && !sf.Anonymous { // unexported continue } tag := sf.Tag.Get("json") diff --git a/libgo/go/encoding/xml/marshal_test.go b/libgo/go/encoding/xml/marshal_test.go index 14f73a75d5f..a6082a2f2ee 100644 --- a/libgo/go/encoding/xml/marshal_test.go +++ b/libgo/go/encoding/xml/marshal_test.go @@ -138,6 +138,7 @@ type EmbedA struct { EmbedC EmbedB EmbedB FieldA string + embedD } type EmbedB struct { @@ -152,6 +153,11 @@ type EmbedC struct { FieldC string } +type embedD struct { + fieldD string + FieldE string // Promoted and visible when embedD is embedded. +} + type NameCasing struct { XMLName struct{} `xml:"casing"` Xy string @@ -637,6 +643,9 @@ var marshalTests = []struct { }, }, FieldA: "A.A", + embedD: embedD{ + FieldE: "A.D.E", + }, }, ExpectXML: `<EmbedA>` + `<FieldB>A.C.B</FieldB>` + @@ -650,6 +659,7 @@ var marshalTests = []struct { `<FieldC>A.B.C.C</FieldC>` + `</EmbedB>` + `<FieldA>A.A</FieldA>` + + `<FieldE>A.D.E</FieldE>` + `</EmbedA>`, }, diff --git a/libgo/go/encoding/xml/typeinfo.go b/libgo/go/encoding/xml/typeinfo.go index 22248d20a6d..6766b88f09a 100644 --- a/libgo/go/encoding/xml/typeinfo.go +++ b/libgo/go/encoding/xml/typeinfo.go @@ -60,7 +60,7 @@ func getTypeInfo(typ reflect.Type) (*typeInfo, error) { n := typ.NumField() for i := 0; i < n; i++ { f := typ.Field(i) - if f.PkgPath != "" || f.Tag.Get("xml") == "-" { + if (f.PkgPath != "" && !f.Anonymous) || f.Tag.Get("xml") == "-" { continue // Private field } diff --git a/libgo/go/reflect/export_test.go b/libgo/go/reflect/export_test.go index 49c45e82b2e..715a08f62e1 100644 --- a/libgo/go/reflect/export_test.go +++ b/libgo/go/reflect/export_test.go @@ -6,13 +6,13 @@ package reflect // MakeRO returns a copy of v with the read-only flag set. func MakeRO(v Value) Value { - v.flag |= flagRO + v.flag |= flagStickyRO return v } // IsRO reports whether v's read-only flag is set. func IsRO(v Value) bool { - return v.flag&flagRO != 0 + return v.flag&flagStickyRO != 0 } var ArrayOf = arrayOf diff --git a/libgo/go/reflect/type.go b/libgo/go/reflect/type.go index 5cbf7e577a3..0d53bfc725d 100644 --- a/libgo/go/reflect/type.go +++ b/libgo/go/reflect/type.go @@ -517,7 +517,7 @@ func (t *uncommonType) Method(i int) (m Method) { fl := flag(Func) if p.pkgPath != nil { m.PkgPath = *p.pkgPath - fl |= flagRO + fl |= flagStickyRO } mt := p.typ m.Type = toType(mt) diff --git a/libgo/go/reflect/value.go b/libgo/go/reflect/value.go index 7cc4f7f8bfd..31fd9cf0ff8 100644 --- a/libgo/go/reflect/value.go +++ b/libgo/go/reflect/value.go @@ -40,7 +40,8 @@ type Value struct { // flag holds metadata about the value. // The lowest bits are flag bits: - // - flagRO: obtained via unexported field, so read-only + // - flagStickyRO: obtained via unexported not embedded field, so read-only + // - flagEmbedRO: obtained via unexported embedded field, so read-only // - flagIndir: val holds a pointer to the data // - flagAddr: v.CanAddr is true (implies flagIndir) // - flagMethod: v is a method value. @@ -63,12 +64,14 @@ type flag uintptr const ( flagKindWidth = 5 // there are 27 kinds flagKindMask flag = 1<<flagKindWidth - 1 - flagRO flag = 1 << 5 - flagIndir flag = 1 << 6 - flagAddr flag = 1 << 7 - flagMethod flag = 1 << 8 - flagMethodFn flag = 1 << 9 // gccgo: first fn parameter is always pointer - flagMethodShift = 10 + flagStickyRO flag = 1 << 5 + flagEmbedRO flag = 1 << 6 + flagIndir flag = 1 << 7 + flagAddr flag = 1 << 8 + flagMethod flag = 1 << 9 + flagMethodFn flag = 1 << 10 // gccgo: first fn parameter is always pointer + flagMethodShift = 11 + flagRO flag = flagStickyRO | flagEmbedRO ) func (f flag) kind() Kind { @@ -613,11 +616,15 @@ func (v Value) Field(i int) Value { field := &tt.fields[i] typ := field.typ - // Inherit permission bits from v. - fl := v.flag&(flagRO|flagIndir|flagAddr) | flag(typ.Kind()) + // Inherit permission bits from v, but clear flagEmbedRO. + fl := v.flag&(flagStickyRO|flagIndir|flagAddr) | flag(typ.Kind()) // Using an unexported field forces flagRO. if field.pkgPath != nil { - fl |= flagRO + if field.name == nil { + fl |= flagEmbedRO + } else { + fl |= flagStickyRO + } } // Either flagIndir is set and v.ptr points at struct, // or flagIndir is not set and v.ptr is the actual struct data. @@ -982,7 +989,7 @@ func (v Value) Method(i int) Value { if v.typ.Kind() == Interface && v.IsNil() { panic("reflect: Method on nil interface value") } - fl := v.flag & (flagRO | flagIndir) + fl := v.flag & (flagStickyRO | flagIndir) // Clear flagEmbedRO fl |= flag(Func) fl |= flag(i)<<flagMethodShift | flagMethod return Value{v.typ, v.ptr, fl} |