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

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

Issue 1387993002: mojo::Serialize*_() calls now propogate/return validation errors. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 5 years, 2 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 {% import 'struct_macros.tmpl' as struct_macros without context %}
1 size_t GetSerializedSize_(const {{union.name}}Ptr& input, bool inlined) { 2 size_t GetSerializedSize_(const {{union.name}}Ptr& input, bool inlined) {
2 size_t size = 0U; 3 size_t size = 0U;
3 if (!inlined) { 4 if (!inlined) {
4 size += sizeof(internal::{{union.name}}_Data); 5 size += sizeof(internal::{{union.name}}_Data);
5 } 6 }
6 7
7 if (!input) 8 if (!input)
8 return size; 9 return size;
9 10
10 mojo::internal::UnionAccessor<{{union.name}}> input_acc(input.get()); 11 mojo::internal::UnionAccessor<{{union.name}}> input_acc(input.get());
(...skipping 10 matching lines...) Expand all
21 {% endif %} 22 {% endif %}
22 break; 23 break;
23 {%- endif %} 24 {%- endif %}
24 {%- endfor %} 25 {%- endfor %}
25 default: 26 default:
26 break; 27 break;
27 } 28 }
28 return size; 29 return size;
29 } 30 }
30 31
31 void SerializeUnion_({{union.name}}* input, mojo::internal::Buffer* buf, 32 mojo::internal::ValidationError SerializeUnion_(
32 internal::{{union.name}}_Data** output, bool inlined) { 33 {{union.name}}* input,
34 mojo::internal::Buffer* buf,
35 internal::{{union.name}}_Data** output,
36 bool inlined) {
33 internal::{{union.name}}_Data* result = *output; 37 internal::{{union.name}}_Data* result = *output;
34 if (input) { 38 if (input) {
35 if (!inlined) { 39 if (!inlined) {
36 result = internal::{{union.name}}_Data::New(buf); 40 result = internal::{{union.name}}_Data::New(buf);
37 } 41 }
38 mojo::internal::UnionAccessor<{{union.name}}> input_acc(input); 42 mojo::internal::UnionAccessor<{{union.name}}> input_acc(input);
39 // TODO(azani): Handle unknown and objects. 43 // TODO(azani): Handle unknown and objects.
40 // Set the not-null flag. 44 // Set the not-null flag.
41 result->size = 16; 45 result->size = 16;
42 result->tag = input->which(); 46 result->tag = input->which();
43 switch (input->which()) { 47 switch (input->which()) {
44 {% for field in union.fields %} 48 {% for field in union.fields %}
45 case {{union.name}}::Tag::{{field.name|upper}}: { 49 case {{union.name}}::Tag::{{field.name|upper}}: {
46 {% if field.kind|is_object_kind %} 50 {% if field.kind|is_object_kind %}
47 {% if field.kind|is_string_kind %} 51 {% if field.kind|is_string_kind %}
48 SerializeString_( 52 SerializeString_(
49 *input_acc.data()->{{field.name}}, 53 *input_acc.data()->{{field.name}},
50 buf, &result->data.f_{{field.name}}.ptr); 54 buf, &result->data.f_{{field.name}}.ptr);
51 {% elif field.kind|is_struct_kind %} 55 {% elif field.kind|is_struct_kind %}
52 Serialize_( 56 {{struct_macros.call_serialize_struct(
53 input_acc.data()->{{field.name}}->get(), 57 input = "input_acc.data()->%s->get()"|format(field.name),
54 buf, &result->data.f_{{field.name}}.ptr); 58 buffer = "buf",
59 output = "&result->data.f_%s.ptr"|format(field.name),
60 should_return_errors = true)|indent(6)}}
55 {% elif field.kind|is_union_kind %} 61 {% elif field.kind|is_union_kind %}
56 SerializeUnion_( 62 {{struct_macros.call_serialize_union(
57 input_acc.data()->{{field.name}}->get(), 63 input = "input_acc.data()->%s->get()"|format(field.name),
58 buf, &result->data.f_{{field.name}}.ptr, false); 64 buffer = "buf",
65 output = "&result->data.f_%s.ptr"|format(field.name),
66 inlined = "false",
67 should_return_errors = true)|indent(6)}}
59 {% elif field.kind|is_array_kind %} 68 {% elif field.kind|is_array_kind %}
60 const mojo::internal::ArrayValidateParams {{field.name}}_validate_params ( 69 {{struct_macros.call_serialize_array(
61 {{field.kind|get_array_validate_params_ctor_args|indent(16)}}); 70 name = field.name,
62 SerializeArray_( 71 kind = field.kind,
63 input_acc.data()->{{field.name}}, 72 input = "input_acc.data()->%s"|format(field.name),
64 buf, &result->data.f_{{field.name}}.ptr, &{{field.name}}_validate_pa rams); 73 buffer = "buf",
74 output = "&result->data.f_%s.ptr"|format(field.name),
75 should_return_errors = true,
76 indent_size = 16)|indent(6)}}
65 {% elif field.kind|is_map_kind %} 77 {% elif field.kind|is_map_kind %}
66 const mojo::internal::ArrayValidateParams {{field.name}}_validate_params ( 78 {{struct_macros.call_serialize_map(
67 {{field.kind.value_kind|get_map_validate_params_ctor_args|indent(16) }}); 79 name = field.name,
68 SerializeMap_( 80 kind = field.kind,
69 input_acc.data()->{{field.name}}, 81 input = "input_acc.data()->%s"|format(field.name),
70 buf, &result->data.f_{{field.name}}.ptr, &{{field.name}}_validate_pa rams); 82 buffer = "buf",
83 output = "&result->data.f_%s.ptr"|format(field.name),
84 should_return_errors = true,
85 indent_size = 16)|indent(6)}}
71 {%- endif %} 86 {%- endif %}
72 {% elif field.kind|is_any_handle_kind %} 87 {% elif field.kind|is_any_handle_kind %}
73 result->data.f_{{field.name}} = 88 result->data.f_{{field.name}} =
74 input_acc.data()->{{field.name}}->release().value(); 89 input_acc.data()->{{field.name}}->release().value();
75 {% elif field.kind|is_interface_kind %} 90 {% elif field.kind|is_interface_kind %}
76 mojo::internal::Interface_Data* {{field.name}} = 91 mojo::internal::Interface_Data* {{field.name}} =
77 reinterpret_cast<mojo::internal::Interface_Data*>( 92 reinterpret_cast<mojo::internal::Interface_Data*>(
78 &result->data.f_{{field.name}}); 93 &result->data.f_{{field.name}});
79 mojo::internal::InterfacePointerToData( 94 mojo::internal::InterfacePointerToData(
80 input_acc.data()->{{field.name}}->Pass(), {{field.name}}); 95 input_acc.data()->{{field.name}}->Pass(), {{field.name}});
81 {% elif field.kind|is_enum_kind %} 96 {% elif field.kind|is_enum_kind %}
82 result->data.f_{{field.name}} = 97 result->data.f_{{field.name}} =
83 static_cast<int32_t>(input_acc.data()->{{field.name}}); 98 static_cast<int32_t>(input_acc.data()->{{field.name}});
84 {% else %} 99 {% else %}
85 result->data.f_{{field.name}} = input_acc.data()->{{field.name}}; 100 result->data.f_{{field.name}} = input_acc.data()->{{field.name}};
86 {%- endif %} 101 {%- endif %}
87 break; 102 break;
88 } 103 }
89 {%- endfor %} 104 {%- endfor %}
90 default: 105 default:
106 // TODO(vardhan): Should this return an error code instead?
91 MOJO_CHECK(false) << "No sane way to serialize a union with an unknown t ag."; 107 MOJO_CHECK(false) << "No sane way to serialize a union with an unknown t ag.";
92 break; 108 break;
93 } 109 }
94 } else if (inlined) { 110 } else if (inlined) {
95 result->set_null(); 111 result->set_null();
96 } else { 112 } else {
97 result = nullptr; 113 result = nullptr;
98 } 114 }
99 *output = result; 115 *output = result;
116 return mojo::internal::ValidationError::VALIDATION_ERROR_NONE;
100 } 117 }
101 118
102 void Deserialize_(internal::{{union.name}}_Data* input, 119 void Deserialize_(internal::{{union.name}}_Data* input,
103 {{union.name}}* output) { 120 {{union.name}}* output) {
104 if (input && !input->is_null()) { 121 if (input && !input->is_null()) {
105 mojo::internal::UnionAccessor<{{union.name}}> result_acc(output); 122 mojo::internal::UnionAccessor<{{union.name}}> result_acc(output);
106 switch (input->tag) { 123 switch (input->tag) {
107 {#- TODO(vardhan): There is a lot of overlap with struct_macros.deserialize() 124 {#- TODO(vardhan): There is a lot of overlap with struct_macros.deserialize()
108 here, is it possible to merge? (currently looks very hairy) #} 125 here, is it possible to merge? (currently looks very hairy) #}
109 {% for field in union.fields %} 126 {% for field in union.fields %}
(...skipping 28 matching lines...) Expand all
138 break; 155 break;
139 } 156 }
140 {%- endfor %} 157 {%- endfor %}
141 default: 158 default:
142 MOJO_LOG(WARNING) << "Deserializing {{union.name}} with unknown tag!"; 159 MOJO_LOG(WARNING) << "Deserializing {{union.name}} with unknown tag!";
143 // No way to deserialize the data when we encounter an unknown tag. 160 // No way to deserialize the data when we encounter an unknown tag.
144 break; 161 break;
145 } 162 }
146 } 163 }
147 } 164 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698