| OLD | NEW |
| 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 |
| OLD | NEW |