Commit 2db587c0 authored by Hajime Hoshi's avatar Hajime Hoshi Committed by roger peppe

encoding/xml: Reset the parent stack before printing a chardata or comment field in a struct

This CL resets the parent stack when printing a character or comment field struct.
In the case of XML elements, the previous parents stack must be considered. However,
charadata or comment fields can't be printed in other fields so it seems required to reset
the parent stack each time a chardata or comment field is printed.

Fixes #5072

Change-Id: I84f61c9bfce94133cd0c076c11211b9be5b4b1ac
Reviewed-on: https://go-review.googlesource.com/9910Reviewed-by: default avatarNigel Tao <nigeltao@golang.org>
Reviewed-by: default avatarroger peppe <rogpeppe@gmail.com>
parent 227fb116
...@@ -924,6 +924,9 @@ func (p *printer) marshalStruct(tinfo *typeInfo, val reflect.Value) error { ...@@ -924,6 +924,9 @@ func (p *printer) marshalStruct(tinfo *typeInfo, val reflect.Value) error {
switch finfo.flags & fMode { switch finfo.flags & fMode {
case fCharData: case fCharData:
if err := s.setParents(&noField, reflect.Value{}); err != nil {
return err
}
if vf.CanInterface() && vf.Type().Implements(textMarshalerType) { if vf.CanInterface() && vf.Type().Implements(textMarshalerType) {
data, err := vf.Interface().(encoding.TextMarshaler).MarshalText() data, err := vf.Interface().(encoding.TextMarshaler).MarshalText()
if err != nil { if err != nil {
...@@ -967,6 +970,9 @@ func (p *printer) marshalStruct(tinfo *typeInfo, val reflect.Value) error { ...@@ -967,6 +970,9 @@ func (p *printer) marshalStruct(tinfo *typeInfo, val reflect.Value) error {
continue continue
case fComment: case fComment:
if err := s.setParents(&noField, reflect.Value{}); err != nil {
return err
}
k := vf.Kind() k := vf.Kind()
if !(k == reflect.String || k == reflect.Slice && vf.Type().Elem().Kind() == reflect.Uint8) { if !(k == reflect.String || k == reflect.Slice && vf.Type().Elem().Kind() == reflect.Uint8) {
return fmt.Errorf("xml: bad type for comment field of %s", val.Type()) return fmt.Errorf("xml: bad type for comment field of %s", val.Type())
......
...@@ -340,6 +340,16 @@ type OuterOuterStruct struct { ...@@ -340,6 +340,16 @@ type OuterOuterStruct struct {
OuterStruct OuterStruct
} }
type NestedAndChardata struct {
AB []string `xml:"A>B"`
Chardata string `xml:",chardata"`
}
type NestedAndComment struct {
AB []string `xml:"A>B"`
Comment string `xml:",comment"`
}
func ifaceptr(x interface{}) interface{} { func ifaceptr(x interface{}) interface{} {
return &x return &x
} }
...@@ -995,6 +1005,14 @@ var marshalTests = []struct { ...@@ -995,6 +1005,14 @@ var marshalTests = []struct {
ExpectXML: `<outer xmlns="testns" int="10"></outer>`, ExpectXML: `<outer xmlns="testns" int="10"></outer>`,
Value: &OuterOuterStruct{OuterStruct{IntAttr: 10}}, Value: &OuterOuterStruct{OuterStruct{IntAttr: 10}},
}, },
{
ExpectXML: `<NestedAndChardata><A><B></B><B></B></A>test</NestedAndChardata>`,
Value: &NestedAndChardata{AB: make([]string, 2), Chardata: "test"},
},
{
ExpectXML: `<NestedAndComment><A><B></B><B></B></A><!--test--></NestedAndComment>`,
Value: &NestedAndComment{AB: make([]string, 2), Comment: "test"},
},
} }
func TestMarshal(t *testing.T) { func TestMarshal(t *testing.T) {
......
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