Export changes from Google-internal version:
- faster text parsing
- use numbers instead of repeated Xs for package import name conflict resolution
R=r
CC=golang-dev
http://codereview.appspot.com/2540041
diff --git a/proto/text_parser.go b/proto/text_parser.go
index 4076ebb..61513f8 100644
--- a/proto/text_parser.go
+++ b/proto/text_parser.go
@@ -254,11 +254,9 @@
// Returns the index in the struct for the named field, as well as the parsed tag properties.
func structFieldByName(st *reflect.StructType, name string) (int, *Properties, bool) {
sprops := GetProperties(st)
- for i := 0; i < st.NumField(); i++ {
- props := sprops.Prop[i]
- if props.OrigName == name {
- return i, props, true
- }
+ i, ok := sprops.origNames[name]
+ if ok {
+ return i, sprops.Prop[i], true
}
return -1, nil, false
}
@@ -370,15 +368,17 @@
return nil
}
// Repeated field. May already exist.
- cnt := fv.Len()
- nav := reflect.MakeSlice(at, cnt, cnt+1)
- reflect.ArrayCopy(nav, fv)
- fv.Set(nav)
- fv.SetLen(cnt + 1)
+ flen := fv.Len()
+ if flen == fv.Cap() {
+ nav := reflect.MakeSlice(at, flen, 2*flen+1)
+ reflect.ArrayCopy(nav, fv)
+ fv.Set(nav)
+ }
+ fv.SetLen(flen + 1)
// Read one.
p.back()
- return p.readAny(fv.Elem(cnt), nil) // TODO: pass properties?
+ return p.readAny(fv.Elem(flen), nil) // TODO: pass properties?
case *reflect.BoolValue:
// Either "true", "false", 1 or 0.
switch tok.value {