| OLD | NEW |
| 1 {% import 'struct_macros.tmpl' as struct_macros without context %} | 1 {% import 'struct_macros.tmpl' as struct_macros without context %} |
| 2 size_t GetSerializedSize_(const {{union.name}}Ptr& input, bool inlined) { | 2 {# Assumes |input| is an InlinedStruct. #} |
| 3 size_t size = 0U; | 3 size_t GetSerializedSize_(const {{union.name}}Ptr& input) { |
| 4 if (!inlined) { | 4 size_t size = sizeof(internal::{{union.name}}_Data); |
| 5 size += sizeof(internal::{{union.name}}_Data); | 5 if (!input) |
| 6 } | 6 return size; |
| 7 | 7 |
| 8 if (!input) | |
| 9 return size; | |
| 10 | |
| 11 mojo::internal::UnionAccessor<{{union.name}}> input_acc(input.get()); | 8 mojo::internal::UnionAccessor<{{union.name}}> input_acc(input.get()); |
| 12 switch (input->which()) { | 9 switch (input->which()) { |
| 13 {% for field in union.fields %} | 10 {% for field in union.fields %} |
| 14 {% if field.kind|is_object_kind %} | 11 {% if field.kind|is_object_kind %} |
| 15 case {{union.name}}::Tag::{{field.name|upper}}: | 12 case {{union.name}}::Tag::{{field.name|upper}}: |
| 16 {% if field.kind|is_union_kind %} | 13 {% if field.kind|is_union_kind %} |
| 17 size += GetSerializedSize_(*(input_acc.data()->{{field.name}}), false); | 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 %} | 18 {% elif field.kind|is_struct_kind %} |
| 19 size += GetSerializedSize_(*(input_acc.data()->{{field.name}}->get())); | 19 size += GetSerializedSize_(*(input_acc.data()->{{field.name}}->get())); |
| 20 {% else %} | 20 {% else %} |
| 21 size += GetSerializedSize_(*(input_acc.data()->{{field.name}})); | 21 size += GetSerializedSize_(*(input_acc.data()->{{field.name}})); |
| 22 {% endif %} | 22 {% endif %} |
| 23 break; | 23 break; |
| 24 {%- endif %} | 24 {%- endif %} |
| 25 {%- endfor %} | 25 {%- endfor %} |
| 26 default: | 26 default: |
| 27 break; | 27 break; |
| 28 } | 28 } |
| 29 return size; | 29 return size; |
| 30 } | 30 } |
| 31 | 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 #} |
| 32 mojo::internal::ValidationError SerializeUnion_( | 40 mojo::internal::ValidationError SerializeUnion_( |
| 33 {{union.name}}* input, | 41 {{union.name}}* input, |
| 34 mojo::internal::Buffer* buf, | 42 mojo::internal::Buffer* buf, |
| 35 internal::{{union.name}}_Data** output, | 43 internal::{{union.name}}_Data** output) { |
| 36 bool inlined) { | |
| 37 internal::{{union.name}}_Data* result = *output; | 44 internal::{{union.name}}_Data* result = *output; |
| 38 if (input) { | 45 if (input) { |
| 39 if (!inlined) { | |
| 40 result = internal::{{union.name}}_Data::New(buf); | |
| 41 } | |
| 42 mojo::internal::UnionAccessor<{{union.name}}> input_acc(input); | 46 mojo::internal::UnionAccessor<{{union.name}}> input_acc(input); |
| 43 // TODO(azani): Handle unknown and objects. | 47 // TODO(azani): Handle unknown and objects. |
| 44 // Set the not-null flag. | 48 // Set the not-null flag. |
| 45 result->size = 16; | 49 result->size = 16; |
| 46 result->tag = input->which(); | 50 result->tag = input->which(); |
| 47 switch (input->which()) { | 51 switch (input->which()) { |
| 48 {% for field in union.fields %} | 52 {% for field in union.fields %} |
| 49 case {{union.name}}::Tag::{{field.name|upper}}: { | 53 case {{union.name}}::Tag::{{field.name|upper}}: { |
| 50 {% if field.kind|is_object_kind %} | 54 {% if field.kind|is_object_kind %} |
| 51 {% if field.kind|is_string_kind %} | 55 {% if field.kind|is_string_kind %} |
| 52 SerializeString_( | 56 SerializeString_( |
| 53 *input_acc.data()->{{field.name}}, | 57 *input_acc.data()->{{field.name}}, |
| 54 buf, &result->data.f_{{field.name}}.ptr); | 58 buf, &result->data.f_{{field.name}}.ptr); |
| 55 {% elif field.kind|is_struct_kind %} | 59 {% elif field.kind|is_struct_kind %} |
| 56 {{struct_macros.call_serialize_struct( | 60 {{struct_macros.call_serialize_struct( |
| 57 input = "input_acc.data()->%s->get()"|format(field.name), | 61 input = "input_acc.data()->%s->get()"|format(field.name), |
| 58 buffer = "buf", | 62 buffer = "buf", |
| 59 output = "&result->data.f_%s.ptr"|format(field.name), | 63 output = "&result->data.f_%s.ptr"|format(field.name), |
| 60 should_return_errors = true)|indent(6)}} | 64 should_return_errors = true)|indent(6)}} |
| 61 {% elif field.kind|is_union_kind %} | 65 {% elif field.kind|is_union_kind %} |
| 62 {{struct_macros.call_serialize_union( | 66 // Point *output to newly allocated memory |
| 63 input = "input_acc.data()->%s->get()"|format(field.name), | 67 // SerializeUnion_ into newly allocated memory. |
| 64 buffer = "buf", | 68 if (!{{"input_acc.data()->%s->get()"|format(field.name)}}) { |
| 65 output = "&result->data.f_%s.ptr"|format(field.name), | 69 {{"result->data.f_%s.ptr"|format(field.name)}} = nullptr; |
| 66 inlined = "false", | 70 } else { |
| 67 should_return_errors = true)|indent(6)}} | 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 } |
| 68 {% elif field.kind|is_array_kind %} | 79 {% elif field.kind|is_array_kind %} |
| 69 {{struct_macros.call_serialize_array( | 80 {{struct_macros.call_serialize_array( |
| 70 name = field.name, | 81 name = field.name, |
| 71 kind = field.kind, | 82 kind = field.kind, |
| 72 input = "input_acc.data()->%s"|format(field.name), | 83 input = "input_acc.data()->%s"|format(field.name), |
| 73 buffer = "buf", | 84 buffer = "buf", |
| 74 output = "&result->data.f_%s.ptr"|format(field.name), | 85 output = "&result->data.f_%s.ptr"|format(field.name), |
| 75 should_return_errors = true, | 86 should_return_errors = true, |
| 76 indent_size = 16)|indent(6)}} | 87 indent_size = 16)|indent(6)}} |
| 77 {% elif field.kind|is_map_kind %} | 88 {% elif field.kind|is_map_kind %} |
| (...skipping 22 matching lines...) Expand all Loading... |
| 100 result->data.f_{{field.name}} = input_acc.data()->{{field.name}}; | 111 result->data.f_{{field.name}} = input_acc.data()->{{field.name}}; |
| 101 {%- endif %} | 112 {%- endif %} |
| 102 break; | 113 break; |
| 103 } | 114 } |
| 104 {%- endfor %} | 115 {%- endfor %} |
| 105 default: | 116 default: |
| 106 // TODO(vardhan): Should this return an error code instead? | 117 // TODO(vardhan): Should this return an error code instead? |
| 107 MOJO_CHECK(false) << "No sane way to serialize a union with an unknown t
ag."; | 118 MOJO_CHECK(false) << "No sane way to serialize a union with an unknown t
ag."; |
| 108 break; | 119 break; |
| 109 } | 120 } |
| 110 } else if (inlined) { | 121 } else { |
| 111 result->set_null(); | 122 result->set_null(); |
| 112 } else { | |
| 113 result = nullptr; | |
| 114 } | 123 } |
| 115 *output = result; | |
| 116 return mojo::internal::ValidationError::NONE; | 124 return mojo::internal::ValidationError::NONE; |
| 117 } | 125 } |
| 118 | 126 |
| 119 void Deserialize_(internal::{{union.name}}_Data* input, | 127 void Deserialize_(internal::{{union.name}}_Data* input, |
| 120 {{union.name}}* output) { | 128 {{union.name}}* output) { |
| 121 if (input && !input->is_null()) { | 129 if (input && !input->is_null()) { |
| 122 mojo::internal::UnionAccessor<{{union.name}}> result_acc(output); | 130 mojo::internal::UnionAccessor<{{union.name}}> result_acc(output); |
| 123 switch (input->tag) { | 131 switch (input->tag) { |
| 124 {#- TODO(vardhan): There is a lot of overlap with struct_macros.deserialize() | 132 {#- TODO(vardhan): There is a lot of overlap with struct_macros.deserialize() |
| 125 here, is it possible to merge? (currently looks very hairy) #} | 133 here, is it possible to merge? (currently looks very hairy) #} |
| (...skipping 29 matching lines...) Expand all Loading... |
| 155 break; | 163 break; |
| 156 } | 164 } |
| 157 {%- endfor %} | 165 {%- endfor %} |
| 158 default: | 166 default: |
| 159 MOJO_LOG(WARNING) << "Deserializing {{union.name}} with unknown tag!"; | 167 MOJO_LOG(WARNING) << "Deserializing {{union.name}} with unknown tag!"; |
| 160 // No way to deserialize the data when we encounter an unknown tag. | 168 // No way to deserialize the data when we encounter an unknown tag. |
| 161 break; | 169 break; |
| 162 } | 170 } |
| 163 } | 171 } |
| 164 } | 172 } |
| OLD | NEW |