| OLD | NEW |
| 1 {%- import "validation_macros.tmpl" as validation_macros %} | 1 {%- import "validation_macros.tmpl" as validation_macros %} |
| 2 {%- set class_name = struct.name ~ "_Data" %} | 2 {%- set class_name = struct.name ~ "_Data" %} |
| 3 | 3 |
| 4 // static | 4 // static |
| 5 {{class_name}}* {{class_name}}::New(mojo::internal::Buffer* buf) { | 5 {{class_name}}* {{class_name}}::New(mojo::internal::Buffer* buf) { |
| 6 return new (buf->Allocate(sizeof({{class_name}}))) {{class_name}}(); | 6 return new (buf->Allocate(sizeof({{class_name}}))) {{class_name}}(); |
| 7 } | 7 } |
| 8 | 8 |
| 9 // static | 9 // static |
| 10 bool {{class_name}}::Validate(const void* data, | 10 bool {{class_name}}::Validate( |
| 11 mojo::internal::BoundsChecker* bounds_checker) { | 11 const void* data, |
| 12 mojo::internal::ValidationContext* validation_context) { |
| 12 if (!data) | 13 if (!data) |
| 13 return true; | 14 return true; |
| 14 | 15 |
| 15 if (!ValidateStructHeaderAndClaimMemory(data, bounds_checker)) | 16 if (!ValidateStructHeaderAndClaimMemory(data, validation_context)) |
| 16 return false; | 17 return false; |
| 17 | 18 |
| 18 // NOTE: The memory backing |object| may be smaller than |sizeof(*object)| if | 19 // NOTE: The memory backing |object| may be smaller than |sizeof(*object)| if |
| 19 // the message comes from an older version. | 20 // the message comes from an older version. |
| 20 const {{class_name}}* object = static_cast<const {{class_name}}*>(data); | 21 const {{class_name}}* object = static_cast<const {{class_name}}*>(data); |
| 21 | 22 |
| 22 static const struct { | 23 static const struct { |
| 23 uint32_t version; | 24 uint32_t version; |
| 24 uint32_t num_bytes; | 25 uint32_t num_bytes; |
| 25 } kVersionSizes[] = { | 26 } kVersionSizes[] = { |
| 26 {%- for version in struct.versions -%} | 27 {%- for version in struct.versions -%} |
| 27 { {{version.version}}, {{version.num_bytes}} }{% if not loop.last %}, {% end
if -%} | 28 { {{version.version}}, {{version.num_bytes}} }{% if not loop.last %}, {% end
if -%} |
| 28 {%- endfor -%} | 29 {%- endfor -%} |
| 29 }; | 30 }; |
| 30 | 31 |
| 31 if (object->header_.version <= | 32 if (object->header_.version <= |
| 32 kVersionSizes[arraysize(kVersionSizes) - 1].version) { | 33 kVersionSizes[arraysize(kVersionSizes) - 1].version) { |
| 33 // Scan in reverse order to optimize for more recent versions. | 34 // Scan in reverse order to optimize for more recent versions. |
| 34 for (int i = arraysize(kVersionSizes) - 1; i >= 0; --i) { | 35 for (int i = arraysize(kVersionSizes) - 1; i >= 0; --i) { |
| 35 if (object->header_.version >= kVersionSizes[i].version) { | 36 if (object->header_.version >= kVersionSizes[i].version) { |
| 36 if (object->header_.num_bytes == kVersionSizes[i].num_bytes) | 37 if (object->header_.num_bytes == kVersionSizes[i].num_bytes) |
| 37 break; | 38 break; |
| 38 | 39 |
| 39 ReportValidationError( | 40 ReportValidationError( |
| 41 validation_context, |
| 40 mojo::internal::VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER); | 42 mojo::internal::VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER); |
| 41 return false; | 43 return false; |
| 42 } | 44 } |
| 43 } | 45 } |
| 44 } else if (object->header_.num_bytes < | 46 } else if (object->header_.num_bytes < |
| 45 kVersionSizes[arraysize(kVersionSizes) - 1].num_bytes) { | 47 kVersionSizes[arraysize(kVersionSizes) - 1].num_bytes) { |
| 46 ReportValidationError( | 48 ReportValidationError( |
| 49 validation_context, |
| 47 mojo::internal::VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER); | 50 mojo::internal::VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER); |
| 48 return false; | 51 return false; |
| 49 } | 52 } |
| 50 | 53 |
| 51 {#- Before validating fields introduced at a certain version, we need to add | 54 {#- Before validating fields introduced at a certain version, we need to add |
| 52 a version check, which makes sure we skip further validation if |object| | 55 a version check, which makes sure we skip further validation if |object| |
| 53 is from an earlier version. |last_checked_version| records the last | 56 is from an earlier version. |last_checked_version| records the last |
| 54 version that we have added such version check. #} | 57 version that we have added such version check. #} |
| 55 {%- set last_checked_version = 0 %} | 58 {%- set last_checked_version = 0 %} |
| 56 {%- for packed_field in struct.packed.packed_fields_in_ordinal_order %} | 59 {%- for packed_field in struct.packed.packed_fields_in_ordinal_order %} |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 mojo::internal::Decode(&this->{{name}}); | 108 mojo::internal::Decode(&this->{{name}}); |
| 106 {%- endif %} | 109 {%- endif %} |
| 107 {%- endif %} | 110 {%- endif %} |
| 108 {%- endfor %} | 111 {%- endfor %} |
| 109 } | 112 } |
| 110 | 113 |
| 111 {{class_name}}::{{class_name}}() { | 114 {{class_name}}::{{class_name}}() { |
| 112 header_.num_bytes = sizeof(*this); | 115 header_.num_bytes = sizeof(*this); |
| 113 header_.version = {{struct.versions[-1].version}}; | 116 header_.version = {{struct.versions[-1].version}}; |
| 114 } | 117 } |
| OLD | NEW |