Index: mojo/public/tools/bindings/generators/cpp_templates/union_serialization_definition.tmpl |
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/union_serialization_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/union_serialization_definition.tmpl |
index 918e460cafbdc378bf5a95c84cc95d95723cbaab..53b212653eb646efc5ee95b399ae31658c29d959 100644 |
--- a/mojo/public/tools/bindings/generators/cpp_templates/union_serialization_definition.tmpl |
+++ b/mojo/public/tools/bindings/generators/cpp_templates/union_serialization_definition.tmpl |
@@ -14,6 +14,8 @@ size_t GetSerializedSize_(const {{union.name}}Ptr& input, bool inlined) { |
case {{union.name}}::Tag::{{field.name|upper}}: |
{% if field.kind|is_union_kind %} |
size += GetSerializedSize_(*(input_acc.data()->{{field.name}}), false); |
+{% elif field.kind|is_struct_kind %} |
+ size += GetSerializedSize_(*(input_acc.data()->{{field.name}}->get())); |
{% else %} |
size += GetSerializedSize_(*(input_acc.data()->{{field.name}})); |
{% endif %} |
@@ -26,14 +28,14 @@ size_t GetSerializedSize_(const {{union.name}}Ptr& input, bool inlined) { |
return size; |
} |
-void SerializeUnion_({{union.name}}Ptr input, mojo::internal::Buffer* buf, |
+void SerializeUnion_({{union.name}}* input, mojo::internal::Buffer* buf, |
internal::{{union.name}}_Data** output, bool inlined) { |
internal::{{union.name}}_Data* result = *output; |
if (input) { |
if (!inlined) { |
result = internal::{{union.name}}_Data::New(buf); |
} |
- mojo::internal::UnionAccessor<{{union.name}}> input_acc(input.get()); |
+ mojo::internal::UnionAccessor<{{union.name}}> input_acc(input); |
// TODO(azani): Handle unknown and objects. |
// Set the not-null flag. |
result->size = 16; |
@@ -43,28 +45,28 @@ void SerializeUnion_({{union.name}}Ptr input, mojo::internal::Buffer* buf, |
case {{union.name}}::Tag::{{field.name|upper}}: { |
{% if field.kind|is_object_kind %} |
{% if field.kind|is_string_kind %} |
- Serialize_( |
- *(input_acc.data()->{{field.name}}), |
+ SerializeString_( |
+ *input_acc.data()->{{field.name}}, |
buf, &result->data.f_{{field.name}}.ptr); |
{% elif field.kind|is_struct_kind %} |
Serialize_( |
- mojo::internal::Forward(*(input_acc.data()->{{field.name}})), |
+ input_acc.data()->{{field.name}}->get(), |
buf, &result->data.f_{{field.name}}.ptr); |
{% elif field.kind|is_union_kind %} |
SerializeUnion_( |
- mojo::internal::Forward(*(input_acc.data()->{{field.name}})), |
+ input_acc.data()->{{field.name}}->get(), |
buf, &result->data.f_{{field.name}}.ptr, false); |
{% elif field.kind|is_array_kind %} |
const mojo::internal::ArrayValidateParams {{field.name}}_validate_params( |
{{field.kind|get_array_validate_params_ctor_args|indent(16)}}); |
SerializeArray_( |
- mojo::internal::Forward(*(input_acc.data()->{{field.name}})), |
+ input_acc.data()->{{field.name}}, |
buf, &result->data.f_{{field.name}}.ptr, &{{field.name}}_validate_params); |
{% elif field.kind|is_map_kind %} |
const mojo::internal::ArrayValidateParams {{field.name}}_validate_params( |
{{field.kind.value_kind|get_map_validate_params_ctor_args|indent(16)}}); |
SerializeMap_( |
- mojo::internal::Forward(*(input_acc.data()->{{field.name}})), |
+ input_acc.data()->{{field.name}}, |
buf, &result->data.f_{{field.name}}.ptr, &{{field.name}}_validate_params); |
{%- endif %} |
{% elif field.kind|is_any_handle_kind %} |
@@ -95,20 +97,28 @@ void SerializeUnion_({{union.name}}Ptr input, mojo::internal::Buffer* buf, |
} |
void Deserialize_(internal::{{union.name}}_Data* input, |
- {{union.name}}Ptr* output) { |
+ {{union.name}}* output) { |
if (input && !input->is_null()) { |
- {{union.name}}Ptr result({{union.name}}::New()); |
- mojo::internal::UnionAccessor<{{union.name}}> result_acc(result.get()); |
+ mojo::internal::UnionAccessor<{{union.name}}> result_acc(output); |
switch (input->tag) { |
+{#- TODO(vardhan): There is a lot of overlap with struct_macros.deserialize() |
+ here, is it possible to merge? (currently looks very hairy) #} |
{% for field in union.fields %} |
case {{union.name}}::Tag::{{field.name|upper}}: { |
{% if field.kind|is_object_kind %} |
result_acc.SwitchActive({{union.name}}::Tag::{{field.name|upper}}); |
+{% if field.kind|is_struct_kind or field.kind|is_union_kind %} |
+ *result_acc.data()->{{field.name}} = |
+ {{field.kind|get_name_for_kind}}::New(); |
+ Deserialize_(input->data.f_{{field.name}}.ptr, |
+ result_acc.data()->{{field.name}}->get()); |
+{% else %} |
Deserialize_(input->data.f_{{field.name}}.ptr, result_acc.data()->{{field.name}}); |
+{% endif %} |
{% elif field.kind|is_any_handle_kind %} |
{{field.kind|cpp_wrapper_type}}* {{field.name}} = |
reinterpret_cast<{{field.kind|cpp_wrapper_type}}*>(&input->data.f_{{field.name}}); |
- result->set_{{field.name}}({{field.name}}->Pass()); |
+ output->set_{{field.name}}({{field.name}}->Pass()); |
{% elif field.kind|is_interface_kind %} |
{{field.kind|cpp_wrapper_type}} {{field.name}}_out; |
mojo::internal::Interface_Data* {{field.name}}_in = |
@@ -116,11 +126,11 @@ void Deserialize_(internal::{{union.name}}_Data* input, |
&input->data.f_{{field.name}}); |
mojo::internal::InterfaceDataToPointer( |
{{field.name}}_in, &{{field.name}}_out); |
- result->set_{{field.name}}({{field.name}}_out.Pass()); |
+ output->set_{{field.name}}({{field.name}}_out.Pass()); |
{% elif field.kind|is_enum_kind %} |
- result->set_{{field.name}}(static_cast<{{field.kind|cpp_wrapper_type}}>(input->data.f_{{field.name}})); |
+ output->set_{{field.name}}(static_cast<{{field.kind|cpp_wrapper_type}}>(input->data.f_{{field.name}})); |
{% else %} |
- result->set_{{field.name}}(input->data.f_{{field.name}}); |
+ output->set_{{field.name}}(input->data.f_{{field.name}}); |
{%- endif %} |
break; |
} |
@@ -130,8 +140,5 @@ void Deserialize_(internal::{{union.name}}_Data* input, |
// No way to deserialize the data when we encounter an unknown tag. |
break; |
} |
- *output = result.Pass(); |
- } else { |
- output->reset(); |
} |
-} |
+} |