Index: mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl |
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl |
index 03911b9b39b47e10ae9386c56624cb41e2c08d09..e8a625bc8e9fb94167dde3923aa25289eeb91905 100644 |
--- a/mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl |
+++ b/mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl |
@@ -14,7 +14,11 @@ |
{%- macro get_serialized_size(struct, input_field_pattern) -%} |
size_t size = sizeof(internal::{{struct.name}}_Data); |
{%- for pf in struct.packed.packed_fields_in_ordinal_order if pf.field.kind|is_object_kind %} |
+{%- if pf.field.kind|is_union_kind %} |
+ size += GetSerializedSize_({{input_field_pattern|format(pf.field.name)}}, true); |
+{%- else %} |
size += GetSerializedSize_({{input_field_pattern|format(pf.field.name)}}); |
+{%- endif %} |
{%- endfor %} |
{%- endmacro -%} |
@@ -46,12 +50,19 @@ |
{%- elif kind|is_map_kind %} |
mojo::SerializeMap_<{{kind.value_kind|get_map_validate_params|indent(24)}}>( |
mojo::internal::Forward({{input_field}}), {{buffer}}, &{{output}}->{{name}}.ptr); |
+{%- elif kind|is_union_kind %} |
+ internal::{{kind.name}}_Data* {{name}}_ptr = &{{output}}->{{name}}; |
+ SerializeUnion_(mojo::internal::Forward({{input_field}}), {{buffer}}, &{{name}}_ptr, true); |
{%- else %} |
Serialize_(mojo::internal::Forward({{input_field}}), {{buffer}}, &{{output}}->{{name}}.ptr); |
{%- endif %} |
{%- if not kind|is_nullable_kind %} |
MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING( |
+{%- if kind|is_union_kind %} |
+ {{output}}->{{name}}.is_null(), |
+{%- else %} |
!{{output}}->{{name}}.ptr, |
+{%- endif %} |
mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER, |
"null {{name}} in {{struct_display_name}}"); |
{%- endif %} |
@@ -103,7 +114,11 @@ |
break; |
{%- endif %} |
{%- if kind|is_object_kind %} |
+{%- if kind|is_union_kind %} |
+ Deserialize_(&{{input}}->{{name}}, &{{output_field}}); |
+{%- else %} |
Deserialize_({{input}}->{{name}}.ptr, &{{output_field}}); |
+{%- endif %} |
{%- elif kind|is_interface_kind or kind|is_interface_request_kind %} |
{{output_field}}.Bind(mojo::MakeScopedHandle(mojo::internal::FetchAndReset(&{{input}}->{{name}}))); |
{%- elif kind|is_any_handle_kind %} |