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; |
} |