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

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

Issue 2250183003: Make the fuchsia mojo/public repo the source of truth. (Closed) Base URL: https://github.com/domokit/mojo.git@master
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 unified diff | Download patch
OLDNEW
(Empty)
1 {% import 'struct_macros.tmpl' as struct_macros without context %}
2 {# Assumes |input| is an InlinedStruct. #}
3 size_t GetSerializedSize_(const {{union.name}}Ptr& input) {
4 size_t size = sizeof(internal::{{union.name}}_Data);
5 if (!input)
6 return size;
7
8 mojo::internal::UnionAccessor<{{union.name}}> input_acc(input.get());
9 switch (input->which()) {
10 {% for field in union.fields %}
11 {% if field.kind|is_object_kind %}
12 case {{union.name}}::Tag::{{field.name|upper}}:
13 {% if field.kind|is_union_kind %}
14 if ((input_acc.data()->{{field.name}})) {
15 //size += sizeof(mojo::internal::UnionPointer<{{field.kind|get_name_for_ kind}}::Data_>);
16 size += GetSerializedSize_(*(input_acc.data()->{{field.name}}));
17 }
18 {% elif field.kind|is_struct_kind %}
19 size += GetSerializedSize_(*(input_acc.data()->{{field.name}}->get()));
20 {% else %}
21 size += GetSerializedSize_(*(input_acc.data()->{{field.name}}));
22 {% endif %}
23 break;
24 {%- endif %}
25 {%- endfor %}
26 default:
27 break;
28 }
29 return size;
30 }
31
32 {#
33 |input|: Could be mutated if it contains handles.
34 |buf|: Used to allocate memory, should we need it.
35 |output|: Serialize into *output; it is expected that *output points to a
36 memory we can serialize into without allocating from |buf|. However,
37 if this union contains another union, we will use |buf| to allocate
38 memory and serialize out-of-line.
39 #}
40 mojo::internal::ValidationError SerializeUnion_(
41 {{union.name}}* input,
42 mojo::internal::Buffer* buf,
43 internal::{{union.name}}_Data** output) {
44 internal::{{union.name}}_Data* result = *output;
45 if (input) {
46 mojo::internal::UnionAccessor<{{union.name}}> input_acc(input);
47 // TODO(azani): Handle unknown and objects.
48 // Set the not-null flag.
49 result->size = 16;
50 result->tag = input->which();
51 switch (input->which()) {
52 {% for field in union.fields %}
53 case {{union.name}}::Tag::{{field.name|upper}}: {
54 {% if field.kind|is_object_kind %}
55 {% if field.kind|is_string_kind %}
56 SerializeString_(
57 *input_acc.data()->{{field.name}},
58 buf, &result->data.f_{{field.name}}.ptr);
59 {% elif field.kind|is_struct_kind %}
60 {{struct_macros.call_serialize_struct(
61 input = "input_acc.data()->%s->get()"|format(field.name),
62 buffer = "buf",
63 output = "&result->data.f_%s.ptr"|format(field.name),
64 should_return_errors = true)|indent(6)}}
65 {% elif field.kind|is_union_kind %}
66 // Point *output to newly allocated memory
67 // SerializeUnion_ into newly allocated memory.
68 if (!{{"input_acc.data()->%s->get()"|format(field.name)}}) {
69 {{"result->data.f_%s.ptr"|format(field.name)}} = nullptr;
70 } else {
71 {{"result->data.f_%s.ptr"|format(field.name)}} =
72 {{field.kind|get_name_for_kind}}::Data_::New(buf);
73 {{struct_macros.call_serialize_union(
74 input = "input_acc.data()->%s->get()"|format(field.name),
75 buffer = "buf",
76 output = "&result->data.f_%s.ptr"|format(field.name),
77 should_return_errors = true)|indent(8)}}
78 }
79 {% elif field.kind|is_array_kind %}
80 {{struct_macros.call_serialize_array(
81 name = field.name,
82 kind = field.kind,
83 input = "input_acc.data()->%s"|format(field.name),
84 buffer = "buf",
85 output = "&result->data.f_%s.ptr"|format(field.name),
86 should_return_errors = true,
87 indent_size = 16)|indent(6)}}
88 {% elif field.kind|is_map_kind %}
89 {{struct_macros.call_serialize_map(
90 name = field.name,
91 kind = field.kind,
92 input = "input_acc.data()->%s"|format(field.name),
93 buffer = "buf",
94 output = "&result->data.f_%s.ptr"|format(field.name),
95 should_return_errors = true,
96 indent_size = 16)|indent(6)}}
97 {%- endif %}
98 {% elif field.kind|is_any_handle_kind %}
99 result->data.f_{{field.name}} =
100 input_acc.data()->{{field.name}}->release().value();
101 {% elif field.kind|is_interface_kind %}
102 mojo::internal::Interface_Data* {{field.name}} =
103 reinterpret_cast<mojo::internal::Interface_Data*>(
104 &result->data.f_{{field.name}});
105 mojo::internal::InterfaceHandleToData(
106 input_acc.data()->{{field.name}}->Pass(), {{field.name}});
107 {% elif field.kind|is_enum_kind %}
108 result->data.f_{{field.name}} =
109 static_cast<int32_t>(input_acc.data()->{{field.name}});
110 {% else %}
111 result->data.f_{{field.name}} = input_acc.data()->{{field.name}};
112 {%- endif %}
113 break;
114 }
115 {%- endfor %}
116 default:
117 // TODO(vardhan): Should this return an error code instead?
118 MOJO_CHECK(false) << "No sane way to serialize a union with an unknown t ag.";
119 break;
120 }
121 } else {
122 result->set_null();
123 }
124 return mojo::internal::ValidationError::NONE;
125 }
126
127 void Deserialize_(internal::{{union.name}}_Data* input,
128 {{union.name}}* output) {
129 if (input && !input->is_null()) {
130 mojo::internal::UnionAccessor<{{union.name}}> result_acc(output);
131 switch (input->tag) {
132 {#- TODO(vardhan): There is a lot of overlap with struct_macros.deserialize()
133 here, is it possible to merge? (currently looks very hairy) #}
134 {% for field in union.fields %}
135 case {{union.name}}::Tag::{{field.name|upper}}: {
136 {% if field.kind|is_object_kind %}
137 result_acc.SwitchActive({{union.name}}::Tag::{{field.name|upper}});
138 {% if field.kind|is_struct_kind or field.kind|is_union_kind %}
139 *result_acc.data()->{{field.name}} =
140 {{field.kind|get_name_for_kind}}::New();
141 Deserialize_(input->data.f_{{field.name}}.ptr,
142 result_acc.data()->{{field.name}}->get());
143 {% else %}
144 Deserialize_(input->data.f_{{field.name}}.ptr, result_acc.data()->{{fiel d.name}});
145 {% endif %}
146 {% elif field.kind|is_any_handle_kind %}
147 {{field.kind|cpp_wrapper_type}}* {{field.name}} =
148 reinterpret_cast<{{field.kind|cpp_wrapper_type}}*>(&input->data.f_{{ field.name}});
149 output->set_{{field.name}}({{field.name}}->Pass());
150 {% elif field.kind|is_interface_kind %}
151 {{field.kind|cpp_wrapper_type}} {{field.name}}_out;
152 mojo::internal::Interface_Data* {{field.name}}_in =
153 reinterpret_cast<mojo::internal::Interface_Data*>(
154 &input->data.f_{{field.name}});
155 mojo::internal::InterfaceDataToHandle(
156 {{field.name}}_in, &{{field.name}}_out);
157 output->set_{{field.name}}({{field.name}}_out.Pass());
158 {% elif field.kind|is_enum_kind %}
159 output->set_{{field.name}}(static_cast<{{field.kind|cpp_wrapper_type}}>( input->data.f_{{field.name}}));
160 {% else %}
161 output->set_{{field.name}}(input->data.f_{{field.name}});
162 {%- endif %}
163 break;
164 }
165 {%- endfor %}
166 default:
167 MOJO_LOG(WARNING) << "Deserializing {{union.name}} with unknown tag!";
168 // No way to deserialize the data when we encounter an unknown tag.
169 break;
170 }
171 }
172 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698