Index: mojo/public/tools/bindings/generators/cpp_templates/union_definition.tmpl |
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/union_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/union_definition.tmpl |
index f151a4e245cbb72298def31c840e05b6d9e05e44..af5ea9f8a8340512fdcd0784905ebf30b7077573 100644 |
--- a/mojo/public/tools/bindings/generators/cpp_templates/union_definition.tmpl |
+++ b/mojo/public/tools/bindings/generators/cpp_templates/union_definition.tmpl |
@@ -7,15 +7,27 @@ bool {{class_name}}::Validate( |
const void* data, |
mojo::internal::ValidationContext* validation_context, |
bool inlined) { |
- if (!data) |
+ if (!data) { |
+ DCHECK(!inlined); |
return true; |
+ } |
+ |
+ // If it is inlined, the alignment is already enforced by its enclosing |
+ // object. We don't have to validate that. |
+ DCHECK(!inlined || mojo::internal::IsAligned(data)); |
- if (!ValidateUnionHeaderAndClaimMemory(data, inlined, validation_context)) |
+ if (!inlined && |
+ !mojo::internal::ValidateNonInlinedUnionHeaderAndClaimMemory( |
+ data, validation_context)) { |
return false; |
+ } |
const {{class_name}}* object = static_cast<const {{class_name}}*>(data); |
ALLOW_UNUSED_LOCAL(object); |
+ if (inlined && object->is_null()) |
+ return true; |
+ |
switch (object->tag) { |
{% for field in union.fields %} |
case {{enum_name}}::{{field.name|upper}}: { |