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/internal/impl/message.go b/internal/impl/message.go
index dbf9816..0b2c3fc 100644
--- a/internal/impl/message.go
+++ b/internal/impl/message.go
@@ -13,6 +13,7 @@
pvalue "github.com/golang/protobuf/v2/internal/value"
pref "github.com/golang/protobuf/v2/reflect/protoreflect"
+ piface "github.com/golang/protobuf/v2/runtime/protoiface"
)
// MessageType provides protobuf related functionality for a given Go type
@@ -148,6 +149,10 @@
return (*messageReflectWrapper)(mi.dataTypeOf(p))
}
+func (mi *MessageType) Methods() *piface.Methods {
+ return nil
+}
+
func (mi *MessageType) dataTypeOf(p interface{}) *messageDataType {
// TODO: Remove this check? This API is primarily used by generated code,
// and should not violate this assumption. Leave this check in for now to
@@ -213,6 +218,9 @@
func (m *messageIfaceWrapper) ProtoReflect() pref.Message {
return (*messageReflectWrapper)(m)
}
+func (m *messageIfaceWrapper) XXX_Methods() *piface.Methods {
+ return m.mi.Methods()
+}
func (m *messageIfaceWrapper) ProtoUnwrap() interface{} {
return m.p.AsIfaceOf(m.mi.GoType.Elem())
}