Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef NativeValueTraits_h | 5 #ifndef NativeValueTraits_h |
| 6 #define NativeValueTraits_h | 6 #define NativeValueTraits_h |
| 7 | 7 |
| 8 #include "v8/include/v8.h" | 8 #include <v8.h> |
|
Yuki
2017/03/06 07:39:42
Don't change this #include.
Our new convention is
| |
| 9 #include <type_traits> | |
| 10 #include "bindings/core/v8/IDLTypesBase.h" | |
| 9 #include "wtf/Allocator.h" | 11 #include "wtf/Allocator.h" |
| 10 | 12 |
| 11 namespace blink { | 13 namespace blink { |
| 12 | 14 |
| 13 class ExceptionState; | 15 class ExceptionState; |
| 14 | 16 |
| 15 template <typename T, typename... Arguments> | 17 // NativeValueTraitsBase is supposed to be inherited by NativeValueTraits |
| 16 struct NativeValueTraits { | 18 // classes. They serve as a way to hold the ImplType typedef without requiring |
| 17 STATIC_ONLY(NativeValueTraits); | 19 // all NativeValueTraits specializations to declare it. |
| 18 static T nativeValue(v8::Isolate*, | 20 // |
| 19 v8::Local<v8::Value>, | 21 // The primary template below is used by NativeValueTraits specializations with |
| 20 ExceptionState&, | 22 // types that do not inherit from IDLBase, in which case it is assumed the type |
| 21 Arguments... args); | 23 // of the specialization is also |ImplType|. The NativeValueTraitsBase |
| 24 // specialization is used for IDLBase-based types, which are supposed to have | |
| 25 // their own |ImplType| typedefs. | |
| 26 template <typename T, typename U = void> | |
|
Yuki
2017/03/06 08:14:19
Why do we need |U| here?
Raphael Kubo da Costa (rakuco)
2017/03/06 08:36:52
For the other NativeValueTraitsBase<> declaration
Yuki
2017/03/06 09:03:42
I see.
| |
| 27 struct NativeValueTraitsBase { | |
| 28 using ImplType = T; | |
| 29 STATIC_ONLY(NativeValueTraitsBase); | |
| 30 }; | |
| 31 | |
| 32 template <typename T> | |
| 33 struct NativeValueTraitsBase< | |
| 34 T, | |
| 35 typename std::enable_if<std::is_base_of<IDLBase, T>::value>::type> { | |
| 36 using ImplType = typename T::ImplType; | |
| 37 STATIC_ONLY(NativeValueTraitsBase); | |
| 38 }; | |
| 39 | |
| 40 // Primary template for NativeValueTraits. It is not supposed to be used | |
| 41 // directly: there needs to be a specialization for each type which represents | |
| 42 // a JavaScript type that will be converted to a C++ representation. | |
| 43 // Its main goal is to provide a standard interface for converting JS types | |
| 44 // into C++ ones. | |
| 45 // | |
| 46 // Example: | |
| 47 // template <> | |
| 48 // struct NativeValueTraits<IDLLong> : public NativeValueTraitsBase<IDLLong> { | |
| 49 // static inline int32_t nativeValue(v8::Isolate* isolate, | |
| 50 // v8::Local<v8::Value> value, | |
| 51 // ExceptionState& exceptionState) { | |
| 52 // return toInt32(isolate, value, exceptionState, NormalConversion); | |
| 53 // } | |
| 54 // } | |
| 55 // | |
| 56 // Note that there exist some specializations (particularly in V8Binding.h) for | |
| 57 // which T actually represents the final C++ type that a JavaScript value | |
| 58 // should be converted to. Introducing new specializations of this kind is | |
| 59 // discouraged. | |
| 60 template <typename T, typename... Args> | |
|
Yuki
2017/03/06 07:39:42
I think that we don't need |Args| here.
We can add
Raphael Kubo da Costa (rakuco)
2017/03/06 08:06:07
|Args| is not needed indeed. I left it there to ke
Yuki
2017/03/06 08:14:19
Why and how does it break? Is there any NativeVal
Raphael Kubo da Costa (rakuco)
2017/03/06 08:36:52
The build failure looks like this:
In file includ
Yuki
2017/03/06 09:03:42
This seems a wrong solution. I now see an issue t
Raphael Kubo da Costa (rakuco)
2017/03/06 09:51:38
We're quite limited in what we can do here if the
Yuki
2017/03/06 10:13:03
What about the following?
template <typename CppT
Raphael Kubo da Costa (rakuco)
2017/03/06 10:40:36
How about being even more explicit with something
Yuki
2017/03/06 10:43:04
Looks good. Could you add a comment which code us
| |
| 61 struct NativeValueTraits : public NativeValueTraitsBase<T> { | |
| 62 // This declaration serves only as a blueprint for specializations: the | |
| 63 // return type can change, but all specializations are expected to provide a | |
| 64 // nativeValue() method that takes the 3 arguments below. | |
| 65 static inline typename NativeValueTraitsBase<T>::ImplType | |
| 66 nativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&); | |
| 22 }; | 67 }; |
| 23 | 68 |
| 24 } // namespace blink | 69 } // namespace blink |
| 25 | 70 |
| 26 #endif // NativeValueTraits_h | 71 #endif // NativeValueTraits_h |
| OLD | NEW |