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

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

Issue 1956603002: Mojo C++ bindings: switch union to use the new serialization interface. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@20_array_serializer
Patch Set: Created 4 years, 7 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 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

Powered by Google App Engine
This is Rietveld 408576698