Commit 8c86f1f3 authored by Rémy Oudompheng's avatar Rémy Oudompheng

encoding/json: cleanup leftover redundant variables.

Those variables come from ancient times when reflect.Value was
an interface.

R=dave, rsc
CC=golang-dev
https://golang.org/cl/6946059
parent 475dee90
...@@ -125,13 +125,12 @@ func (d *decodeState) unmarshal(v interface{}) (err error) { ...@@ -125,13 +125,12 @@ func (d *decodeState) unmarshal(v interface{}) (err error) {
}() }()
rv := reflect.ValueOf(v) rv := reflect.ValueOf(v)
pv := rv if rv.Kind() != reflect.Ptr || rv.IsNil() {
if pv.Kind() != reflect.Ptr || pv.IsNil() {
return &InvalidUnmarshalError{reflect.TypeOf(v)} return &InvalidUnmarshalError{reflect.TypeOf(v)}
} }
d.scan.reset() d.scan.reset()
// We decode rv not pv.Elem because the Unmarshaler interface // We decode rv not rv.Elem because the Unmarshaler interface
// test must be applied at the top level of the value. // test must be applied at the top level of the value.
d.value(rv) d.value(rv)
return d.savedError return d.savedError
...@@ -423,17 +422,12 @@ func (d *decodeState) object(v reflect.Value) { ...@@ -423,17 +422,12 @@ func (d *decodeState) object(v reflect.Value) {
v = pv v = pv
// Decoding into nil interface? Switch to non-reflect code. // Decoding into nil interface? Switch to non-reflect code.
iv := v if v.Kind() == reflect.Interface {
if iv.Kind() == reflect.Interface { v.Set(reflect.ValueOf(d.objectInterface()))
iv.Set(reflect.ValueOf(d.objectInterface()))
return return
} }
// Check type of target: struct or map[string]T // Check type of target: struct or map[string]T
var (
mv reflect.Value
sv reflect.Value
)
switch v.Kind() { switch v.Kind() {
case reflect.Map: case reflect.Map:
// map must have string type // map must have string type
...@@ -442,17 +436,15 @@ func (d *decodeState) object(v reflect.Value) { ...@@ -442,17 +436,15 @@ func (d *decodeState) object(v reflect.Value) {
d.saveError(&UnmarshalTypeError{"object", v.Type()}) d.saveError(&UnmarshalTypeError{"object", v.Type()})
break break
} }
mv = v if v.IsNil() {
if mv.IsNil() { v.Set(reflect.MakeMap(t))
mv.Set(reflect.MakeMap(t))
} }
case reflect.Struct: case reflect.Struct:
sv = v
default: default:
d.saveError(&UnmarshalTypeError{"object", v.Type()}) d.saveError(&UnmarshalTypeError{"object", v.Type()})
} }
if !mv.IsValid() && !sv.IsValid() { if !v.IsValid() {
d.off-- d.off--
d.next() // skip over { } in input d.next() // skip over { } in input
return return
...@@ -484,8 +476,8 @@ func (d *decodeState) object(v reflect.Value) { ...@@ -484,8 +476,8 @@ func (d *decodeState) object(v reflect.Value) {
var subv reflect.Value var subv reflect.Value
destring := false // whether the value is wrapped in a string to be decoded first destring := false // whether the value is wrapped in a string to be decoded first
if mv.IsValid() { if v.Kind() == reflect.Map {
elemType := mv.Type().Elem() elemType := v.Type().Elem()
if !mapElem.IsValid() { if !mapElem.IsValid() {
mapElem = reflect.New(elemType).Elem() mapElem = reflect.New(elemType).Elem()
} else { } else {
...@@ -494,7 +486,7 @@ func (d *decodeState) object(v reflect.Value) { ...@@ -494,7 +486,7 @@ func (d *decodeState) object(v reflect.Value) {
subv = mapElem subv = mapElem
} else { } else {
var f *field var f *field
fields := cachedTypeFields(sv.Type()) fields := cachedTypeFields(v.Type())
for i := range fields { for i := range fields {
ff := &fields[i] ff := &fields[i]
if ff.name == key { if ff.name == key {
...@@ -506,7 +498,7 @@ func (d *decodeState) object(v reflect.Value) { ...@@ -506,7 +498,7 @@ func (d *decodeState) object(v reflect.Value) {
} }
} }
if f != nil { if f != nil {
subv = sv subv = v
destring = f.quoted destring = f.quoted
for _, i := range f.index { for _, i := range f.index {
if subv.Kind() == reflect.Ptr { if subv.Kind() == reflect.Ptr {
...@@ -519,7 +511,7 @@ func (d *decodeState) object(v reflect.Value) { ...@@ -519,7 +511,7 @@ func (d *decodeState) object(v reflect.Value) {
} }
} else { } else {
// To give a good error, a quick scan for unexported fields in top level. // To give a good error, a quick scan for unexported fields in top level.
st := sv.Type() st := v.Type()
for i := 0; i < st.NumField(); i++ { for i := 0; i < st.NumField(); i++ {
f := st.Field(i) f := st.Field(i)
if f.PkgPath != "" && strings.EqualFold(f.Name, key) { if f.PkgPath != "" && strings.EqualFold(f.Name, key) {
...@@ -546,8 +538,8 @@ func (d *decodeState) object(v reflect.Value) { ...@@ -546,8 +538,8 @@ func (d *decodeState) object(v reflect.Value) {
} }
// Write value back to map; // Write value back to map;
// if using struct, subv points into struct already. // if using struct, subv points into struct already.
if mv.IsValid() { if v.Kind() == reflect.Map {
mv.SetMapIndex(reflect.ValueOf(key), subv) v.SetMapIndex(reflect.ValueOf(key), subv)
} }
// Next token must be , or }. // Next token must be , or }.
......
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