Chromium Code Reviews| Index: mojo/public/tools/bindings/generators/cpp_templates/struct_definition.tmpl |
| diff --git a/mojo/public/tools/bindings/generators/cpp_templates/struct_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/struct_definition.tmpl |
| index 79a0bc4bb9cf77be61b02ca38bd2b6f98cdef642..f67cc89c96007106babbb42d2efcbab77ed1d837 100644 |
| --- a/mojo/public/tools/bindings/generators/cpp_templates/struct_definition.tmpl |
| +++ b/mojo/public/tools/bindings/generators/cpp_templates/struct_definition.tmpl |
| @@ -11,17 +11,23 @@ |
| {%- set kind = packed_field.field.kind %} |
| {%- set wrapper_type = kind|cpp_wrapper_type %} |
| {%- if not kind|is_nullable_kind %} |
| +{%- if kind|is_union_kind %} |
| + if (object->{{name}}.is_null()) { |
| +{%- else %} |
| if (!object->{{name}}.offset) { |
| +{%- endif %} |
| ReportValidationError( |
| mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER, |
| "null {{name}} field in {{struct.name}} struct"); |
| return false; |
| } |
| {%- endif %} |
| +{%- if not kind|is_union_kind %} |
| if (!mojo::internal::ValidateEncodedPointer(&object->{{name}}.offset)) { |
| ReportValidationError(mojo::internal::VALIDATION_ERROR_ILLEGAL_POINTER); |
| return false; |
| } |
| +{%- endif %} |
| {%- if kind|is_array_kind or kind|is_string_kind %} |
| if (!{{wrapper_type}}::Data_::Validate< |
| {{kind|get_array_validate_params|indent(10)}}>( |
| @@ -36,6 +42,9 @@ |
| if (!{{kind|get_name_for_kind}}::Data_::Validate( |
| mojo::internal::DecodePointerRaw(&object->{{name}}.offset), |
| bounds_checker)) { |
| +{%- elif kind|is_union_kind %} |
| + if (!{{kind|get_name_for_kind}}::Data_::Validate( |
| + &object->{{name}}, bounds_checker, true)) { |
|
yzshen1
2015/03/26 07:30:14
wrong indent?
azani
2015/03/26 22:27:39
Done.
|
| {%- else %} |
| if (!{{wrapper_type}}::Data_::Validate( |
| mojo::internal::DecodePointerRaw(&object->{{name}}.offset), |
| @@ -139,7 +148,7 @@ void {{class_name}}::EncodePointersAndHandles( |
| std::vector<mojo::Handle>* handles) { |
| MOJO_CHECK(header_.version == {{struct.versions[-1].version}}); |
| {%- for pf in struct.packed.packed_fields_in_ordinal_order %} |
| -{%- if pf.field.kind|is_object_kind %} |
| +{%- if pf.field.kind|is_object_kind and not pf.field.kind|is_union_kind %} |
| mojo::internal::Encode(&{{pf.field.name}}, handles); |
| {%- elif pf.field.kind|is_any_handle_kind %} |
| mojo::internal::EncodeHandle(&{{pf.field.name}}, handles); |
| @@ -165,7 +174,8 @@ void {{class_name}}::DecodePointersAndHandles( |
| if (header_.version < {{pf.min_version}}) |
| return; |
| {%- endif %} |
| -{%- if kind|is_object_kind %} |
| +{%- if kind|is_union_kind %} |
|
yzshen1
2015/03/26 07:30:14
this if-elif seems weird. you could do something s
azani
2015/03/26 22:27:39
Won't work because then it falls to the "else" cla
|
| +{%- elif kind|is_object_kind %} |
| mojo::internal::Decode(&{{name}}, handles); |
| {%- else %} |
| mojo::internal::DecodeHandle(&{{name}}, handles); |