Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(57)

Unified Diff: mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl

Issue 611633002: mojom: Add associative arrays to the mojom language. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix gn build. Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
index bb5b777346b0ac9fed58efb2bbf4c5ad5def354e..9cade2d118c5b6c9db554f18a709a3095fff7c8b 100644
--- a/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
+++ b/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
@@ -5,7 +5,14 @@
{%- macro alloc_params(parameters) %}
{%- for param in parameters %}
-{%- if param.kind|is_object_kind %}
+{%- if param.kind|is_map_kind %}
+mojo::Array<{{param.kind.key_kind|cpp_result_type}}> p{{loop.index}}_keys;
+Deserialize_(params->{{param.name}}_keys.ptr, &p{{loop.index}}_keys);
+mojo::Array<{{param.kind.value_kind|cpp_result_type}}> p{{loop.index}}_values;
+Deserialize_(params->{{param.name}}_values.ptr, &p{{loop.index}}_values);
+{{param.kind|cpp_result_type}} p{{loop.index}}(p{{loop.index}}_keys.Pass(),
+ p{{loop.index}}_values.Pass());
+{%- elif param.kind|is_object_kind %}
{{param.kind|cpp_result_type}} p{{loop.index}};
Deserialize_(params->{{param.name}}.ptr, &p{{loop.index}});
{% endif -%}
@@ -33,12 +40,27 @@ params->{{param.name}}
{%- endfor %}
{%- endmacro %}
+{%- macro mapping_prelude(parameters) -%}
+{%- for param in parameters %}
+{%- if param.kind|is_map_kind %}
+ mojo::Array<{{param.kind.key_kind|cpp_result_type}}> in_{{param.name}}_keys;
+ mojo::Array<{{param.kind.value_kind|cpp_result_type}}> in_{{param.name}}_values;
+ in_{{param.name}}.DecomposeMapTo(&in_{{param.name}}_keys,
+ &in_{{param.name}}_values);
+{%- endif -%}
+{%- endfor -%}
+{%- endmacro %}
+
+
{%- macro compute_payload_size(params_name, parameters) -%}
size_t payload_size =
mojo::internal::Align(sizeof({{params_name}}));
{#--- Computes #}
{%- for param in parameters %}
-{%- if param.kind|is_object_kind %}
+{%- if param.kind|is_map_kind %}
+ payload_size += GetSerializedSize_(in_{{param.name}}_keys);
+ payload_size += GetSerializedSize_(in_{{param.name}}_values);
+{%- elif param.kind|is_object_kind %}
payload_size += GetSerializedSize_(in_{{param.name}});
{%- endif %}
{%- endfor %}
@@ -55,14 +77,30 @@ params->{{param.name}}
{%- if param.kind|is_any_array_kind %}
mojo::SerializeArray_<{{param.kind|get_array_validate_params|indent(24)}}>(
mojo::internal::Forward(in_{{param.name}}), builder.buffer(), &params->{{param.name}}.ptr);
+{%- elif param.kind|is_map_kind %}
+ mojo::SerializeArray_<{{param.kind.key_kind|get_map_validate_params|indent(24)}}>(
+ mojo::internal::Forward(in_{{param.name}}_keys), builder.buffer(), &params->{{param.name}}_keys.ptr);
+ mojo::SerializeArray_<{{param.kind.value_kind|get_map_validate_params|indent(24)}}>(
+ mojo::internal::Forward(in_{{param.name}}_values), builder.buffer(), &params->{{param.name}}_values.ptr);
{%- else %}
Serialize_(mojo::internal::Forward(in_{{param.name}}), builder.buffer(), &params->{{param.name}}.ptr);
{%- endif %}
{%- if not param.kind|is_nullable_kind %}
+{%- if param.kind|is_map_kind %}
+ MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING(
+ !params->{{param.name}}_keys.ptr,
+ mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER,
+ "null key array for {{param.name}} argument in {{params_description}}");
+ MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING(
+ !params->{{param.name}}_values.ptr,
+ mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER,
+ "null key array for {{param.name}} argument in {{params_description}}");
+{%- else %}
MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING(
!params->{{param.name}}.ptr,
mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER,
"null {{param.name}} argument in {{params_description}}");
+{%- endif %}
{%- endif %}
{%- elif param.kind|is_any_handle_kind %}
{%- if param.kind|is_interface_kind or
@@ -138,6 +176,8 @@ bool {{class_name}}_{{method.name}}_ForwardToCallback::Accept(
"%s.%s request"|format(interface.name, method.name) %}
void {{proxy_name}}::{{method.name}}(
{{interface_macros.declare_request_params("in_", method)}}) {
+ {{mapping_prelude(method.parameters)}}
+
{{compute_payload_size(params_name, method.parameters)}}
{%- if method.response_parameters != None %}
@@ -193,6 +233,8 @@ class {{class_name}}_{{method.name}}_ProxyToResponder
};
void {{class_name}}_{{method.name}}_ProxyToResponder::Run(
{{interface_macros.declare_params("in_", method.response_parameters)}}) const {
+ {{mapping_prelude(method.response_parameters)}}
+
{{compute_payload_size(params_name, method.response_parameters)}}
mojo::internal::ResponseMessageBuilder builder(
{{message_name}}, payload_size, request_id_);

Powered by Google App Engine
This is Rietveld 408576698