| OLD | NEW |
| 1 {%- set class_name = struct.name ~ "_Data" %} | 1 {%- set class_name = struct.name ~ "_Data" %} |
| 2 | 2 |
| 3 {#- TODO(yzshen): Consider eliminating _validate_object() and | |
| 4 _validate_handle(). #} | |
| 5 | |
| 6 {#- Validates the specified struct field, which is supposed to be an object | 3 {#- Validates the specified struct field, which is supposed to be an object |
| 7 (struct/array/string/map/union). | 4 (struct/array/string/map/union). |
| 8 This macro is expanded by the Validate() method. #} | 5 This macro is expanded by the Validate() method. #} |
| 9 {%- macro _validate_object(struct, packed_field) %} | 6 {%- macro _validate_object(struct, packed_field) %} |
| 10 {%- set name = packed_field.field.name %} | 7 {%- set name = packed_field.field.name %} |
| 11 {%- set kind = packed_field.field.kind %} | 8 {%- set kind = packed_field.field.kind %} |
| 12 {%- set wrapper_type = kind|cpp_wrapper_type %} | |
| 13 {%- if not kind|is_nullable_kind %} | 9 {%- if not kind|is_nullable_kind %} |
| 14 {%- if kind|is_union_kind %} | 10 {%- if kind|is_union_kind %} |
| 15 if (object->{{name}}.is_null()) { | 11 if (!mojo::internal::ValidateInlinedUnionNonNullable( |
| 16 {%- else %} | 12 object->{{name}}, "null {{name}} field in {{struct.name}} struct")) { |
| 17 if (!object->{{name}}.offset) { | |
| 18 {%- endif %} | |
| 19 ReportValidationError( | |
| 20 mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER, | |
| 21 "null {{name}} field in {{struct.name}} struct"); | |
| 22 return false; | 13 return false; |
| 23 } | 14 } |
| 24 {%- endif %} | 15 {%- else %} |
| 25 {%- if not kind|is_union_kind %} | 16 if (!mojo::internal::ValidatePointerNonNullable( |
| 26 if (!mojo::internal::ValidateEncodedPointer(&object->{{name}}.offset)) { | 17 object->{{name}}, "null {{name}} field in {{struct.name}} struct")) { |
| 27 ReportValidationError(mojo::internal::VALIDATION_ERROR_ILLEGAL_POINTER); | |
| 28 return false; | 18 return false; |
| 29 } | 19 } |
| 20 {%- endif %} |
| 30 {%- endif %} | 21 {%- endif %} |
| 31 {%- if kind|is_array_kind or kind|is_string_kind %} | 22 {%- if kind|is_array_kind or kind|is_string_kind %} |
| 32 const mojo::internal::ArrayValidateParams {{name}}_validate_params( | 23 const mojo::internal::ArrayValidateParams {{name}}_validate_params( |
| 33 {{kind|get_array_validate_params_ctor_args|indent(6)}}); | 24 {{kind|get_array_validate_params_ctor_args|indent(6)}}); |
| 34 if (!{{wrapper_type}}::Data_::Validate( | 25 if (!mojo::internal::ValidateArray(object->{{name}}, bounds_checker, |
| 35 mojo::internal::DecodePointerRaw(&object->{{name}}.offset), | 26 &{{name}}_validate_params)) { |
| 36 bounds_checker, &{{name}}_validate_params)) { | 27 return false; |
| 28 } |
| 37 {%- elif kind|is_map_kind %} | 29 {%- elif kind|is_map_kind %} |
| 38 const mojo::internal::ArrayValidateParams {{name}}_validate_params( | 30 const mojo::internal::ArrayValidateParams {{name}}_validate_params( |
| 39 {{kind.value_kind|get_map_validate_params_ctor_args|indent(6)}}); | 31 {{kind.value_kind|get_map_validate_params_ctor_args|indent(6)}}); |
| 40 if (!{{wrapper_type}}::Data_::Validate( | 32 if (!mojo::internal::ValidateMap(object->{{name}}, bounds_checker, |
| 41 mojo::internal::DecodePointerRaw(&object->{{name}}.offset), | 33 &{{name}}_validate_params)) { |
| 42 bounds_checker, &{{name}}_validate_params)) { | |
| 43 {%- elif kind|is_struct_kind %} | |
| 44 if (!{{kind|get_name_for_kind}}::Data_::Validate( | |
| 45 mojo::internal::DecodePointerRaw(&object->{{name}}.offset), | |
| 46 bounds_checker)) { | |
| 47 {%- elif kind|is_union_kind %} | |
| 48 if (!{{kind|get_name_for_kind}}::Data_::Validate( | |
| 49 &object->{{name}}, bounds_checker, true)) { | |
| 50 {%- else %} | |
| 51 if (!{{wrapper_type}}::Data_::Validate( | |
| 52 mojo::internal::DecodePointerRaw(&object->{{name}}.offset), | |
| 53 bounds_checker)) { | |
| 54 {%- endif %} | |
| 55 return false; | 34 return false; |
| 56 } | 35 } |
| 36 {%- elif kind|is_struct_kind %} |
| 37 if (!mojo::internal::ValidateStruct(object->{{name}}, bounds_checker)) |
| 38 return false; |
| 39 {%- elif kind|is_union_kind %} |
| 40 if (!mojo::internal::ValidateInlinedUnion(object->{{name}}, bounds_checker)) { |
| 41 return false; |
| 42 } |
| 43 {%- else %} |
| 44 #error Not reached! |
| 45 {%- endif %} |
| 57 {%- endmacro %} | 46 {%- endmacro %} |
| 58 | 47 |
| 59 {#- Validates the specified struct field, which is supposed to be a handle or | 48 {#- Validates the specified struct field, which is supposed to be a handle or |
| 60 contain a handle (in the case of interfaces). | 49 contain a handle (in the case of interfaces). |
| 61 This macro is expanded by the Validate() method. #} | 50 This macro is expanded by the Validate() method. #} |
| 62 {%- macro _validate_handle(struct, packed_field) %} | 51 {%- macro _validate_handle(struct, packed_field) %} |
| 63 {%- set name = packed_field.field.name %} | 52 {%- set name = packed_field.field.name %} |
| 64 {%- set kind = packed_field.field.kind %} | 53 {%- set kind = packed_field.field.kind %} |
| 65 {%- if kind|is_interface_kind %} | 54 {%- if kind|is_interface_kind %} |
| 66 const mojo::Handle {{name}}_handle = object->{{name}}.handle; | 55 const mojo::Handle {{name}}_handle = object->{{name}}.handle; |
| 67 {%- else %} | 56 {%- else %} |
| 68 const mojo::Handle {{name}}_handle = object->{{name}}; | 57 const mojo::Handle {{name}}_handle = object->{{name}}; |
| 69 {%- endif %} | 58 {%- endif %} |
| 70 {%- if not kind|is_nullable_kind %} | 59 {%- if not kind|is_nullable_kind %} |
| 71 if ({{name}}_handle.value() == mojo::internal::kEncodedInvalidHandleValue) { | 60 if (!mojo::internal::ValidateHandleNonNullable( |
| 72 ReportValidationError( | 61 {{name}}_handle, |
| 73 mojo::internal::VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE, | 62 "invalid {{name}} field in {{struct.name}} struct")) { |
| 74 "invalid {{name}} field in {{struct.name}} struct"); | |
| 75 return false; | 63 return false; |
| 76 } | 64 } |
| 77 {%- endif %} | 65 {%- endif %} |
| 78 if (!bounds_checker->ClaimHandle({{name}}_handle)) { | 66 if (!mojo::internal::ValidateHandle({{name}}_handle, bounds_checker)) |
| 79 ReportValidationError(mojo::internal::VALIDATION_ERROR_ILLEGAL_HANDLE); | |
| 80 return false; | 67 return false; |
| 81 } | |
| 82 {%- endmacro %} | 68 {%- endmacro %} |
| 83 | 69 |
| 84 {#- Validates the specified struct field, which is supposed to be an associated | 70 {#- Validates the specified struct field, which is supposed to be an associated |
| 85 interface or an associated interface request. | 71 interface or an associated interface request. |
| 86 This macro is expanded by the Validate() method. #} | 72 This macro is expanded by the Validate() method. #} |
| 87 {%- macro _validate_associated(struct, packed_field) %} | 73 {%- macro _validate_associated(struct, packed_field) %} |
| 88 // TODO(yzshen): add validation for associated kinds. | 74 {%- set name = packed_field.field.name %} |
| 75 {%- set kind = packed_field.field.kind %} |
| 76 {%- if kind|is_associated_interface_kind %} |
| 77 const mojo::internal::InterfaceId {{name}}_interface_id = |
| 78 object->{{name}}.interface_id; |
| 79 {%- else %} |
| 80 const mojo::internal::InterfaceId {{name}}_interface_id = object->{{name}}; |
| 81 {%- endif %} |
| 82 {%- if not kind|is_nullable_kind %} |
| 83 if (!mojo::internal::ValidateInterfaceIdNonNullable( |
| 84 {{name}}_interface_id, |
| 85 "invalid {{name}} field in {{struct.name}} struct")) { |
| 86 return false; |
| 87 } |
| 88 {%- endif %} |
| 89 if (!mojo::internal::ValidateAssociatedInterfaceId({{name}}_interface_id)) |
| 90 return false; |
| 89 {%- endmacro %} | 91 {%- endmacro %} |
| 90 | 92 |
| 91 // static | 93 // static |
| 92 {{class_name}}* {{class_name}}::New(mojo::internal::Buffer* buf) { | 94 {{class_name}}* {{class_name}}::New(mojo::internal::Buffer* buf) { |
| 93 return new (buf->Allocate(sizeof({{class_name}}))) {{class_name}}(); | 95 return new (buf->Allocate(sizeof({{class_name}}))) {{class_name}}(); |
| 94 } | 96 } |
| 95 | 97 |
| 96 // static | 98 // static |
| 97 bool {{class_name}}::Validate(const void* data, | 99 bool {{class_name}}::Validate(const void* data, |
| 98 mojo::internal::BoundsChecker* bounds_checker) { | 100 mojo::internal::BoundsChecker* bounds_checker) { |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 202 mojo::internal::DecodeHandle(&{{name}}, handles); | 204 mojo::internal::DecodeHandle(&{{name}}, handles); |
| 203 {%- endif %} | 205 {%- endif %} |
| 204 {%- endif %} | 206 {%- endif %} |
| 205 {%- endfor %} | 207 {%- endfor %} |
| 206 } | 208 } |
| 207 | 209 |
| 208 {{class_name}}::{{class_name}}() { | 210 {{class_name}}::{{class_name}}() { |
| 209 header_.num_bytes = sizeof(*this); | 211 header_.num_bytes = sizeof(*this); |
| 210 header_.version = {{struct.versions[-1].version}}; | 212 header_.version = {{struct.versions[-1].version}}; |
| 211 } | 213 } |
| OLD | NEW |