| {%- macro validate_not_null_ptr(field_expr, field, object_name) %} |
| if (!{{field_expr}}->offset) { |
| ReportValidationError( |
| mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER, |
| "null {{field.name}} field in {{object_name}}"); |
| return false; |
| } |
| {%- endmacro %} |
| |
| {%- macro validate_encoded_ptr(field_expr) %} |
| if (!mojo::internal::ValidateEncodedPointer(&{{field_expr}}->offset)) { |
| ReportValidationError(mojo::internal::VALIDATION_ERROR_ILLEGAL_POINTER); |
| return false; |
| } |
| {%- endmacro %} |
| |
| {%- macro validate_array_or_string(field_expr, field) -%} |
| const mojo::internal::ArrayValidateParams {{field.name}}_validate_params( |
| {{field.kind|get_array_validate_params_ctor_args|indent(4)}}); |
| if (!{{field.kind|cpp_wrapper_type}}::Data_::Validate( |
| mojo::internal::DecodePointerRaw(&{{field_expr}}->offset), |
| bounds_checker, &{{field.name}}_validate_params)) { |
| return false; |
| } |
| {%- endmacro %} |
| |
| {%- macro validate_handle(field_expr, field, object_name) -%} |
| const mojo::Handle {{field.name}}_handle(object->data.f_{{field.name}}); |
| |
| {%- if not field.kind|is_nullable_kind %} |
| if ({{field.name}}_handle.value() == mojo::internal::kEncodedInvalidHandleValue) { |
| ReportValidationError( |
| mojo::internal::VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE, |
| "invalid {{field.name}} field in {{object_name}}"); |
| return false; |
| } |
| {%- endif %} |
| if (!bounds_checker->ClaimHandle({{field.name}}_handle)) { |
| ReportValidationError(mojo::internal::VALIDATION_ERROR_ILLEGAL_HANDLE); |
| return false; |
| } |
| {%- endmacro -%} |
| |
| {%- macro validate_union_field(field, union) %} |
| {%- set field_expr = "(reinterpret_cast<const " |
| ~ field.kind|cpp_union_field_type |
| ~ "*>(&object->data.f_" |
| ~ field.name |
| ~ "))" -%} |
| {%- if field.kind|is_object_kind -%} |
| {%- if not field.kind|is_nullable_kind -%} |
| {{ validate_not_null_ptr(field_expr, field, union.name) }} |
| {%- endif %} |
| {{ validate_encoded_ptr(field_expr) }} |
| {%- endif %} |
| |
| {%- if field.kind|is_array_kind or field.kind|is_string_kind -%} |
| {{ validate_array_or_string(field_expr, field) }} |
| {%- endif %} |
| |
| {%- if field.kind|is_any_handle_kind -%} |
| {{ validate_handle(field_expr, field, union.name) }} |
| {%- endif %} |
| return true; |
| {%- endmacro %} |