Fix a couple of bugs reported by Roger.
diff --git a/encode.go b/encode.go index fa3ebc6..c7fcdb2 100644 --- a/encode.go +++ b/encode.go
@@ -142,8 +142,8 @@ panic(err) } e.mappingv(tag, func() { - for i, info := range fields.List { - value := in.Field(i) + for _, info := range fields.List { + value := in.Field(info.Num) if info.OmitEmpty && isZero(value) { continue }
diff --git a/encode_test.go b/encode_test.go index fe1c497..f6a0d0f 100644 --- a/encode_test.go +++ b/encode_test.go
@@ -97,6 +97,13 @@ B string } "a,flow" }{struct{ B string }{"c"}}}, + + // Unexported field + {"a: 1\n", + &struct { + u int + A int + }{0, 1}}, } func (s *S) TestMarshal(c *C) { @@ -141,6 +148,22 @@ {"_: !foo\n a: B\n", "!foo", &marshalTaggedIfaceTest}, } +func (s *S) TestMarshalTypeCache(c *C) { + var data []byte + var err error + func() { + type T struct{ A int } + data, err = goyaml.Marshal(&T{}) + c.Assert(err, IsNil) + }() + func() { + type T struct{ B int } + data, err = goyaml.Marshal(&T{}) + c.Assert(err, IsNil) + }() + c.Assert(string(data), Equals, "b: 0\n") +} + type typeWithGetter struct { tag string value interface{}
diff --git a/goyaml.go b/goyaml.go index 3de01c0..fa288c9 100644 --- a/goyaml.go +++ b/goyaml.go
@@ -129,7 +129,7 @@ // goyaml.Marshal(&T{F: 1}} // Returns "a: 1\nb: 0\n" // func Marshal(in interface{}) (out []byte, err error) { - defer handleErr(&err) + //defer handleErr(&err) e := newEncoder() defer e.destroy() e.marshal("", reflect.ValueOf(in)) @@ -155,7 +155,7 @@ Flow bool } -var fieldMap = make(map[string]*structFields) +var fieldMap = make(map[reflect.Type]*structFields) var fieldMapMutex sync.RWMutex type externalPanic string @@ -165,12 +165,8 @@ } func getStructFields(st reflect.Type) (*structFields, error) { - path := st.PkgPath() - name := st.Name() - - fullName := path + "." + name fieldMapMutex.RLock() - fields, found := fieldMap[fullName] + fields, found := fieldMap[st] fieldMapMutex.RUnlock() if found { return fields, nil @@ -243,12 +239,9 @@ fields = &structFields{fieldsMap, fieldsList[:len(fieldsMap)]} - if fullName != "." { - fieldMapMutex.Lock() - fieldMap[fullName] = fields - fieldMapMutex.Unlock() - } - + fieldMapMutex.Lock() + fieldMap[st] = fields + fieldMapMutex.Unlock() return fields, nil }