Commit 9114279c authored by Russ Cox's avatar Russ Cox

encoding/xml: simplify copyValue

Delete various complications left over from an earlier reflect API.

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/7124063
parent e6e60cda
...@@ -374,75 +374,58 @@ Loop: ...@@ -374,75 +374,58 @@ Loop:
} }
func copyValue(dst reflect.Value, src []byte) (err error) { func copyValue(dst reflect.Value, src []byte) (err error) {
// Helper functions for integer and unsigned integer conversions if dst.Kind() == reflect.Ptr {
var itmp int64 if dst.IsNil() {
getInt64 := func() bool { dst.Set(reflect.New(dst.Type().Elem()))
itmp, err = strconv.ParseInt(string(src), 10, 64)
// TODO: should check sizes
return err == nil
}
var utmp uint64
getUint64 := func() bool {
utmp, err = strconv.ParseUint(string(src), 10, 64)
// TODO: check for overflow?
return err == nil
}
var ftmp float64
getFloat64 := func() bool {
ftmp, err = strconv.ParseFloat(string(src), 64)
// TODO: check for overflow?
return err == nil
}
if pv := dst; pv.Kind() == reflect.Ptr {
if pv.IsNil() {
pv.Set(reflect.New(pv.Type().Elem()))
} }
dst = pv.Elem() dst = dst.Elem()
} }
// Save accumulated data. // Save accumulated data.
switch t := dst; t.Kind() { switch dst.Kind() {
case reflect.Invalid: case reflect.Invalid:
// Probably a comment. // Probably a commendst.
default: default:
return errors.New("cannot happen: unknown type " + t.Type().String()) return errors.New("cannot happen: unknown type " + dst.Type().String())
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
if !getInt64() { itmp, err := strconv.ParseInt(string(src), 10, dst.Type().Bits())
if err != nil {
return err return err
} }
t.SetInt(itmp) dst.SetInt(itmp)
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
if !getUint64() { utmp, err := strconv.ParseUint(string(src), 10, dst.Type().Bits())
if err != nil {
return err return err
} }
t.SetUint(utmp) dst.SetUint(utmp)
case reflect.Float32, reflect.Float64: case reflect.Float32, reflect.Float64:
if !getFloat64() { ftmp, err := strconv.ParseFloat(string(src), dst.Type().Bits())
if err != nil {
return err return err
} }
t.SetFloat(ftmp) dst.SetFloat(ftmp)
case reflect.Bool: case reflect.Bool:
value, err := strconv.ParseBool(strings.TrimSpace(string(src))) value, err := strconv.ParseBool(strings.TrimSpace(string(src)))
if err != nil { if err != nil {
return err return err
} }
t.SetBool(value) dst.SetBool(value)
case reflect.String: case reflect.String:
t.SetString(string(src)) dst.SetString(string(src))
case reflect.Slice: case reflect.Slice:
if len(src) == 0 { if len(src) == 0 {
// non-nil to flag presence // non-nil to flag presence
src = []byte{} src = []byte{}
} }
t.SetBytes(src) dst.SetBytes(src)
case reflect.Struct: case reflect.Struct:
if t.Type() == timeType { if dst.Type() == timeType {
tv, err := time.Parse(time.RFC3339, string(src)) tv, err := time.Parse(time.RFC3339, string(src))
if err != nil { if err != nil {
return err return err
} }
t.Set(reflect.ValueOf(tv)) dst.Set(reflect.ValueOf(tv))
} }
} }
return nil return nil
......
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