| 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 0ae22ee3de0e8e2169407aaed02cc12162270749..f3e0c7778385cca5fe9194760234663f33ab928f 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
|
| @@ -1,27 +1,30 @@
|
| -size_t GetSerializedSize_({{union.name}}Ptr& input,
|
| - bool inlined,
|
| - mojo::internal::SerializationContext* context) {
|
| - size_t size = 0U;
|
| - if (!inlined) {
|
| - size += sizeof(internal::{{union.name}}_Data);
|
| - }
|
| +{%- set mojom_type = union|get_qualified_name_for_kind %}
|
| +{%- set data_type = union|get_qualified_name_for_kind(internal=True) %}
|
| +
|
| +namespace internal {
|
| +
|
| +// static
|
| +size_t UnionSerializerImpl<{{mojom_type}}Ptr>::PrepareToSerialize(
|
| + {{mojom_type}}Ptr& input,
|
| + bool inlined,
|
| + SerializationContext* context) {
|
| + size_t size = inlined ? 0 : sizeof({{data_type}});
|
|
|
| if (!input)
|
| return size;
|
|
|
| - mojo::internal::UnionAccessor<{{union.name}}> input_acc(input.get());
|
| + UnionAccessor<{{mojom_type}}> input_acc(input.get());
|
| switch (input->which()) {
|
| {% for field in union.fields %}
|
| {% if field.kind|is_object_kind %}
|
| {%- set serializer_type = field.kind|unmapped_type_for_serializer %}
|
| - case {{union.name}}::Tag::{{field.name|upper}}:
|
| + case {{mojom_type}}::Tag::{{field.name|upper}}:
|
| {% if field.kind|is_union_kind %}
|
| - size += GetSerializedSize_(*(input_acc.data()->{{field.name}}), false, context);
|
| -{% elif field.kind|is_array_kind or field.kind|is_map_kind %}
|
| size += mojo::internal::PrepareToSerialize<{{serializer_type}}>(
|
| - *(input_acc.data()->{{field.name}}), context);
|
| + *(input_acc.data()->{{field.name}}), false, context);
|
| {% else %}
|
| - size += GetSerializedSize_(*(input_acc.data()->{{field.name}}), context);
|
| + size += mojo::internal::PrepareToSerialize<{{serializer_type}}>(
|
| + *(input_acc.data()->{{field.name}}), context);
|
| {% endif %}
|
| break;
|
| {%- endif %}
|
| @@ -32,60 +35,56 @@ size_t GetSerializedSize_({{union.name}}Ptr& input,
|
| return size;
|
| }
|
|
|
| -void SerializeUnion_({{union.name}}Ptr input,
|
| - mojo::internal::Buffer* buf,
|
| - internal::{{union.name}}_Data** output,
|
| - bool inlined,
|
| - mojo::internal::SerializationContext* context) {
|
| - internal::{{union.name}}_Data* result = *output;
|
| +// static
|
| +void UnionSerializerImpl<{{mojom_type}}Ptr>::Serialize(
|
| + {{mojom_type}}Ptr& input,
|
| + Buffer* buf,
|
| + {{data_type}}** output,
|
| + bool inlined,
|
| + SerializationContext* context) {
|
| + {{data_type}}* result = *output;
|
| if (input) {
|
| - if (!inlined) {
|
| - result = internal::{{union.name}}_Data::New(buf);
|
| - }
|
| - mojo::internal::UnionAccessor<{{union.name}}> input_acc(input.get());
|
| + if (!inlined)
|
| + result = {{data_type}}::New(buf);
|
| + UnionAccessor<{{mojom_type}}> input_acc(input.get());
|
| // TODO(azani): Handle unknown and objects.
|
| // Set the not-null flag.
|
| result->size = 16;
|
| result->tag = input->which();
|
| switch (input->which()) {
|
| {% for field in union.fields %}
|
| - case {{union.name}}::Tag::{{field.name|upper}}: {
|
| + case {{mojom_type}}::Tag::{{field.name|upper}}: {
|
| {% if field.kind|is_object_kind %}
|
| {%- set serializer_type = field.kind|unmapped_type_for_serializer %}
|
| -{% if field.kind|is_string_kind %}
|
| - Serialize_(
|
| - *(input_acc.data()->{{field.name}}),
|
| - buf, &result->data.f_{{field.name}}.ptr, context);
|
| -{% elif field.kind|is_struct_kind %}
|
| - Serialize_(
|
| - std::move(*(input_acc.data()->{{field.name}})),
|
| - buf, &result->data.f_{{field.name}}.ptr, context);
|
| -{% elif field.kind|is_union_kind %}
|
| - SerializeUnion_(
|
| - std::move(*(input_acc.data()->{{field.name}})),
|
| - buf, &result->data.f_{{field.name}}.ptr, false, context);
|
| +{% if field.kind|is_union_kind %}
|
| + mojo::internal::Serialize<{{serializer_type}}>(
|
| + *(input_acc.data()->{{field.name}}), buf,
|
| + &result->data.f_{{field.name}}.ptr, false, context);
|
| {% elif field.kind|is_array_kind or field.kind|is_map_kind %}
|
| - const mojo::internal::ArrayValidateParams {{field.name}}_validate_params(
|
| + const ArrayValidateParams {{field.name}}_validate_params(
|
| {{field.kind|get_array_validate_params_ctor_args|indent(16)}});
|
| mojo::internal::Serialize<{{serializer_type}}>(
|
| *(input_acc.data()->{{field.name}}), buf,
|
| &result->data.f_{{field.name}}.ptr, &{{field.name}}_validate_params,
|
| context);
|
| +{% else %}
|
| + mojo::internal::Serialize<{{serializer_type}}>(
|
| + *(input_acc.data()->{{field.name}}), buf,
|
| + &result->data.f_{{field.name}}.ptr, context);
|
| {%- endif %}
|
| {% elif field.kind|is_any_handle_kind %}
|
| result->data.f_{{field.name}} = context->handles.AddHandle(
|
| input_acc.data()->{{field.name}}->release());
|
| {% elif field.kind|is_interface_kind %}
|
| - mojo::internal::Interface_Data* {{field.name}} =
|
| - reinterpret_cast<mojo::internal::Interface_Data*>(
|
| - &result->data.f_{{field.name}});
|
| - mojo::internal::InterfacePointerToData(
|
| - std::move(*input_acc.data()->{{field.name}}), {{field.name}},
|
| - context);
|
| + Interface_Data* {{field.name}} = reinterpret_cast<Interface_Data*>(
|
| + &result->data.f_{{field.name}});
|
| + InterfacePointerToData(std::move(*input_acc.data()->{{field.name}}),
|
| + {{field.name}}, context);
|
| {%- elif field.kind|is_associated_kind %}
|
| // TODO(yzshen): add seralization logic for associated kinds.
|
| {% elif field.kind|is_enum_kind %}
|
| - result->data.f_{{field.name}} = static_cast<int32_t>(input_acc.data()->{{field.name}});
|
| + result->data.f_{{field.name}} =
|
| + static_cast<int32_t>(input_acc.data()->{{field.name}});
|
| {% else %}
|
| result->data.f_{{field.name}} = input_acc.data()->{{field.name}};
|
| {%- endif %}
|
| @@ -101,46 +100,43 @@ void SerializeUnion_({{union.name}}Ptr input,
|
| *output = result;
|
| }
|
|
|
| -bool Deserialize_(internal::{{union.name}}_Data* input,
|
| - {{union.name}}Ptr* output,
|
| - mojo::internal::SerializationContext* context) {
|
| +// static
|
| +bool UnionSerializerImpl<{{mojom_type}}Ptr>::Deserialize(
|
| + {{data_type}}* input,
|
| + {{mojom_type}}Ptr* output,
|
| + SerializationContext* context) {
|
| bool success = true;
|
| if (input && !input->is_null()) {
|
| - {{union.name}}Ptr result({{union.name}}::New());
|
| - mojo::internal::UnionAccessor<{{union.name}}> result_acc(result.get());
|
| + {{mojom_type}}Ptr result({{mojom_type}}::New());
|
| + UnionAccessor<{{mojom_type}}> result_acc(result.get());
|
| switch (input->tag) {
|
| {% for field in union.fields %}
|
| - case {{union.name}}::Tag::{{field.name|upper}}: {
|
| + case {{mojom_type}}::Tag::{{field.name|upper}}: {
|
| {% if field.kind|is_object_kind %}
|
| {%- set serializer_type = field.kind|unmapped_type_for_serializer %}
|
| - result_acc.SwitchActive({{union.name}}::Tag::{{field.name|upper}});
|
| -{%- if field.kind|is_array_kind or field.kind|is_map_kind %}
|
| + result_acc.SwitchActive({{mojom_type}}::Tag::{{field.name|upper}});
|
| if (!mojo::internal::Deserialize<{{serializer_type}}>(
|
| input->data.f_{{field.name}}.ptr,
|
| result_acc.data()->{{field.name}}, context))
|
| success = false;
|
| -{%- else %}
|
| - if (!Deserialize_(input->data.f_{{field.name}}.ptr, result_acc.data()->{{field.name}}, context))
|
| - success = false;
|
| -{%- endif %}
|
| {% elif field.kind|is_any_handle_kind %}
|
| {{field.kind|cpp_wrapper_type}} {{field.name}};
|
| {{field.name}} = context->handles.TakeHandleAs<
|
| - typename decltype({{field.name}})::RawHandleType>(
|
| + typename {{field.kind|cpp_wrapper_type}}::RawHandleType>(
|
| input->data.f_{{field.name}});
|
| result->set_{{field.name}}(std::move({{field.name}}));
|
| {% elif field.kind|is_interface_kind %}
|
| - {{field.kind|cpp_wrapper_type}} {{field.name}}_out;
|
| - mojo::internal::Interface_Data* {{field.name}}_in =
|
| - reinterpret_cast<mojo::internal::Interface_Data*>(
|
| - &input->data.f_{{field.name}});
|
| - mojo::internal::InterfaceDataToPointer(
|
| - {{field.name}}_in, &{{field.name}}_out, context);
|
| + {{field.kind|get_qualified_name_for_kind}}Ptr {{field.name}}_out;
|
| + Interface_Data* {{field.name}}_in = reinterpret_cast<Interface_Data*>(
|
| + &input->data.f_{{field.name}});
|
| + InterfaceDataToPointer({{field.name}}_in, &{{field.name}}_out, context);
|
| result->set_{{field.name}}(std::move({{field.name}}_out));
|
| {%- elif field.kind|is_associated_kind %}
|
| // TODO(yzshen): add deserialization logic for associated kinds.
|
| {% elif field.kind|is_enum_kind %}
|
| - result->set_{{field.name}}(static_cast<{{field.kind|cpp_wrapper_type}}>(input->data.f_{{field.name}}));
|
| + result->set_{{field.name}}(
|
| + static_cast<{{field.kind|get_qualified_name_for_kind}}>(
|
| + input->data.f_{{field.name}}));
|
| {% else %}
|
| result->set_{{field.name}}(input->data.f_{{field.name}});
|
| {%- endif %}
|
| @@ -154,3 +150,5 @@ bool Deserialize_(internal::{{union.name}}_Data* input,
|
| }
|
| return success;
|
| }
|
| +
|
| +} // namespace internal
|
|
|