Prechádzať zdrojové kódy

goprotobuf: Fix proto.Size for repeated fixed(32|64) fields.

Fixes #38.

R=r
CC=golang-dev
https://codereview.appspot.com/10088045
David Symonds 12 rokov pred
rodič
commit
40877590f8
3 zmenil súbory, kde vykonal 17 pridanie a 10 odobranie
  1. 15 10
      proto/size.go
  2. 1 0
      proto/size_test.go
  3. 1 0
      proto/testdata/test.proto

+ 15 - 10
proto/size.go

@@ -100,14 +100,6 @@ func sizeStruct(x reflect.Value) (n int) {
 }
 
 func sizeField(x reflect.Value, prop *Properties) (n int) {
-	// Handle easy ones first.
-	switch prop.WireType {
-	case WireFixed64:
-		return 8
-	case WireFixed32:
-		return 4
-	}
-
 	if x.Type().Kind() == reflect.Slice {
 		n := x.Len()
 		et := x.Type().Elem()
@@ -125,9 +117,14 @@ func sizeField(x reflect.Value, prop *Properties) (n int) {
 			nb = len(prop.tagcode) + sizeVarint(uint64(n))
 		}
 
-		if et.Kind() == reflect.Bool {
-			// []bool is easy to compute: each element requires one byte.
+		// []bool and repeated fixed integer types are easy.
+		switch {
+		case et.Kind() == reflect.Bool:
 			return nb + n
+		case prop.WireType == WireFixed64:
+			return nb + n*8
+		case prop.WireType == WireFixed32:
+			return nb + n*4
 		}
 		for i := 0; i < n; i++ {
 			nb += sizeField(x.Index(i), prop)
@@ -135,6 +132,14 @@ func sizeField(x reflect.Value, prop *Properties) (n int) {
 		return nb
 	}
 
+	// easy scalars
+	switch prop.WireType {
+	case WireFixed64:
+		return 8
+	case WireFixed32:
+		return 4
+	}
+
 	switch x.Kind() {
 	case reflect.Bool:
 		return 1

+ 1 - 0
proto/size_test.go

@@ -86,6 +86,7 @@ var SizeTests = []struct {
 	{"repeated int32", &pb.MoreRepeated{Ints: []int32{1, 12203, 1729}}},
 	{"repeated int32 packed", &pb.MoreRepeated{IntsPacked: []int32{1, 12203, 1729}}},
 	{"repeated string", &pb.MoreRepeated{Strings: []string{"r", "ken", "gri"}}},
+	{"repeated fixed", &pb.MoreRepeated{Fixeds: []uint32{1, 2, 3, 4}}},
 	// Nested.
 	{"nested", &pb.OldMessage{Nested: &pb.OldMessage_Nested{Name: String("whatever")}}},
 	// Other things.

+ 1 - 0
proto/testdata/test.proto

@@ -333,6 +333,7 @@ message MoreRepeated {
   repeated int32 ints = 3;
   repeated int32 ints_packed = 4 [packed=true];
   repeated string strings = 5;
+  repeated fixed32 fixeds = 6;
 }
 
 // GroupOld and GroupNew have the same wire format.