| Index: mojo/public/tools/bindings/generators/cpp_templates/union_traits_definition.tmpl
|
| diff --git a/mojo/public/tools/bindings/generators/cpp_templates/union_traits_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/union_traits_definition.tmpl
|
| index cde3f95669369fad483f82f05dd8142acc45fef1..d99550effadb273ae5ed4420952612135cfddb58 100644
|
| --- a/mojo/public/tools/bindings/generators/cpp_templates/union_traits_definition.tmpl
|
| +++ b/mojo/public/tools/bindings/generators/cpp_templates/union_traits_definition.tmpl
|
| @@ -4,38 +4,37 @@
|
| bool UnionTraits<{{mojom_type}}::DataView, {{mojom_type}}Ptr>::Read(
|
| {{mojom_type}}::DataView input,
|
| {{mojom_type}}Ptr* output) {
|
| - *output = {{mojom_type}}::New();
|
| - {{mojom_type}}Ptr& result = *output;
|
| + using UnionType = {{mojom_type}};
|
| + using Tag = UnionType::Tag;
|
|
|
| - internal::UnionAccessor<{{mojom_type}}> result_acc(result.get());
|
| switch (input.tag()) {
|
| {%- for field in union.fields %}
|
| - case {{mojom_type}}::Tag::{{field.name|upper}}: {
|
| + case Tag::{{field.name|upper}}: {
|
| {%- set name = field.name %}
|
| {%- set kind = field.kind %}
|
| {%- set serializer_type = kind|unmapped_type_for_serializer %}
|
| {%- if kind|is_object_kind %}
|
| - result_acc.SwitchActive({{mojom_type}}::Tag::{{name|upper}});
|
| - if (!input.Read{{name|under_to_camel}}(result_acc.data()->{{name}}))
|
| + auto result = UnionType::New(UnionType::{{field.name}});
|
| + if (!input.Read{{name|under_to_camel}}(&result->get_{{name}}()))
|
| return false;
|
|
|
| + *output = std::move(result);
|
| {%- elif kind|is_any_handle_kind %}
|
| - auto result_{{name}} = input.Take{{name|under_to_camel}}();
|
| - result->set_{{name}}(std::move(result_{{name}}));
|
| + *output = UnionType::New(UnionType::{{field.name}}, input.Take{{name|under_to_camel}}());
|
|
|
| {%- elif kind|is_any_interface_kind %}
|
| auto result_{{name}} =
|
| - input.Take{{name|under_to_camel}}<typename std::remove_reference<decltype(result->get_{{name}}())>::type>();
|
| - result->set_{{name}}(std::move(result_{{name}}));
|
| + input.Take{{name|under_to_camel}}<typename std::remove_reference<decltype((*output)->get_{{name}}())>::type>();
|
| + *output = UnionType::New(UnionType::{{field.name}}, std::move(result_{{name}}));
|
|
|
| {%- elif kind|is_enum_kind %}
|
| - decltype(result->get_{{name}}()) result_{{name}};
|
| + decltype((*output)->get_{{name}}()) result_{{name}};
|
| if (!input.Read{{name|under_to_camel}}(&result_{{name}}))
|
| return false;
|
| - result->set_{{name}}(result_{{name}});
|
| + *output = UnionType::New(UnionType::{{field.name}}, result_{{name}});
|
|
|
| {%- else %}
|
| - result->set_{{name}}(input.{{name}}());
|
| + *output = UnionType::New(UnionType::{{field.name}}, input.{{name}}());
|
| {%- endif %}
|
| break;
|
| }
|
|
|