Index: third_party/WebKit/Source/bindings/templates/union.h |
diff --git a/third_party/WebKit/Source/bindings/templates/union.h b/third_party/WebKit/Source/bindings/templates/union.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7de43bb48529380a66820ebddb94c38f5242f077 |
--- /dev/null |
+++ b/third_party/WebKit/Source/bindings/templates/union.h |
@@ -0,0 +1,79 @@ |
+{% include 'copyright_block.txt' %} |
+#ifndef {{macro_guard}} |
+#define {{macro_guard}} |
+ |
+{% for filename in header_includes %} |
+#include "{{filename}}" |
+{% endfor %} |
+ |
+namespace blink { |
+ |
+{% for decl in header_forward_decls %} |
+class {{decl}}; |
+{% endfor %} |
+ |
+{% for container in containers %} |
+class {{exported}}{{container.cpp_class}} final { |
+ DISALLOW_NEW_EXCEPT_PLACEMENT_NEW(); |
+public: |
+ {{container.cpp_class}}(); |
+ bool isNull() const { return m_type == SpecificTypeNone; } |
+ |
+ {% for member in container.members %} |
+ bool is{{member.type_name}}() const { return m_type == {{member.specific_type_enum}}; } |
+ {{member.rvalue_cpp_type}} getAs{{member.type_name}}() const; |
+ void set{{member.type_name}}({{member.rvalue_cpp_type}}); |
+ static {{container.cpp_class}} from{{member.type_name}}({{member.rvalue_cpp_type}}); |
+ |
+ {% endfor %} |
+ {{container.cpp_class}}(const {{container.cpp_class}}&); |
+ ~{{container.cpp_class}}(); |
+ {{container.cpp_class}}& operator=(const {{container.cpp_class}}&); |
+ DECLARE_TRACE(); |
+ |
+private: |
+ enum SpecificTypes { |
+ SpecificTypeNone, |
+ {% for member in container.members %} |
+ {{member.specific_type_enum}}, |
+ {% endfor %} |
+ }; |
+ SpecificTypes m_type; |
+ |
+ {% for member in container.members %} |
+ {{member.cpp_type}} m_{{member.cpp_name}}; |
+ {% endfor %} |
+ |
+ friend {{exported}}v8::Local<v8::Value> toV8(const {{container.cpp_class}}&, v8::Local<v8::Object>, v8::Isolate*); |
+}; |
+ |
+class V8{{container.cpp_class}} final { |
+public: |
+ {{exported}}static void toImpl(v8::Isolate*, v8::Local<v8::Value>, {{container.cpp_class}}&, UnionTypeConversionMode, ExceptionState&); |
+}; |
+ |
+{{exported}}v8::Local<v8::Value> toV8(const {{container.cpp_class}}&, v8::Local<v8::Object>, v8::Isolate*); |
+ |
+template <class CallbackInfo> |
+inline void v8SetReturnValue(const CallbackInfo& callbackInfo, {{container.cpp_class}}& impl) |
+{ |
+ v8SetReturnValue(callbackInfo, toV8(impl, callbackInfo.Holder(), callbackInfo.GetIsolate())); |
+} |
+ |
+template <> |
+struct NativeValueTraits<{{container.cpp_class}}> { |
+ {{exported}}static {{container.cpp_class}} nativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&); |
+}; |
+ |
+{% endfor %} |
+} // namespace blink |
+ |
+// We need to set canInitializeWithMemset=true because HeapVector supports |
+// items that can initialize with memset or have a vtable. It is safe to |
+// set canInitializeWithMemset=true for a union type object in practice. |
+// See https://codereview.chromium.org/1118993002/#msg5 for more details. |
+{% for container in containers %} |
+WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::{{container.cpp_class}}); |
+{% endfor %} |
+ |
+#endif // {{macro_guard}} |