goprotobuf: Fix Clone to deep copy []byte fields.
LGTM=nigeltao
R=nigeltao
CC=golang-codereviews
https://codereview.appspot.com/165140043
diff --git a/proto/text_parser.go b/proto/text_parser.go
index 9e4c7b1..1799e1b 100644
--- a/proto/text_parser.go
+++ b/proto/text_parser.go
@@ -430,6 +430,7 @@
st := sv.Type()
reqCount := GetProperties(st).reqCount
var reqFieldErr error
+ fieldSet := make(map[string]bool)
// A struct is a sequence of "name: value", terminated by one of
// '>' or '}', or the end of the input. A name may also be
// "[extension]".
@@ -511,17 +512,17 @@
}
} else {
// This is a normal, non-extension field.
- fi, props, ok := structFieldByName(st, tok.value)
+ name := tok.value
+ fi, props, ok := structFieldByName(st, name)
if !ok {
- return p.errorf("unknown field name %q in %v", tok.value, st)
+ return p.errorf("unknown field name %q in %v", name, st)
}
dst := sv.Field(fi)
- isDstNil := isNil(dst)
// Check that it's not already set if it's not a repeated field.
- if !props.Repeated && !isDstNil {
- return p.errorf("non-repeated field %q was repeated", tok.value)
+ if !props.Repeated && fieldSet[name] {
+ return p.errorf("non-repeated field %q was repeated", name)
}
if err := p.checkForColon(props, st.Field(fi).Type); err != nil {
@@ -529,6 +530,7 @@
}
// Parse into the field.
+ fieldSet[name] = true
if err := p.readAny(dst, props); err != nil {
if _, ok := err.(*RequiredNotSetError); !ok {
return err