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

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

Issue 2226853002: Mojo C++ bindings: add support for UnionTraits. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@85_10_inline_more
Patch Set: . Created 4 years, 4 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/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 5a11ff798c4e581b2479b89ca1565ce970077518..c2480a8d941ceb98d785c6604f3925fc1dad7b3a 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,164 +1,42 @@
{%- 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;
-
- 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 {{mojom_type}}::Tag::{{field.name|upper}}:
-{% if field.kind|is_union_kind %}
- size += mojo::internal::PrepareToSerialize<{{serializer_type}}>(
- *(input_acc.data()->{{field.name}}), false, context);
-{% else %}
- size += mojo::internal::PrepareToSerialize<{{serializer_type}}>(
- *(input_acc.data()->{{field.name}}), context);
-{% endif %}
- break;
-{%- endif %}
-{%- endfor %}
- default:
- break;
- }
- return size;
-}
-
-// 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 = {{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()) {
+bool UnionTraits<{{mojom_type}}, {{mojom_type}}Ptr>::Read(
+ {{mojom_type}}DataView input,
+ {{mojom_type}}Ptr* output) {
+ *output = {{mojom_type}}::New();
+ {{mojom_type}}Ptr& result = *output;
+
+ internal::UnionAccessor<{{mojom_type}}> result_acc(result.get());
+ switch (input.tag()) {
{%- for field in union.fields %}
- case {{mojom_type}}::Tag::{{field.name|upper}}: {
-{%- set serializer_type = field.kind|unmapped_type_for_serializer %}
-{%- if field.kind|is_object_kind %}
- typename decltype(result->data.f_{{field.name}})::BaseType* ptr;
-{%- if field.kind|is_union_kind %}
- mojo::internal::Serialize<{{serializer_type}}>(
- *(input_acc.data()->{{field.name}}), buf, &ptr, false, context);
-{%- elif field.kind|is_array_kind or field.kind|is_map_kind %}
- const ContainerValidateParams {{field.name}}_validate_params(
- {{field.kind|get_container_validate_params_ctor_args|indent(16)}});
- mojo::internal::Serialize<{{serializer_type}}>(
- *(input_acc.data()->{{field.name}}), buf, &ptr,
- &{{field.name}}_validate_params, context);
-{%- else %}
- mojo::internal::Serialize<{{serializer_type}}>(
- *(input_acc.data()->{{field.name}}), buf, &ptr, context);
-{%- endif %}
- result->data.f_{{field.name}}.Set(ptr);
-{%- if not field.kind|is_nullable_kind %}
- MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING(
- !ptr, mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER,
- "null {{field.name}} in {{union.name}} union");
-{%- endif %}
-
-{%- elif field.kind|is_any_handle_or_interface_kind %}
- mojo::internal::Serialize<{{serializer_type}}>(
- *input_acc.data()->{{field.name}}, &result->data.f_{{field.name}},
- context);
-{%- if not field.kind|is_nullable_kind %}
- MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING(
- !mojo::internal::IsHandleOrInterfaceValid(result->data.f_{{field.name}}),
-{%- if field.kind|is_associated_kind %}
- mojo::internal::VALIDATION_ERROR_UNEXPECTED_INVALID_INTERFACE_ID,
-{%- else %}
- mojo::internal::VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE,
-{%- endif %}
- "invalid {{field.name}} in {{union.name}} union");
-{%- endif %}
-
-{%- elif field.kind|is_enum_kind %}
- mojo::internal::Serialize<{{serializer_type}}>(
- input_acc.data()->{{field.name}}, &result->data.f_{{field.name}});
+ case {{mojom_type}}::Tag::{{field.name|upper}}: {
+{%- set name = field.name %}
+{%- set kind = field.kind %}
+{%- set serializer_type = kind|unmapped_type_for_serializer %}
+{%- if kind|is_object_kind %}
+ result_acc.SwitchActive({{mojom_type}}::Tag::{{name|upper}});
+ if (!input.Read{{name|under_to_camel}}(result_acc.data()->{{name}}))
+ return false;
+
+{%- elif kind|is_any_handle_or_interface_kind %}
+ auto result_{{name}} = input.Take{{name|under_to_camel}}();
+ result->set_{{name}}(std::move(result_{{name}}));
+
+{%- elif kind|is_enum_kind %}
+ decltype(result->get_{{name}}()) result_{{name}};
+ if (!input.Read{{name|under_to_camel}}(&result_{{name}}))
+ return false;
+ result->set_{{name}}(result_{{name}});
{%- else %}
- result->data.f_{{field.name}} = input_acc.data()->{{field.name}};
+ result->set_{{name}}(input.{{name}}());
{%- endif %}
- break;
- }
-{%- endfor %}
+ break;
}
- } else if (inlined) {
- result->set_null();
- } else {
- result = nullptr;
- }
- *output = result;
-}
-
-// static
-bool UnionSerializerImpl<{{mojom_type}}Ptr>::Deserialize(
- {{data_type}}* input,
- {{mojom_type}}Ptr* output,
- SerializationContext* context) {
- bool success = true;
- if (input && !input->is_null()) {
- {{mojom_type}}Ptr result({{mojom_type}}::New());
- UnionAccessor<{{mojom_type}}> result_acc(result.get());
- switch (input->tag) {
-{%- for field in union.fields %}
- case {{mojom_type}}::Tag::{{field.name|upper}}: {
-{%- set serializer_type = field.kind|unmapped_type_for_serializer %}
-{%- if field.kind|is_object_kind %}
- result_acc.SwitchActive({{mojom_type}}::Tag::{{field.name|upper}});
- if (!mojo::internal::Deserialize<{{serializer_type}}>(
- input->data.f_{{field.name}}.Get(),
- result_acc.data()->{{field.name}}, context))
- success = false;
-
-{%- elif field.kind|is_any_handle_or_interface_kind %}
- typename std::remove_reference<
- decltype(result->get_{{field.name}}())>::type result_{{field.name}};
- bool ret = mojo::internal::Deserialize<{{serializer_type}}>(
- &input->data.f_{{field.name}}, &result_{{field.name}}, context);
- DCHECK(ret);
- result->set_{{field.name}}(std::move(result_{{field.name}}));
-
-{%- elif field.kind|is_enum_kind %}
- decltype(result->get_{{field.name}}()) result_{{field.name}};
- if (!mojo::internal::Deserialize<{{serializer_type}}>(
- input->data.f_{{field.name}}, &result_{{field.name}}))
- success = false;
- else
- result->set_{{field.name}}(result_{{field.name}});
-
-{%- else %}
- result->set_{{field.name}}(input->data.f_{{field.name}});
-{%- endif %}
- break;
- }
{%- endfor %}
- }
- *output = std::move(result);
- } else {
- output->reset();
+ default:
+ return false;
}
- return success;
+ return true;
}
-
-} // namespace internal

Powered by Google App Engine
This is Rietveld 408576698