proto, runtime/protoiface: add support for fast-path marshaling
Allow message implementations to provide optimized versions of standard
operations. Generated messages now include a ProtoReflectMethods method,
returning a protoiface.Methods struct containing pointers to assorted
optional functions.
The Methods struct also includes a Flags field indicating support for
optional features such as deterministic marshaling.
Implementation of the fast paths (and tests) will come in later CLs.
Change-Id: Idd1beed0ecf43ec5e5e7b8da2ee1e08d3ce32213
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/170340
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
diff --git a/encoding/testprotos/pb2/test.pb.go b/encoding/testprotos/pb2/test.pb.go
index 0ad7a9a..9c3f74e 100644
--- a/encoding/testprotos/pb2/test.pb.go
+++ b/encoding/testprotos/pb2/test.pb.go
@@ -156,6 +156,10 @@
return xxx_File_pb2_test_proto_messageTypes[0].MessageOf(x)
}
+func (m *Scalars) XXX_Methods() *protoiface.Methods {
+ return xxx_File_pb2_test_proto_messageTypes[0].Methods()
+}
+
// Deprecated: Use Scalars.ProtoReflect.Type instead.
func (*Scalars) Descriptor() ([]byte, []int) {
return xxx_File_pb2_test_proto_rawDescGZIP(), []int{0}
@@ -291,6 +295,10 @@
return xxx_File_pb2_test_proto_messageTypes[1].MessageOf(x)
}
+func (m *Enums) XXX_Methods() *protoiface.Methods {
+ return xxx_File_pb2_test_proto_messageTypes[1].Methods()
+}
+
// Deprecated: Use Enums.ProtoReflect.Type instead.
func (*Enums) Descriptor() ([]byte, []int) {
return xxx_File_pb2_test_proto_rawDescGZIP(), []int{1}
@@ -354,6 +362,10 @@
return xxx_File_pb2_test_proto_messageTypes[2].MessageOf(x)
}
+func (m *Repeats) XXX_Methods() *protoiface.Methods {
+ return xxx_File_pb2_test_proto_messageTypes[2].Methods()
+}
+
// Deprecated: Use Repeats.ProtoReflect.Type instead.
func (*Repeats) Descriptor() ([]byte, []int) {
return xxx_File_pb2_test_proto_rawDescGZIP(), []int{2}
@@ -445,6 +457,10 @@
return xxx_File_pb2_test_proto_messageTypes[3].MessageOf(x)
}
+func (m *Nested) XXX_Methods() *protoiface.Methods {
+ return xxx_File_pb2_test_proto_messageTypes[3].Methods()
+}
+
// Deprecated: Use Nested.ProtoReflect.Type instead.
func (*Nested) Descriptor() ([]byte, []int) {
return xxx_File_pb2_test_proto_rawDescGZIP(), []int{3}
@@ -489,6 +505,10 @@
return xxx_File_pb2_test_proto_messageTypes[4].MessageOf(x)
}
+func (m *Nests) XXX_Methods() *protoiface.Methods {
+ return xxx_File_pb2_test_proto_messageTypes[4].Methods()
+}
+
// Deprecated: Use Nests.ProtoReflect.Type instead.
func (*Nests) Descriptor() ([]byte, []int) {
return xxx_File_pb2_test_proto_rawDescGZIP(), []int{4}
@@ -549,6 +569,10 @@
return xxx_File_pb2_test_proto_messageTypes[5].MessageOf(x)
}
+func (m *Requireds) XXX_Methods() *protoiface.Methods {
+ return xxx_File_pb2_test_proto_messageTypes[5].Methods()
+}
+
// Deprecated: Use Requireds.ProtoReflect.Type instead.
func (*Requireds) Descriptor() ([]byte, []int) {
return xxx_File_pb2_test_proto_rawDescGZIP(), []int{5}
@@ -619,6 +643,10 @@
return xxx_File_pb2_test_proto_messageTypes[6].MessageOf(x)
}
+func (m *PartialRequired) XXX_Methods() *protoiface.Methods {
+ return xxx_File_pb2_test_proto_messageTypes[6].Methods()
+}
+
// Deprecated: Use PartialRequired.ProtoReflect.Type instead.
func (*PartialRequired) Descriptor() ([]byte, []int) {
return xxx_File_pb2_test_proto_rawDescGZIP(), []int{6}
@@ -659,6 +687,10 @@
return xxx_File_pb2_test_proto_messageTypes[7].MessageOf(x)
}
+func (m *NestedWithRequired) XXX_Methods() *protoiface.Methods {
+ return xxx_File_pb2_test_proto_messageTypes[7].Methods()
+}
+
// Deprecated: Use NestedWithRequired.ProtoReflect.Type instead.
func (*NestedWithRequired) Descriptor() ([]byte, []int) {
return xxx_File_pb2_test_proto_rawDescGZIP(), []int{7}
@@ -697,6 +729,10 @@
return xxx_File_pb2_test_proto_messageTypes[8].MessageOf(x)
}
+func (m *IndirectRequired) XXX_Methods() *protoiface.Methods {
+ return xxx_File_pb2_test_proto_messageTypes[8].Methods()
+}
+
// Deprecated: Use IndirectRequired.ProtoReflect.Type instead.
func (*IndirectRequired) Descriptor() ([]byte, []int) {
return xxx_File_pb2_test_proto_rawDescGZIP(), []int{8}
@@ -778,6 +814,10 @@
return xxx_File_pb2_test_proto_messageTypes[9].MessageOf(x)
}
+func (m *Extensions) XXX_Methods() *protoiface.Methods {
+ return xxx_File_pb2_test_proto_messageTypes[9].Methods()
+}
+
// Deprecated: Use Extensions.ProtoReflect.Type instead.
func (*Extensions) Descriptor() ([]byte, []int) {
return xxx_File_pb2_test_proto_rawDescGZIP(), []int{9}
@@ -833,6 +873,10 @@
return xxx_File_pb2_test_proto_messageTypes[10].MessageOf(x)
}
+func (m *ExtensionsContainer) XXX_Methods() *protoiface.Methods {
+ return xxx_File_pb2_test_proto_messageTypes[10].Methods()
+}
+
// Deprecated: Use ExtensionsContainer.ProtoReflect.Type instead.
func (*ExtensionsContainer) Descriptor() ([]byte, []int) {
return xxx_File_pb2_test_proto_rawDescGZIP(), []int{10}
@@ -859,6 +903,10 @@
return xxx_File_pb2_test_proto_messageTypes[11].MessageOf(x)
}
+func (m *MessageSet) XXX_Methods() *protoiface.Methods {
+ return xxx_File_pb2_test_proto_messageTypes[11].Methods()
+}
+
// Deprecated: Use MessageSet.ProtoReflect.Type instead.
func (*MessageSet) Descriptor() ([]byte, []int) {
return xxx_File_pb2_test_proto_rawDescGZIP(), []int{11}
@@ -894,6 +942,10 @@
return xxx_File_pb2_test_proto_messageTypes[12].MessageOf(x)
}
+func (m *MessageSetExtension) XXX_Methods() *protoiface.Methods {
+ return xxx_File_pb2_test_proto_messageTypes[12].Methods()
+}
+
// Deprecated: Use MessageSetExtension.ProtoReflect.Type instead.
func (*MessageSetExtension) Descriptor() ([]byte, []int) {
return xxx_File_pb2_test_proto_rawDescGZIP(), []int{12}
@@ -927,6 +979,10 @@
return xxx_File_pb2_test_proto_messageTypes[13].MessageOf(x)
}
+func (m *FakeMessageSet) XXX_Methods() *protoiface.Methods {
+ return xxx_File_pb2_test_proto_messageTypes[13].Methods()
+}
+
// Deprecated: Use FakeMessageSet.ProtoReflect.Type instead.
func (*FakeMessageSet) Descriptor() ([]byte, []int) {
return xxx_File_pb2_test_proto_rawDescGZIP(), []int{13}
@@ -962,6 +1018,10 @@
return xxx_File_pb2_test_proto_messageTypes[14].MessageOf(x)
}
+func (m *FakeMessageSetExtension) XXX_Methods() *protoiface.Methods {
+ return xxx_File_pb2_test_proto_messageTypes[14].Methods()
+}
+
// Deprecated: Use FakeMessageSetExtension.ProtoReflect.Type instead.
func (*FakeMessageSetExtension) Descriptor() ([]byte, []int) {
return xxx_File_pb2_test_proto_rawDescGZIP(), []int{14}
@@ -1013,6 +1073,10 @@
return xxx_File_pb2_test_proto_messageTypes[15].MessageOf(x)
}
+func (m *KnownTypes) XXX_Methods() *protoiface.Methods {
+ return xxx_File_pb2_test_proto_messageTypes[15].Methods()
+}
+
// Deprecated: Use KnownTypes.ProtoReflect.Type instead.
func (*KnownTypes) Descriptor() ([]byte, []int) {
return xxx_File_pb2_test_proto_rawDescGZIP(), []int{15}
@@ -1167,6 +1231,10 @@
return xxx_File_pb2_test_proto_messageTypes[16].MessageOf(x)
}
+func (m *Nests_OptGroup) XXX_Methods() *protoiface.Methods {
+ return xxx_File_pb2_test_proto_messageTypes[16].Methods()
+}
+
// Deprecated: Use Nests_OptGroup.ProtoReflect.Type instead.
func (*Nests_OptGroup) Descriptor() ([]byte, []int) {
return xxx_File_pb2_test_proto_rawDescGZIP(), []int{4, 0}
@@ -1214,6 +1282,10 @@
return xxx_File_pb2_test_proto_messageTypes[17].MessageOf(x)
}
+func (m *Nests_RptGroup) XXX_Methods() *protoiface.Methods {
+ return xxx_File_pb2_test_proto_messageTypes[17].Methods()
+}
+
// Deprecated: Use Nests_RptGroup.ProtoReflect.Type instead.
func (*Nests_RptGroup) Descriptor() ([]byte, []int) {
return xxx_File_pb2_test_proto_rawDescGZIP(), []int{4, 1}
@@ -1247,6 +1319,10 @@
return xxx_File_pb2_test_proto_messageTypes[18].MessageOf(x)
}
+func (m *Nests_OptGroup_OptNestedGroup) XXX_Methods() *protoiface.Methods {
+ return xxx_File_pb2_test_proto_messageTypes[18].Methods()
+}
+
// Deprecated: Use Nests_OptGroup_OptNestedGroup.ProtoReflect.Type instead.
func (*Nests_OptGroup_OptNestedGroup) Descriptor() ([]byte, []int) {
return xxx_File_pb2_test_proto_rawDescGZIP(), []int{4, 0, 0}