Chromium Code Reviews| 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> |
|
viettrungluu
2015/03/04 20:58:13
nit: (FYI) camelCase is never used in (our) C++
A
azani
2015/03/05 23:59:24
I've updated the case issue. I could be wrong, but
viettrungluu
2015/03/17 20:08:02
Maybe something like the example from http://en.cp
azani
2015/03/18 01:04:39
I have not been able to get these to work.
Puttin
|
| + 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); |
| } |