Skip to content

Commit

Permalink
encoding/xml: Reset the parent stack before printing a chardata or co…
Browse files Browse the repository at this point in the history
…mment 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/9910
Reviewed-by: Nigel Tao <nigeltao@golang.org>
Reviewed-by: roger peppe <rogpeppe@gmail.com>
  • Loading branch information
hajimehoshi authored and rogpeppe committed Jun 4, 2015
1 parent 227fb11 commit 2db587c
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 0 deletions.
6 changes: 6 additions & 0 deletions src/encoding/xml/marshal.go
Original file line number Diff line number Diff line change
Expand Up @@ -924,6 +924,9 @@ func (p *printer) marshalStruct(tinfo *typeInfo, val reflect.Value) error {

switch finfo.flags & fMode {
case fCharData:
if err := s.setParents(&noField, reflect.Value{}); err != nil {
return err
}
if vf.CanInterface() && vf.Type().Implements(textMarshalerType) {
data, err := vf.Interface().(encoding.TextMarshaler).MarshalText()
if err != nil {
Expand Down Expand Up @@ -967,6 +970,9 @@ func (p *printer) marshalStruct(tinfo *typeInfo, val reflect.Value) error {
continue

case fComment:
if err := s.setParents(&noField, reflect.Value{}); err != nil {
return err
}
k := vf.Kind()
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())
Expand Down
18 changes: 18 additions & 0 deletions src/encoding/xml/marshal_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -340,6 +340,16 @@ type OuterOuterStruct struct {
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{} {
return &x
}
Expand Down Expand Up @@ -995,6 +1005,14 @@ var marshalTests = []struct {
ExpectXML: `<outer xmlns="testns" int="10"></outer>`,
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) {
Expand Down

0 comments on commit 2db587c

Please sign in to comment.