| {# TODO(vardhan): Fill out the remaining validation error strings. #} |
| {%- macro validate_not_null_ptr(field_expr, field, object_name, err_string) %} |
| if (!{{field_expr}}->offset) { |
| MOJO_INTERNAL_DEBUG_SET_ERROR_MSG({{err_string}}) |
| << "null field '{{field.name}}' in '{{object_name}}'"; |
| return mojo::internal::ValidationError::UNEXPECTED_NULL_POINTER; |
| } |
| {%- endmacro %} |
| |
| {%- macro validate_encoded_ptr(field_expr, err_string) %} |
| if (!mojo::internal::ValidateEncodedPointer(&{{field_expr}}->offset)) { |
| MOJO_INTERNAL_DEBUG_SET_ERROR_MSG({{err_string}}) << ""; |
| return mojo::internal::ValidationError::ILLEGAL_POINTER; |
| } |
| {%- endmacro %} |
| |
| {%- macro validate_array_or_string(field_expr, field, err_string) -%} |
| const mojo::internal::ArrayValidateParams {{field.name}}_validate_params( |
| {{field.kind|get_array_validate_params_ctor_args|indent(4)}}); |
| auto validate_retval = {{field.kind|cpp_wrapper_type}}::Data_::Validate( |
| mojo::internal::DecodePointerRaw(&{{field_expr}}->offset), |
| bounds_checker, &{{field.name}}_validate_params, |
| {{err_string}}); |
| if (validate_retval != mojo::internal::ValidationError::NONE) { |
| return validate_retval; |
| } |
| {%- endmacro %} |
| |
| {%- macro validate_handle(field_expr, field, object_name, err_string) -%} |
| 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) { |
| MOJO_INTERNAL_DEBUG_SET_ERROR_MSG({{err_string}}) |
| << "invalid {{field.name}} field in {{object_name}}"; |
| return mojo::internal::ValidationError::UNEXPECTED_INVALID_HANDLE; |
| } |
| {%- endif %} |
| if (!bounds_checker->ClaimHandle({{field.name}}_handle)) { |
| MOJO_INTERNAL_DEBUG_SET_ERROR_MSG({{err_string}}) << ""; |
| return mojo::internal::ValidationError::ILLEGAL_HANDLE; |
| } |
| {%- endmacro -%} |
| |
| {%- macro validate_union_field(field, union, err_string) %} |
| {%- 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, err_string) }} |
| {%- endif %} |
| {{ validate_encoded_ptr(field_expr, err_string) }} |
| {%- endif %} |
| |
| {%- if field.kind|is_array_kind or field.kind|is_string_kind -%} |
| {{ validate_array_or_string(field_expr, field, err_string) }} |
| {%- endif %} |
| |
| {%- if field.kind|is_any_handle_kind -%} |
| {{ validate_handle(field_expr, field, union.name, err_string) }} |
| {%- endif %} |
| return mojo::internal::ValidationError::NONE; |
| {%- endmacro %} |