Commit 668d7b0e authored by Ken Rockot's avatar Ken Rockot Committed by Commit Bot

Reduce Mojo generated C++ code size

Picks some low-hanging fruit that the compiler is not able
to optimize away: reduces repetition of local context object
construction in message decoding logic, and eliminates some
unnecessary inlined move operations.

Bug: 1058101
Change-Id: Ibedb0eb2c506b3a70c5c60d848633e420845f5cb
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2083738
Commit-Queue: Ken Rockot <rockot@google.com>
Reviewed-by: default avatarOksana Zhuravlova <oksamyt@chromium.org>
Cr-Commit-Position: refs/heads/master@{#746500}
parent 49ab0138
...@@ -59,6 +59,8 @@ void SerializationContext::AddAssociatedInterfaceInfo( ...@@ -59,6 +59,8 @@ void SerializationContext::AddAssociatedInterfaceInfo(
} }
void SerializationContext::TakeHandlesFromMessage(Message* message) { void SerializationContext::TakeHandlesFromMessage(Message* message) {
if (!message->is_serialized())
return;
receiver_connection_group_ = message->receiver_connection_group(); receiver_connection_group_ = message->receiver_connection_group();
handles_.swap(*message->mutable_handles()); handles_.swap(*message->mutable_handles());
associated_endpoint_handles_.swap( associated_endpoint_handles_.swap(
......
...@@ -8,8 +8,6 @@ ...@@ -8,8 +8,6 @@
{%- set qualified_class_name = ("::" ~ namespace_as_string_with_variant if namespace_as_string_with_variant) ~ "::" ~ class_name %} {%- set qualified_class_name = ("::" ~ namespace_as_string_with_variant if namespace_as_string_with_variant) ~ "::" ~ class_name %}
{%- macro alloc_params(struct, params, message, method_number, is_response) %} {%- macro alloc_params(struct, params, message, method_number, is_response) %}
mojo::internal::SerializationContext serialization_context;
serialization_context.TakeHandlesFromMessage({{message}});
bool success = true; bool success = true;
{%- for param in struct.packed.packed_fields_in_ordinal_order %} {%- for param in struct.packed.packed_fields_in_ordinal_order %}
{{param.field.kind|cpp_wrapper_call_type}} p_{{param.field.name}}{}; {{param.field.kind|cpp_wrapper_call_type}} p_{{param.field.name}}{};
...@@ -216,10 +214,10 @@ class {{class_name}}_{{method.name}}_ProxyToResponder { ...@@ -216,10 +214,10 @@ class {{class_name}}_{{method.name}}_ProxyToResponder {
static {{class_name}}::{{method.name}}Callback CreateCallback( static {{class_name}}::{{method.name}}Callback CreateCallback(
uint64_t request_id, uint64_t request_id,
bool is_sync, bool is_sync,
std::unique_ptr<mojo::MessageReceiverWithStatus> responder) { std::unique_ptr<mojo::MessageReceiverWithStatus>* responder) {
std::unique_ptr<{{class_name}}_{{method.name}}_ProxyToResponder> proxy( std::unique_ptr<{{class_name}}_{{method.name}}_ProxyToResponder> proxy(
new {{class_name}}_{{method.name}}_ProxyToResponder( new {{class_name}}_{{method.name}}_ProxyToResponder(
request_id, is_sync, std::move(responder))); request_id, is_sync, responder));
return base::BindOnce(&{{class_name}}_{{method.name}}_ProxyToResponder::Run, return base::BindOnce(&{{class_name}}_{{method.name}}_ProxyToResponder::Run,
std::move(proxy)); std::move(proxy));
} }
...@@ -243,10 +241,10 @@ class {{class_name}}_{{method.name}}_ProxyToResponder { ...@@ -243,10 +241,10 @@ class {{class_name}}_{{method.name}}_ProxyToResponder {
{{class_name}}_{{method.name}}_ProxyToResponder( {{class_name}}_{{method.name}}_ProxyToResponder(
uint64_t request_id, uint64_t request_id,
bool is_sync, bool is_sync,
std::unique_ptr<mojo::MessageReceiverWithStatus> responder) std::unique_ptr<mojo::MessageReceiverWithStatus>* responder)
: request_id_(request_id), : request_id_(request_id),
is_sync_(is_sync), is_sync_(is_sync),
responder_(std::move(responder)) { responder_(std::move(*responder)) {
} }
#if DCHECK_IS_ON() #if DCHECK_IS_ON()
...@@ -306,6 +304,8 @@ bool {{class_name}}_{{method.name}}_ForwardToCallback::Accept( ...@@ -306,6 +304,8 @@ bool {{class_name}}_{{method.name}}_ForwardToCallback::Accept(
message->mutable_payload()); message->mutable_payload());
{%- set desc = class_name~"::"~method.name~" response" %} {%- set desc = class_name~"::"~method.name~" response" %}
mojo::internal::SerializationContext serialization_context;
serialization_context.TakeHandlesFromMessage(message);
{{alloc_params(method.response_param_struct, "params", "message", method.sequential_ordinal, "true")}} {{alloc_params(method.response_param_struct, "params", "message", method.sequential_ordinal, "true")}}
if (!callback_.is_null()) if (!callback_.is_null())
std::move(callback_).Run({{pass_params(method.response_parameters)}}); std::move(callback_).Run({{pass_params(method.response_parameters)}});
...@@ -378,6 +378,8 @@ bool {{class_name}}_{{method.name}}_HandleSyncResponse::Accept( ...@@ -378,6 +378,8 @@ bool {{class_name}}_{{method.name}}_HandleSyncResponse::Accept(
message->mutable_payload()); message->mutable_payload());
{%- set desc = class_name~"::"~method.name~" response" %} {%- set desc = class_name~"::"~method.name~" response" %}
mojo::internal::SerializationContext serialization_context;
serialization_context.TakeHandlesFromMessage(message);
{{alloc_params(method.response_param_struct, "params", "message", method.sequential_ordinal, "true")}} {{alloc_params(method.response_param_struct, "params", "message", method.sequential_ordinal, "true")}}
{%- for param in method.response_parameters %} {%- for param in method.response_parameters %}
...@@ -399,6 +401,9 @@ bool {{class_name}}StubDispatch::Accept( ...@@ -399,6 +401,9 @@ bool {{class_name}}StubDispatch::Accept(
{{interface.name}}* impl, {{interface.name}}* impl,
mojo::Message* message) { mojo::Message* message) {
{%- if interface.methods %} {%- if interface.methods %}
mojo::internal::MessageDispatchContext dispatch_context(message);
mojo::internal::SerializationContext serialization_context;
serialization_context.TakeHandlesFromMessage(message);
switch (message->header()->name) { switch (message->header()->name) {
{%- for method in interface.methods %} {%- for method in interface.methods %}
case internal::k{{class_name}}_{{method.name}}_Name: { case internal::k{{class_name}}_{{method.name}}_Name: {
...@@ -412,7 +417,6 @@ bool {{class_name}}StubDispatch::Accept( ...@@ -412,7 +417,6 @@ bool {{class_name}}StubDispatch::Accept(
static constexpr uint32_t kMessageHash = base::MD5Hash32Constexpr( static constexpr uint32_t kMessageHash = base::MD5Hash32Constexpr(
"(Impl){{namespace_as_string}}::{{class_name}}::{{method.name}}"); "(Impl){{namespace_as_string}}::{{class_name}}::{{method.name}}");
base::TaskAnnotator::ScopedSetIpcHash scoped_ipc_hash(kMessageHash); base::TaskAnnotator::ScopedSetIpcHash scoped_ipc_hash(kMessageHash);
mojo::internal::MessageDispatchContext dispatch_context(message);
{%- if method|method_supports_lazy_serialization %} {%- if method|method_supports_lazy_serialization %}
if (!message->is_serialized()) { if (!message->is_serialized()) {
auto context = message->TakeUnserializedContext< auto context = message->TakeUnserializedContext<
...@@ -457,6 +461,13 @@ bool {{class_name}}StubDispatch::AcceptWithResponder( ...@@ -457,6 +461,13 @@ bool {{class_name}}StubDispatch::AcceptWithResponder(
mojo::Message* message, mojo::Message* message,
std::unique_ptr<mojo::MessageReceiverWithStatus> responder) { std::unique_ptr<mojo::MessageReceiverWithStatus> responder) {
{%- if interface.methods %} {%- if interface.methods %}
mojo::internal::MessageDispatchContext dispatch_context(message);
mojo::internal::SerializationContext serialization_context;
serialization_context.TakeHandlesFromMessage(message);
const bool message_is_sync = message->has_flag(mojo::Message::kFlagIsSync);
const uint64_t request_id = message->request_id();
ALLOW_UNUSED_LOCAL(message_is_sync);
ALLOW_UNUSED_LOCAL(request_id);
switch (message->header()->name) { switch (message->header()->name) {
{%- for method in interface.methods %} {%- for method in interface.methods %}
case internal::k{{class_name}}_{{method.name}}_Name: { case internal::k{{class_name}}_{{method.name}}_Name: {
...@@ -470,7 +481,6 @@ bool {{class_name}}StubDispatch::AcceptWithResponder( ...@@ -470,7 +481,6 @@ bool {{class_name}}StubDispatch::AcceptWithResponder(
static constexpr uint32_t kMessageHash = base::MD5Hash32Constexpr( static constexpr uint32_t kMessageHash = base::MD5Hash32Constexpr(
"(Impl){{namespace_as_string}}::{{class_name}}::{{method.name}}"); "(Impl){{namespace_as_string}}::{{class_name}}::{{method.name}}");
base::TaskAnnotator::ScopedSetIpcHash scoped_ipc_hash(kMessageHash); base::TaskAnnotator::ScopedSetIpcHash scoped_ipc_hash(kMessageHash);
mojo::internal::MessageDispatchContext dispatch_context(message);
{%- if method|method_supports_lazy_serialization %} {%- if method|method_supports_lazy_serialization %}
if (!message->is_serialized()) { if (!message->is_serialized()) {
auto context = message->TakeUnserializedContext< auto context = message->TakeUnserializedContext<
...@@ -483,9 +493,7 @@ bool {{class_name}}StubDispatch::AcceptWithResponder( ...@@ -483,9 +493,7 @@ bool {{class_name}}StubDispatch::AcceptWithResponder(
} else { } else {
{{class_name}}::{{method.name}}Callback callback = {{class_name}}::{{method.name}}Callback callback =
{{class_name}}_{{method.name}}_ProxyToResponder::CreateCallback( {{class_name}}_{{method.name}}_ProxyToResponder::CreateCallback(
message->request_id(), message->request_id(), message_is_sync, &responder);
message->has_flag(mojo::Message::kFlagIsSync),
std::move(responder));
context->Dispatch(message, impl, std::move(callback)); context->Dispatch(message, impl, std::move(callback));
return true; return true;
} }
...@@ -502,9 +510,7 @@ bool {{class_name}}StubDispatch::AcceptWithResponder( ...@@ -502,9 +510,7 @@ bool {{class_name}}StubDispatch::AcceptWithResponder(
indent(4)}} indent(4)}}
{{class_name}}::{{method.name}}Callback callback = {{class_name}}::{{method.name}}Callback callback =
{{class_name}}_{{method.name}}_ProxyToResponder::CreateCallback( {{class_name}}_{{method.name}}_ProxyToResponder::CreateCallback(
message->request_id(), message->request_id(), message_is_sync, &responder);
message->has_flag(mojo::Message::kFlagIsSync),
std::move(responder));
// A null |impl| means no implementation was bound. // A null |impl| means no implementation was bound.
DCHECK(impl); DCHECK(impl);
impl->{{method.name}}( impl->{{method.name}}(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment