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
}