Index: mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl |
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl |
index 234083a93dd0892c7069010de7b9fe0bd4d6174c..011433e940bc69aa5513a874119dcef79fa6a424 100644 |
--- a/mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl |
+++ b/mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl |
@@ -90,7 +90,12 @@ |
"invalid {{name}} in {{struct_display_name}}"); |
{%- endif %} |
{%- elif kind|is_associated_kind %} |
- // TODO(yzshen): add serialization logic for associated kinds. |
+ // TODO(yzshen): add some DCHECKs for non-nullable, is_local, correct router, etc. |
+{%- if kind|is_associated_interface_kind %} |
+ mojo::internal::AssociatedInterfacePtrInfoToData({{input_field}}.Pass(), &{{output}}->{{name}}); |
+{%- else %} |
+ {{output}}->{{name}} = mojo::internal::AssociatedInterfaceRequestHelper::PassHandle(&{{input_field}}).release(); |
+{%- endif %} |
{%- else %} |
{{output}}->{{name}} = {{input_field}}; |
{%- endif %} |
@@ -108,7 +113,8 @@ |
struct wrapper class. |
- method parameters/response parameters: the output is a list of |
arguments. #} |
-{%- macro deserialize(struct, input, output_field_pattern) -%} |
+ |context| is the name of the serialization context. |
+{%- macro deserialize(struct, input, output_field_pattern, context) -%} |
do { |
// NOTE: The memory backing |{{input}}| may has be smaller than |
// |sizeof(*{{input}})| if the message comes from an older version. |
@@ -128,9 +134,9 @@ |
{%- endif %} |
{%- if kind|is_object_kind %} |
{%- if kind|is_union_kind %} |
- Deserialize_(&{{input}}->{{name}}, &{{output_field}}); |
+ Deserialize_(&{{input}}->{{name}}, &{{output_field}}, {{context}}); |
{%- else %} |
- Deserialize_({{input}}->{{name}}.ptr, &{{output_field}}); |
+ Deserialize_({{input}}->{{name}}.ptr, &{{output_field}}, {{context}}); |
{%- endif %} |
{%- elif kind|is_interface_kind %} |
mojo::internal::InterfaceDataToPointer(&{{input}}->{{name}}, &{{output_field}}); |
@@ -138,8 +144,12 @@ |
{{output_field}}.Bind(mojo::MakeScopedHandle(mojo::internal::FetchAndReset(&{{input}}->{{name}}))); |
{%- elif kind|is_any_handle_kind %} |
{{output_field}}.reset(mojo::internal::FetchAndReset(&{{input}}->{{name}})); |
-{%- elif kind|is_associated_kind %} |
- // TODO(yzshen): add deserialization logic for associated kinds. |
+{%- elif kind|is_associated_interface_kind %} |
+ mojo::internal::AssociatedInterfaceDataToPtrInfo(&{{input}}->{{name}}, &{{output_field}}, ({{context}})->router.get()); |
+{%- elif kind|is_associated_interface_request_kind %} |
+ mojo::internal::AssociatedInterfaceRequestHelper::SetHandle( |
+ &{{output_field}}, |
+ ({{context}})->router->CreateLocalEndpointHandle(mojo::internal::FetchAndReset(&{{input}}->{{name}}))); |
{%- elif kind|is_enum_kind %} |
{{output_field}} = static_cast<{{kind|cpp_wrapper_type}}>({{input}}->{{name}}); |
{%- else %} |