| 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
|
|
|