mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
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
This commit is contained in:
parent
475dee9082
commit
8c86f1f331
1 changed files with 14 additions and 22 deletions
|
|
@ -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) {
|
||||||
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) {
|
||||||
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) {
|
||||||
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) {
|
||||||
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) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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) {
|
||||||
}
|
}
|
||||||
} 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) {
|
||||||
}
|
}
|
||||||
// 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 }.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue