| Index: mojo/public/cpp/bindings/lib/array_internal.h
|
| diff --git a/mojo/public/cpp/bindings/lib/array_internal.h b/mojo/public/cpp/bindings/lib/array_internal.h
|
| index eb25e35210a5d49cc5d41ff2caab9664db479630..18afde80b54cf7c257b0d72c0a3937513d4f9383 100644
|
| --- a/mojo/public/cpp/bindings/lib/array_internal.h
|
| +++ b/mojo/public/cpp/bindings/lib/array_internal.h
|
| @@ -276,8 +276,8 @@ struct ArraySerializationHelper<P*, false> {
|
| ReportValidationError(VALIDATION_ERROR_ILLEGAL_POINTER);
|
| return false;
|
| }
|
| - if (!ValidateCaller<P, ElementValidateParams>::Run(
|
| - DecodePointerRaw(&elements[i].offset), bounds_checker)) {
|
| + if (!ValidateCaller<P, ElementValidateParams, IsUnionDataType<P>::value>::
|
| + Run(DecodePointerRaw(&elements[i].offset), bounds_checker)) {
|
| return false;
|
| }
|
| }
|
| @@ -285,8 +285,11 @@ struct ArraySerializationHelper<P*, false> {
|
| }
|
|
|
| private:
|
| + template <typename T, typename Params, bool isUnion>
|
| + struct ValidateCaller {};
|
| +
|
| template <typename T, typename Params>
|
| - struct ValidateCaller {
|
| + struct ValidateCaller<T, Params, false> {
|
| static bool Run(const void* data, BoundsChecker* bounds_checker) {
|
| static_assert((IsSame<Params, NoValidateParams>::value),
|
| "Struct type should not have array validate params");
|
| @@ -295,8 +298,18 @@ struct ArraySerializationHelper<P*, false> {
|
| }
|
| };
|
|
|
| + template <typename T, typename Params>
|
| + struct ValidateCaller<T, Params, true> {
|
| + static bool Run(const void* data, BoundsChecker* bounds_checker) {
|
| + static_assert((IsSame<Params, NoValidateParams>::value),
|
| + "Union type should not have array validate params");
|
| +
|
| + return T::Validate(data, bounds_checker, true);
|
| + }
|
| + };
|
| +
|
| template <typename Key, typename Value, typename Params>
|
| - struct ValidateCaller<Map_Data<Key, Value>, Params> {
|
| + struct ValidateCaller<Map_Data<Key, Value>, Params, false> {
|
| static bool Run(const void* data, BoundsChecker* bounds_checker) {
|
| return Map_Data<Key, Value>::template Validate<Params>(data,
|
| bounds_checker);
|
| @@ -304,7 +317,7 @@ struct ArraySerializationHelper<P*, false> {
|
| };
|
|
|
| template <typename T, typename Params>
|
| - struct ValidateCaller<Array_Data<T>, Params> {
|
| + struct ValidateCaller<Array_Data<T>, Params, false> {
|
| static bool Run(const void* data, BoundsChecker* bounds_checker) {
|
| return Array_Data<T>::template Validate<Params>(data, bounds_checker);
|
| }
|
|
|