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 |