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

Side by Side 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 unified diff | Download patch
OLDNEW
1 size_t GetSerializedSize_({{union.name}}Ptr& input, 1 {%- set mojom_type = union|get_qualified_name_for_kind %}
2 bool inlined, 2 {%- set data_type = union|get_qualified_name_for_kind(internal=True) %}
3 mojo::internal::SerializationContext* context) { 3
4 size_t size = 0U; 4 namespace internal {
5 if (!inlined) { 5
6 size += sizeof(internal::{{union.name}}_Data); 6 // static
7 } 7 size_t UnionSerializerImpl<{{mojom_type}}Ptr>::PrepareToSerialize(
8 {{mojom_type}}Ptr& input,
9 bool inlined,
10 SerializationContext* context) {
11 size_t size = inlined ? 0 : sizeof({{data_type}});
8 12
9 if (!input) 13 if (!input)
10 return size; 14 return size;
11 15
12 mojo::internal::UnionAccessor<{{union.name}}> input_acc(input.get()); 16 UnionAccessor<{{mojom_type}}> input_acc(input.get());
13 switch (input->which()) { 17 switch (input->which()) {
14 {% for field in union.fields %} 18 {% for field in union.fields %}
15 {% if field.kind|is_object_kind %} 19 {% if field.kind|is_object_kind %}
16 {%- set serializer_type = field.kind|unmapped_type_for_serializer %} 20 {%- set serializer_type = field.kind|unmapped_type_for_serializer %}
17 case {{union.name}}::Tag::{{field.name|upper}}: 21 case {{mojom_type}}::Tag::{{field.name|upper}}:
18 {% if field.kind|is_union_kind %} 22 {% if field.kind|is_union_kind %}
19 size += GetSerializedSize_(*(input_acc.data()->{{field.name}}), false, con text); 23 size += mojo::internal::PrepareToSerialize<{{serializer_type}}>(
20 {% elif field.kind|is_array_kind or field.kind|is_map_kind %} 24 *(input_acc.data()->{{field.name}}), false, context);
25 {% else %}
21 size += mojo::internal::PrepareToSerialize<{{serializer_type}}>( 26 size += mojo::internal::PrepareToSerialize<{{serializer_type}}>(
22 *(input_acc.data()->{{field.name}}), context); 27 *(input_acc.data()->{{field.name}}), context);
23 {% else %}
24 size += GetSerializedSize_(*(input_acc.data()->{{field.name}}), context);
25 {% endif %} 28 {% endif %}
26 break; 29 break;
27 {%- endif %} 30 {%- endif %}
28 {%- endfor %} 31 {%- endfor %}
29 default: 32 default:
30 break; 33 break;
31 } 34 }
32 return size; 35 return size;
33 } 36 }
34 37
35 void SerializeUnion_({{union.name}}Ptr input, 38 // static
36 mojo::internal::Buffer* buf, 39 void UnionSerializerImpl<{{mojom_type}}Ptr>::Serialize(
37 internal::{{union.name}}_Data** output, 40 {{mojom_type}}Ptr& input,
38 bool inlined, 41 Buffer* buf,
39 mojo::internal::SerializationContext* context) { 42 {{data_type}}** output,
40 internal::{{union.name}}_Data* result = *output; 43 bool inlined,
44 SerializationContext* context) {
45 {{data_type}}* result = *output;
41 if (input) { 46 if (input) {
42 if (!inlined) { 47 if (!inlined)
43 result = internal::{{union.name}}_Data::New(buf); 48 result = {{data_type}}::New(buf);
44 } 49 UnionAccessor<{{mojom_type}}> input_acc(input.get());
45 mojo::internal::UnionAccessor<{{union.name}}> input_acc(input.get());
46 // TODO(azani): Handle unknown and objects. 50 // TODO(azani): Handle unknown and objects.
47 // Set the not-null flag. 51 // Set the not-null flag.
48 result->size = 16; 52 result->size = 16;
49 result->tag = input->which(); 53 result->tag = input->which();
50 switch (input->which()) { 54 switch (input->which()) {
51 {% for field in union.fields %} 55 {% for field in union.fields %}
52 case {{union.name}}::Tag::{{field.name|upper}}: { 56 case {{mojom_type}}::Tag::{{field.name|upper}}: {
53 {% if field.kind|is_object_kind %} 57 {% if field.kind|is_object_kind %}
54 {%- set serializer_type = field.kind|unmapped_type_for_serializer %} 58 {%- set serializer_type = field.kind|unmapped_type_for_serializer %}
55 {% if field.kind|is_string_kind %} 59 {% if field.kind|is_union_kind %}
56 Serialize_( 60 mojo::internal::Serialize<{{serializer_type}}>(
57 *(input_acc.data()->{{field.name}}), 61 *(input_acc.data()->{{field.name}}), buf,
58 buf, &result->data.f_{{field.name}}.ptr, context); 62 &result->data.f_{{field.name}}.ptr, false, context);
59 {% elif field.kind|is_struct_kind %}
60 Serialize_(
61 std::move(*(input_acc.data()->{{field.name}})),
62 buf, &result->data.f_{{field.name}}.ptr, context);
63 {% elif field.kind|is_union_kind %}
64 SerializeUnion_(
65 std::move(*(input_acc.data()->{{field.name}})),
66 buf, &result->data.f_{{field.name}}.ptr, false, context);
67 {% elif field.kind|is_array_kind or field.kind|is_map_kind %} 63 {% elif field.kind|is_array_kind or field.kind|is_map_kind %}
68 const mojo::internal::ArrayValidateParams {{field.name}}_validate_params ( 64 const ArrayValidateParams {{field.name}}_validate_params(
69 {{field.kind|get_array_validate_params_ctor_args|indent(16)}}); 65 {{field.kind|get_array_validate_params_ctor_args|indent(16)}});
70 mojo::internal::Serialize<{{serializer_type}}>( 66 mojo::internal::Serialize<{{serializer_type}}>(
71 *(input_acc.data()->{{field.name}}), buf, 67 *(input_acc.data()->{{field.name}}), buf,
72 &result->data.f_{{field.name}}.ptr, &{{field.name}}_validate_params, 68 &result->data.f_{{field.name}}.ptr, &{{field.name}}_validate_params,
73 context); 69 context);
70 {% else %}
71 mojo::internal::Serialize<{{serializer_type}}>(
72 *(input_acc.data()->{{field.name}}), buf,
73 &result->data.f_{{field.name}}.ptr, context);
74 {%- endif %} 74 {%- endif %}
75 {% elif field.kind|is_any_handle_kind %} 75 {% elif field.kind|is_any_handle_kind %}
76 result->data.f_{{field.name}} = context->handles.AddHandle( 76 result->data.f_{{field.name}} = context->handles.AddHandle(
77 input_acc.data()->{{field.name}}->release()); 77 input_acc.data()->{{field.name}}->release());
78 {% elif field.kind|is_interface_kind %} 78 {% elif field.kind|is_interface_kind %}
79 mojo::internal::Interface_Data* {{field.name}} = 79 Interface_Data* {{field.name}} = reinterpret_cast<Interface_Data*>(
80 reinterpret_cast<mojo::internal::Interface_Data*>( 80 &result->data.f_{{field.name}});
81 &result->data.f_{{field.name}}); 81 InterfacePointerToData(std::move(*input_acc.data()->{{field.name}}),
82 mojo::internal::InterfacePointerToData( 82 {{field.name}}, context);
83 std::move(*input_acc.data()->{{field.name}}), {{field.name}},
84 context);
85 {%- elif field.kind|is_associated_kind %} 83 {%- elif field.kind|is_associated_kind %}
86 // TODO(yzshen): add seralization logic for associated kinds. 84 // TODO(yzshen): add seralization logic for associated kinds.
87 {% elif field.kind|is_enum_kind %} 85 {% elif field.kind|is_enum_kind %}
88 result->data.f_{{field.name}} = static_cast<int32_t>(input_acc.data()->{ {field.name}}); 86 result->data.f_{{field.name}} =
87 static_cast<int32_t>(input_acc.data()->{{field.name}});
89 {% else %} 88 {% else %}
90 result->data.f_{{field.name}} = input_acc.data()->{{field.name}}; 89 result->data.f_{{field.name}} = input_acc.data()->{{field.name}};
91 {%- endif %} 90 {%- endif %}
92 break; 91 break;
93 } 92 }
94 {%- endfor %} 93 {%- endfor %}
95 } 94 }
96 } else if (inlined) { 95 } else if (inlined) {
97 result->set_null(); 96 result->set_null();
98 } else { 97 } else {
99 result = nullptr; 98 result = nullptr;
100 } 99 }
101 *output = result; 100 *output = result;
102 } 101 }
103 102
104 bool Deserialize_(internal::{{union.name}}_Data* input, 103 // static
105 {{union.name}}Ptr* output, 104 bool UnionSerializerImpl<{{mojom_type}}Ptr>::Deserialize(
106 mojo::internal::SerializationContext* context) { 105 {{data_type}}* input,
106 {{mojom_type}}Ptr* output,
107 SerializationContext* context) {
107 bool success = true; 108 bool success = true;
108 if (input && !input->is_null()) { 109 if (input && !input->is_null()) {
109 {{union.name}}Ptr result({{union.name}}::New()); 110 {{mojom_type}}Ptr result({{mojom_type}}::New());
110 mojo::internal::UnionAccessor<{{union.name}}> result_acc(result.get()); 111 UnionAccessor<{{mojom_type}}> result_acc(result.get());
111 switch (input->tag) { 112 switch (input->tag) {
112 {% for field in union.fields %} 113 {% for field in union.fields %}
113 case {{union.name}}::Tag::{{field.name|upper}}: { 114 case {{mojom_type}}::Tag::{{field.name|upper}}: {
114 {% if field.kind|is_object_kind %} 115 {% if field.kind|is_object_kind %}
115 {%- set serializer_type = field.kind|unmapped_type_for_serializer %} 116 {%- set serializer_type = field.kind|unmapped_type_for_serializer %}
116 result_acc.SwitchActive({{union.name}}::Tag::{{field.name|upper}}); 117 result_acc.SwitchActive({{mojom_type}}::Tag::{{field.name|upper}});
117 {%- if field.kind|is_array_kind or field.kind|is_map_kind %}
118 if (!mojo::internal::Deserialize<{{serializer_type}}>( 118 if (!mojo::internal::Deserialize<{{serializer_type}}>(
119 input->data.f_{{field.name}}.ptr, 119 input->data.f_{{field.name}}.ptr,
120 result_acc.data()->{{field.name}}, context)) 120 result_acc.data()->{{field.name}}, context))
121 success = false; 121 success = false;
122 {%- else %}
123 if (!Deserialize_(input->data.f_{{field.name}}.ptr, result_acc.data()->{ {field.name}}, context))
124 success = false;
125 {%- endif %}
126 {% elif field.kind|is_any_handle_kind %} 122 {% elif field.kind|is_any_handle_kind %}
127 {{field.kind|cpp_wrapper_type}} {{field.name}}; 123 {{field.kind|cpp_wrapper_type}} {{field.name}};
128 {{field.name}} = context->handles.TakeHandleAs< 124 {{field.name}} = context->handles.TakeHandleAs<
129 typename decltype({{field.name}})::RawHandleType>( 125 typename {{field.kind|cpp_wrapper_type}}::RawHandleType>(
130 input->data.f_{{field.name}}); 126 input->data.f_{{field.name}});
131 result->set_{{field.name}}(std::move({{field.name}})); 127 result->set_{{field.name}}(std::move({{field.name}}));
132 {% elif field.kind|is_interface_kind %} 128 {% elif field.kind|is_interface_kind %}
133 {{field.kind|cpp_wrapper_type}} {{field.name}}_out; 129 {{field.kind|get_qualified_name_for_kind}}Ptr {{field.name}}_out;
134 mojo::internal::Interface_Data* {{field.name}}_in = 130 Interface_Data* {{field.name}}_in = reinterpret_cast<Interface_Data*>(
135 reinterpret_cast<mojo::internal::Interface_Data*>( 131 &input->data.f_{{field.name}});
136 &input->data.f_{{field.name}}); 132 InterfaceDataToPointer({{field.name}}_in, &{{field.name}}_out, context);
137 mojo::internal::InterfaceDataToPointer(
138 {{field.name}}_in, &{{field.name}}_out, context);
139 result->set_{{field.name}}(std::move({{field.name}}_out)); 133 result->set_{{field.name}}(std::move({{field.name}}_out));
140 {%- elif field.kind|is_associated_kind %} 134 {%- elif field.kind|is_associated_kind %}
141 // TODO(yzshen): add deserialization logic for associated kinds. 135 // TODO(yzshen): add deserialization logic for associated kinds.
142 {% elif field.kind|is_enum_kind %} 136 {% elif field.kind|is_enum_kind %}
143 result->set_{{field.name}}(static_cast<{{field.kind|cpp_wrapper_type}}>( input->data.f_{{field.name}})); 137 result->set_{{field.name}}(
138 static_cast<{{field.kind|get_qualified_name_for_kind}}>(
139 input->data.f_{{field.name}}));
144 {% else %} 140 {% else %}
145 result->set_{{field.name}}(input->data.f_{{field.name}}); 141 result->set_{{field.name}}(input->data.f_{{field.name}});
146 {%- endif %} 142 {%- endif %}
147 break; 143 break;
148 } 144 }
149 {%- endfor %} 145 {%- endfor %}
150 } 146 }
151 *output = std::move(result); 147 *output = std::move(result);
152 } else { 148 } else {
153 output->reset(); 149 output->reset();
154 } 150 }
155 return success; 151 return success;
156 } 152 }
153
154 } // namespace internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698