Updated to current weekly.
diff --git a/decode.go b/decode.go index 3a3dee9..4bb5130 100644 --- a/decode.go +++ b/decode.go
@@ -235,7 +235,7 @@ if tag != "!!null" || setter != nil { if pv := (*out); pv.Kind() == reflect.Ptr { if pv.IsNil() { - *out = reflect.Zero(pv.Type().Elem()) + *out = reflect.New(pv.Type().Elem()).Elem() pv.Set((*out).Addr()) } else { *out = pv.Elem() @@ -246,7 +246,7 @@ } if setter != nil { var arg interface{} - *out = reflect.NewValue(&arg).Elem() + *out = reflect.ValueOf(&arg).Elem() return func() { *good = setter.SetYAML(tag, arg) } @@ -315,7 +315,7 @@ if resolved == nil { out.Set(reflect.Zero(out.Type())) } else { - out.Set(reflect.NewValue(resolved)) + out.Set(reflect.ValueOf(resolved)) } good = true case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: @@ -368,6 +368,13 @@ return good } +func settableValueOf(i interface{}) reflect.Value { + v := reflect.ValueOf(i) + sv := reflect.New(v.Type()).Elem() + sv.Set(v) + return sv +} + func (d *decoder) sequence(n *node, out reflect.Value) (good bool) { if set := d.setter("!!seq", &out, &good); set != nil { defer set() @@ -375,7 +382,7 @@ if out.Kind() == reflect.Interface { // No type hints. Will have to use a generic sequence. iface := out - out = reflect.NewValue(make([]interface{}, 0)) + out = settableValueOf(make([]interface{}, 0)) iface.Set(out) } @@ -386,7 +393,7 @@ l := len(n.children) for i := 0; i < l; i++ { - e := reflect.Zero(et) + e := reflect.New(et).Elem() if ok := d.unmarshal(n.children[i], e); ok { out.Set(reflect.Append(out, e)) } @@ -405,7 +412,7 @@ if out.Kind() == reflect.Interface { // No type hints. Will have to use a generic map. iface := out - out = reflect.NewValue(make(map[interface{}]interface{})) + out = settableValueOf(make(map[interface{}]interface{})) iface.Set(out) } @@ -418,9 +425,9 @@ l := len(n.children) for i := 0; i < l; i += 2 { - k := reflect.Zero(kt) + k := reflect.New(kt).Elem() if d.unmarshal(n.children[i], k) { - e := reflect.Zero(et) + e := reflect.New(et).Elem() if d.unmarshal(n.children[i+1], e) { out.SetMapIndex(k, e) } @@ -434,7 +441,7 @@ if err != nil { panic(err) } - name := reflect.NewValue("") + name := settableValueOf("") fieldsMap := fields.Map l := len(n.children) for i := 0; i < l; i += 2 {
diff --git a/decode_test.go b/decode_test.go index 5c80a20..3f5f60a 100644 --- a/decode_test.go +++ b/decode_test.go
@@ -134,14 +134,13 @@ func (s *S) TestUnmarshal(c *C) { for i, item := range unmarshalTests { - t := reflect.NewValue(item.value).Type() + t := reflect.ValueOf(item.value).Type() var value interface{} if t.Kind() == reflect.Map { value = reflect.MakeMap(t).Interface() } else { - pt := reflect.NewValue(item.value).Type() - pv := reflect.Zero(pt) - pv.Set(reflect.Zero(pt.Elem()).Addr()) + pt := reflect.ValueOf(item.value).Type() + pv := reflect.New(pt.Elem()) value = pv.Interface() } err := goyaml.Unmarshal([]byte(item.data), value) @@ -153,8 +152,7 @@ var unmarshalErrorTests = []struct { data, error string }{ - {"v: !!float 'error'", - "YAML error: Can't decode !!str 'error' as a !!float"}, + {"v: !!float 'error'", "YAML error: Can't decode !!str 'error' as a !!float"}, {"v: [A,", "YAML error: line 1: did not find expected node content"}, {"v:\n- [A,", "YAML error: line 2: did not find expected node content"}, {"a: *b\n", "YAML error: Unknown anchor 'b' referenced"},
diff --git a/encode.go b/encode.go index 242a722..ba15123 100644 --- a/encode.go +++ b/encode.go
@@ -90,7 +90,7 @@ e.nilv() return } - in = reflect.NewValue(value) + in = reflect.ValueOf(value) } switch in.Kind() { case reflect.Interface: @@ -146,7 +146,7 @@ if info.Conditional && isZero(value) { continue } - e.marshal("", reflect.NewValue(info.Key)) + e.marshal("", reflect.ValueOf(info.Key)) e.flow = info.Flow e.marshal("", value) }
diff --git a/goyaml.go b/goyaml.go index 6d69268..3ea8332 100644 --- a/goyaml.go +++ b/goyaml.go
@@ -88,7 +88,7 @@ defer p.destroy() node := p.parse() if node != nil { - d.unmarshal(node, reflect.NewValue(out)) + d.unmarshal(node, reflect.ValueOf(out)) } return nil } @@ -119,7 +119,7 @@ defer handleErr(&err) e := newEncoder() defer e.destroy() - e.marshal("", reflect.NewValue(in)) + e.marshal("", reflect.ValueOf(in)) e.finish() out = e.out return