blob: 5cb1dc8b68d1293e50013ac5e27ef1dafea74bb9 [file] [log] [blame]
{%- 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 %}