Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(960)

Unified Diff: mojo/public/tools/bindings/generators/cpp_templates/struct_definition.tmpl

Issue 1486573003: Mojo C++ bindings: associated interface pointers/requests validation (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: mojo/public/tools/bindings/generators/cpp_templates/struct_definition.tmpl
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/struct_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/struct_definition.tmpl
index 77f2ab06f4a31c16ba0456bf5c783b5030687f66..a877fc7adae3af83b24a442d89b3bb9bfb3d0e3e 100644
--- a/mojo/public/tools/bindings/generators/cpp_templates/struct_definition.tmpl
+++ b/mojo/public/tools/bindings/generators/cpp_templates/struct_definition.tmpl
@@ -1,59 +1,48 @@
{%- set class_name = struct.name ~ "_Data" %}
-{#- TODO(yzshen): Consider eliminating _validate_object() and
- _validate_handle(). #}
-
{#- Validates the specified struct field, which is supposed to be an object
(struct/array/string/map/union).
This macro is expanded by the Validate() method. #}
{%- macro _validate_object(struct, packed_field) %}
{%- set name = packed_field.field.name %}
{%- set kind = packed_field.field.kind %}
-{%- set wrapper_type = kind|cpp_wrapper_type %}
{%- if not kind|is_nullable_kind %}
{%- if kind|is_union_kind %}
- if (object->{{name}}.is_null()) {
-{%- else %}
- if (!object->{{name}}.offset) {
-{%- endif %}
- ReportValidationError(
- mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER,
- "null {{name}} field in {{struct.name}} struct");
+ if (!mojo::internal::ValidateInlinedUnionNonNullable(
+ object->{{name}}, "null {{name}} field in {{struct.name}} struct")) {
return false;
}
-{%- endif %}
-{%- if not kind|is_union_kind %}
- if (!mojo::internal::ValidateEncodedPointer(&object->{{name}}.offset)) {
- ReportValidationError(mojo::internal::VALIDATION_ERROR_ILLEGAL_POINTER);
+{%- else %}
+ if (!mojo::internal::ValidatePointerNonNullable(
+ object->{{name}}, "null {{name}} field in {{struct.name}} struct")) {
return false;
}
+{%- endif %}
{%- endif %}
{%- if kind|is_array_kind or kind|is_string_kind %}
const mojo::internal::ArrayValidateParams {{name}}_validate_params(
{{kind|get_array_validate_params_ctor_args|indent(6)}});
- if (!{{wrapper_type}}::Data_::Validate(
- mojo::internal::DecodePointerRaw(&object->{{name}}.offset),
- bounds_checker, &{{name}}_validate_params)) {
+ if (!mojo::internal::ValidateArray(object->{{name}}, bounds_checker,
+ &{{name}}_validate_params)) {
+ return false;
+ }
{%- elif kind|is_map_kind %}
const mojo::internal::ArrayValidateParams {{name}}_validate_params(
{{kind.value_kind|get_map_validate_params_ctor_args|indent(6)}});
- if (!{{wrapper_type}}::Data_::Validate(
- mojo::internal::DecodePointerRaw(&object->{{name}}.offset),
- bounds_checker, &{{name}}_validate_params)) {
+ if (!mojo::internal::ValidateMap(object->{{name}}, bounds_checker,
+ &{{name}}_validate_params)) {
+ return false;
+ }
{%- elif kind|is_struct_kind %}
- if (!{{kind|get_name_for_kind}}::Data_::Validate(
- mojo::internal::DecodePointerRaw(&object->{{name}}.offset),
- bounds_checker)) {
+ if (!mojo::internal::ValidateStruct(object->{{name}}, bounds_checker))
+ return false;
{%- elif kind|is_union_kind %}
- if (!{{kind|get_name_for_kind}}::Data_::Validate(
- &object->{{name}}, bounds_checker, true)) {
-{%- else %}
- if (!{{wrapper_type}}::Data_::Validate(
- mojo::internal::DecodePointerRaw(&object->{{name}}.offset),
- bounds_checker)) {
-{%- endif %}
+ if (!mojo::internal::ValidateInlinedUnion(object->{{name}}, bounds_checker)) {
return false;
}
+{%- else %}
+#error Not reached!
+{%- endif %}
{%- endmacro %}
{#- Validates the specified struct field, which is supposed to be a handle or
@@ -68,24 +57,37 @@
const mojo::Handle {{name}}_handle = object->{{name}};
{%- endif %}
{%- if not kind|is_nullable_kind %}
- if ({{name}}_handle.value() == mojo::internal::kEncodedInvalidHandleValue) {
- ReportValidationError(
- mojo::internal::VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE,
- "invalid {{name}} field in {{struct.name}} struct");
+ if (!mojo::internal::ValidateHandleNonNullable(
+ {{name}}_handle,
+ "invalid {{name}} field in {{struct.name}} struct")) {
return false;
}
{%- endif %}
- if (!bounds_checker->ClaimHandle({{name}}_handle)) {
- ReportValidationError(mojo::internal::VALIDATION_ERROR_ILLEGAL_HANDLE);
+ if (!mojo::internal::ValidateHandle({{name}}_handle, bounds_checker))
return false;
- }
{%- endmacro %}
{#- Validates the specified struct field, which is supposed to be an associated
interface or an associated interface request.
This macro is expanded by the Validate() method. #}
{%- macro _validate_associated(struct, packed_field) %}
- // TODO(yzshen): add validation for associated kinds.
+{%- set name = packed_field.field.name %}
+{%- set kind = packed_field.field.kind %}
+{%- if kind|is_associated_interface_kind %}
+ const mojo::internal::InterfaceId {{name}}_interface_id =
+ object->{{name}}.interface_id;
+{%- else %}
+ const mojo::internal::InterfaceId {{name}}_interface_id = object->{{name}};
+{%- endif %}
+{%- if not kind|is_nullable_kind %}
+ if (!mojo::internal::ValidateInterfaceIdNonNullable(
+ {{name}}_interface_id,
+ "invalid {{name}} field in {{struct.name}} struct")) {
+ return false;
+ }
+{%- endif %}
+ if (!mojo::internal::ValidateAssociatedInterfaceId({{name}}_interface_id))
+ return false;
{%- endmacro %}
// static
« no previous file with comments | « mojo/public/interfaces/bindings/tests/validation_test_associated_interfaces.mojom ('k') | third_party/mojo/mojo_public.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698