| OLD | NEW |
| 1 {%- macro validate_field(struct, name, kind) %} |
| 2 {%- if kind|is_map_kind %} |
| 3 {%- set name_keys = name + "_keys" %} |
| 4 {%- set name_values = name + "_values" %} |
| 5 {{ validate_field(struct, name_keys, kind.key_kind) }} |
| 6 {{ validate_field(struct, name_values, kind.value_kind) }} |
| 7 {%- elif kind|is_object_kind %} |
| 8 {%- set wrapper_type = kind|cpp_wrapper_type %} |
| 9 {%- if not kind|is_nullable_kind %} |
| 10 if (!object->{{name}}.offset) { |
| 11 ReportValidationError( |
| 12 mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER, |
| 13 "null {{name}} field in {{struct.name}} struct"); |
| 14 return false; |
| 15 } |
| 16 {%- endif %} |
| 17 if (!mojo::internal::ValidateEncodedPointer(&object->{{name}}.offset)) { |
| 18 ReportValidationError(mojo::internal::VALIDATION_ERROR_ILLEGAL_POINTER); |
| 19 return false; |
| 20 } |
| 21 {%- if kind|is_any_array_kind or kind|is_string_kind %} |
| 22 if (!{{wrapper_type}}::Data_::Validate< |
| 23 {{kind|get_array_validate_params|indent(10)}}>( |
| 24 mojo::internal::DecodePointerRaw(&object->{{name}}.offset), |
| 25 bounds_checker)) { |
| 26 {%- else %} |
| 27 if (!{{wrapper_type}}::Data_::Validate( |
| 28 mojo::internal::DecodePointerRaw(&object->{{name}}.offset), |
| 29 bounds_checker)) { |
| 30 {%- endif %} |
| 31 return false; |
| 32 } |
| 33 {%- elif kind|is_any_handle_kind %} |
| 34 {%- if not kind|is_nullable_kind %} |
| 35 if (object->{{name}}.value() == mojo::internal::kEncodedInvalidHandleValue) { |
| 36 ReportValidationError( |
| 37 mojo::internal::VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE, |
| 38 "invalid {{name}} field in {{struct.name}} struct"); |
| 39 return false; |
| 40 } |
| 41 {%- endif %} |
| 42 if (!bounds_checker->ClaimHandle(object->{{name}})) { |
| 43 ReportValidationError(mojo::internal::VALIDATION_ERROR_ILLEGAL_HANDLE); |
| 44 return false; |
| 45 } |
| 46 {%- endif %} |
| 47 {%- endmacro -%} |
| 48 |
| 49 |
| 1 {%- macro validate(struct, class_name) %} | 50 {%- macro validate(struct, class_name) %} |
| 2 if (!data) | 51 if (!data) |
| 3 return true; | 52 return true; |
| 4 | 53 |
| 5 if (!ValidateStructHeader( | 54 if (!ValidateStructHeader( |
| 6 data, sizeof({{class_name}}), | 55 data, sizeof({{class_name}}), |
| 7 {{struct.packed.packed_fields|length}}, bounds_checker)) { | 56 {{struct.packed.packed_fields|length}}, bounds_checker)) { |
| 8 return false; | 57 return false; |
| 9 } | 58 } |
| 10 | 59 |
| 11 const {{class_name}}* MOJO_ALLOW_UNUSED object = | 60 const {{class_name}}* MOJO_ALLOW_UNUSED object = |
| 12 static_cast<const {{class_name}}*>(data); | 61 static_cast<const {{class_name}}*>(data); |
| 13 | 62 |
| 14 {%- for packed_field in struct.packed.packed_fields %} | 63 {%- for packed_field in struct.packed.packed_fields %} |
| 15 {%- set name = packed_field.field.name %} | 64 {%- set name = packed_field.field.name %} |
| 16 {%- set kind = packed_field.field.kind %} | 65 {%- set kind = packed_field.field.kind %} |
| 17 {%- if kind|is_object_kind %} | 66 {{ validate_field(struct, name, kind) }} |
| 18 {%- set wrapper_type = kind|cpp_wrapper_type %} | |
| 19 {%- if not kind|is_nullable_kind %} | |
| 20 if (!object->{{name}}.offset) { | |
| 21 ReportValidationError( | |
| 22 mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER, | |
| 23 "null {{name}} field in {{struct.name}} struct"); | |
| 24 return false; | |
| 25 } | |
| 26 {%- endif %} | |
| 27 if (!mojo::internal::ValidateEncodedPointer(&object->{{name}}.offset)) { | |
| 28 ReportValidationError(mojo::internal::VALIDATION_ERROR_ILLEGAL_POINTER); | |
| 29 return false; | |
| 30 } | |
| 31 {%- if kind|is_any_array_kind or kind|is_string_kind %} | |
| 32 if (!{{wrapper_type}}::Data_::Validate< | |
| 33 {{kind|get_array_validate_params|indent(10)}}>( | |
| 34 mojo::internal::DecodePointerRaw(&object->{{name}}.offset), | |
| 35 bounds_checker)) { | |
| 36 {%- else %} | |
| 37 if (!{{wrapper_type}}::Data_::Validate( | |
| 38 mojo::internal::DecodePointerRaw(&object->{{name}}.offset), | |
| 39 bounds_checker)) { | |
| 40 {%- endif %} | |
| 41 return false; | |
| 42 } | |
| 43 {%- elif kind|is_any_handle_kind %} | |
| 44 {%- if not kind|is_nullable_kind %} | |
| 45 if (object->{{name}}.value() == mojo::internal::kEncodedInvalidHandleValue) { | |
| 46 ReportValidationError( | |
| 47 mojo::internal::VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE, | |
| 48 "invalid {{name}} field in {{struct.name}} struct"); | |
| 49 return false; | |
| 50 } | |
| 51 {%- endif %} | |
| 52 if (!bounds_checker->ClaimHandle(object->{{name}})) { | |
| 53 ReportValidationError(mojo::internal::VALIDATION_ERROR_ILLEGAL_HANDLE); | |
| 54 return false; | |
| 55 } | |
| 56 {%- endif %} | |
| 57 {%- endfor %} | 67 {%- endfor %} |
| 58 | 68 |
| 59 return true; | 69 return true; |
| 60 {%- endmacro %} | 70 {%- endmacro %} |
| 61 | 71 |
| 62 {%- macro field_line(field) %} | 72 {%- macro field_line(field) %} |
| 63 {%- set type = field.kind|cpp_field_type %} | |
| 64 {%- set name = field.name -%} | 73 {%- set name = field.name -%} |
| 65 {%- if field.kind.spec == 'b' -%} | 74 {%- if field.kind.spec == 'b' -%} |
| 66 uint8_t {{name}} : 1; | 75 uint8_t {{name}} : 1; |
| 67 {%- elif field.kind|is_enum_kind -%} | 76 {%- elif field.kind|is_enum_kind -%} |
| 68 int32_t {{name}}; | 77 int32_t {{name}}; |
| 78 {%- elif field.kind|is_map_kind -%} |
| 79 mojo::internal::ArrayPointer<{{field.kind.key_kind|cpp_type}}> {{name}}_keys; |
| 80 mojo::internal::ArrayPointer<{{field.kind.value_kind|cpp_type}}> {{name}}_valu
es; |
| 69 {%- else -%} | 81 {%- else -%} |
| 70 {{type}} {{name}}; | 82 {{field.kind|cpp_field_type}} {{name}}; |
| 71 {%- endif %} | 83 {%- endif %} |
| 72 {%- endmacro %} | 84 {%- endmacro %} |
| 73 | 85 |
| 74 {%- macro fields(struct) %} | 86 {%- macro fields(struct) %} |
| 75 {%- for packed_field in struct.packed.packed_fields %} | 87 {%- for packed_field in struct.packed.packed_fields %} |
| 76 {{field_line(packed_field.field)}} | 88 {{field_line(packed_field.field)}} |
| 77 {%- if not loop.last %} | 89 {%- if not loop.last %} |
| 78 {%- set next_pf = struct.packed.packed_fields[loop.index0 + 1] %} | 90 {%- set next_pf = struct.packed.packed_fields[loop.index0 + 1] %} |
| 79 {%- set pad = next_pf.offset - (packed_field.offset + packed_field.size) %
} | 91 {%- set pad = next_pf.offset - (packed_field.offset + packed_field.size) %
} |
| 80 {%- if pad > 0 %} | 92 {%- if pad > 0 %} |
| 81 uint8_t pad{{loop.index0}}_[{{pad}}]; | 93 uint8_t pad{{loop.index0}}_[{{pad}}]; |
| 82 {%- endif %} | 94 {%- endif %} |
| 83 {%- endif %} | 95 {%- endif %} |
| 84 {%- endfor -%} | 96 {%- endfor -%} |
| 85 | 97 |
| 86 {%- set num_fields = struct.packed.packed_fields|length %} | 98 {%- set num_fields = struct.packed.packed_fields|length %} |
| 87 {%- if num_fields > 0 %} | 99 {%- if num_fields > 0 %} |
| 88 {%- set last_field = struct.packed.packed_fields[num_fields - 1] %} | 100 {%- set last_field = struct.packed.packed_fields[num_fields - 1] %} |
| 89 {%- set offset = last_field.offset + last_field.size %} | 101 {%- set offset = last_field.offset + last_field.size %} |
| 90 {%- set pad = offset|get_pad(8) -%} | 102 {%- set pad = offset|get_pad(8) -%} |
| 91 {%- if pad > 0 %} | 103 {%- if pad > 0 %} |
| 92 uint8_t padfinal_[{{pad}}]; | 104 uint8_t padfinal_[{{pad}}]; |
| 93 {%- endif %} | 105 {%- endif %} |
| 94 {%- endif %} | 106 {%- endif %} |
| 95 {%- endmacro %} | 107 {%- endmacro %} |
| 96 | 108 |
| 97 {%- macro encodes(struct) -%} | 109 {%- macro encodes(struct) -%} |
| 98 {%- for pf in struct.packed.packed_fields %} | 110 {%- for pf in struct.packed.packed_fields %} |
| 99 {%- if pf.field.kind|is_object_kind %} | 111 {%- if pf.field.kind|is_map_kind %} |
| 112 mojo::internal::Encode(&{{pf.field.name}}_keys, handles); |
| 113 mojo::internal::Encode(&{{pf.field.name}}_values, handles); |
| 114 {%- elif pf.field.kind|is_object_kind %} |
| 100 mojo::internal::Encode(&{{pf.field.name}}, handles); | 115 mojo::internal::Encode(&{{pf.field.name}}, handles); |
| 101 {%- elif pf.field.kind|is_any_handle_kind %} | 116 {%- elif pf.field.kind|is_any_handle_kind %} |
| 102 mojo::internal::EncodeHandle(&{{pf.field.name}}, handles); | 117 mojo::internal::EncodeHandle(&{{pf.field.name}}, handles); |
| 103 {%- endif %} | 118 {%- endif %} |
| 104 {%- endfor %} | 119 {%- endfor %} |
| 105 {%- endmacro -%} | 120 {%- endmacro -%} |
| 106 | 121 |
| 107 {%- macro decodes(struct) -%} | 122 {%- macro decodes(struct) -%} |
| 108 {%- for pf in struct.packed.packed_fields %} | 123 {%- for pf in struct.packed.packed_fields %} |
| 109 {%- if pf.field.kind|is_object_kind %} | 124 {%- if pf.field.kind|is_map_kind %} |
| 125 mojo::internal::Decode(&{{pf.field.name}}_keys, handles); |
| 126 mojo::internal::Decode(&{{pf.field.name}}_values, handles); |
| 127 {%- elif pf.field.kind|is_object_kind %} |
| 110 mojo::internal::Decode(&{{pf.field.name}}, handles); | 128 mojo::internal::Decode(&{{pf.field.name}}, handles); |
| 111 {%- elif pf.field.kind|is_any_handle_kind %} | 129 {%- elif pf.field.kind|is_any_handle_kind %} |
| 112 mojo::internal::DecodeHandle(&{{pf.field.name}}, handles); | 130 mojo::internal::DecodeHandle(&{{pf.field.name}}, handles); |
| 113 {%- endif %} | 131 {%- endif %} |
| 114 {%- endfor %} | 132 {%- endfor %} |
| 115 {%- endmacro -%} | 133 {%- endmacro -%} |
| OLD | NEW |