Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(305)

Unified Diff: Source/bindings/templates/union.cpp

Issue 680193003: IDL: Generate union type containers (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/bindings/templates/union.cpp
diff --git a/Source/bindings/templates/union.cpp b/Source/bindings/templates/union.cpp
index d3523387f89a93d6f1a4de2575ba5b8a8293128b..1b4ac18a53692c9ef28c26b268c67e8ffc11887d 100644
--- a/Source/bindings/templates/union.cpp
+++ b/Source/bindings/templates/union.cpp
@@ -2,4 +2,128 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// FIXME: Implement
+// This file has been auto-generated by {{code_generator}}. DO NOT MODIFY!
+
+#include "config.h"
+#include "{{header_filename}}"
+
+{% for filename in cpp_includes %}
+#include "{{filename}}"
+{% endfor %}
+
+namespace blink {
+
+{% for container in containers %}
+{{container.cpp_class}}::{{container.cpp_class}}()
+ : m_type(SpecificTypeNone)
+{
+}
+
+{% for member in container.members %}
+{{member.rvalue_cpp_type}} {{container.cpp_class}}::getAs{{member.type_name}}()
+{
+ ASSERT(is{{member.type_name}}());
+ return m_{{member.cpp_name}};
+}
+
+void {{container.cpp_class}}::set{{member.type_name}}({{member.rvalue_cpp_type}} value)
+{
+ ASSERT(isNull());
+ m_{{member.cpp_name}} = value;
+ m_type = {{member.specific_type_enum}};
+}
+
+{% endfor %}
+void V8{{container.cpp_class}}::toImpl(v8::Isolate* isolate, v8::Handle<v8::Value> v8Value, {{container.cpp_class}}& impl, ExceptionState& exceptionState)
+{
+ {# FIXME: We don't follow the spec on handling null and undefined at this
+ moment. Should be fixed once we implement all necessary conversion steps
+ below. #}
+ if (v8Value.IsEmpty() || isUndefinedOrNull(v8Value))
+ return;
+
+ {# The numbers in the following comments refer the steps described in
haraken 2014/10/30 13:01:30 refer => refer to
bashi 2014/10/30 23:19:18 Done.
+ http://heycam.github.io/webidl/#es-union
+ FIXME: Implement all necessary steps #}
+ {# 3. Platform objects (interfaces) #}
+ {% for interface in container.interface_types %}
+ if (V8{{interface.type_name}}::hasInstance(v8Value, isolate)) {
+ {{interface.cpp_local_type}} cppValue = V8{{interface.type_name}}::toImpl(v8::Handle<v8::Object>::Cast(v8Value));
+ impl.set{{interface.type_name}}(cppValue);
+ return;
+ }
+
+ {% endfor %}
+ {% if container.dictionary_type %}
+ {# 12. Dictionaries #}
+ {# FIXME: This should be "object but not Date or RegExp". Adds checks when
haraken 2014/10/30 13:01:30 Adds => Add
bashi 2014/10/30 23:19:18 Done.
+ we implement conversions for Date and RegExp. #}
+ if (v8Value->IsObject()) {
+ {{container.dictionary_type.cpp_local_type}} cppValue = V8{{container.dictionary_type.type_name}}::toImpl(isolate, v8Value, exceptionState);
+ if (!exceptionState.hadException())
+ impl.set{{container.dictionary_type.type_name}}(cppValue);
+ return;
+ }
+
+ {% endif %}
+ {% if container.boolean_type %}
+ {# 14. Boolean #}
+ if (v8Value->IsBoolean()) {
+ impl.setBoolean(v8Value->ToBoolean()->Value());
+ return;
+ }
+
+ {% endif %}
+ {% if container.numeric_type %}
+ {# 15. Number #}
+ if (v8Value->IsNumber()) {
+ {{container.numeric_type.v8_value_to_local_cpp_value}};
+ impl.set{{container.numeric_type.type_name}}(cppValue);
+ return;
+ }
+
+ {% endif %}
+ {% if container.string_type %}
+ {# 16. String #}
+ {
+ {{container.string_type.v8_value_to_local_cpp_value}};
+ impl.set{{container.string_type.type_name}}(cppValue);
+ return;
+ }
+
+ {# 17. Number (fallback) #}
+ {% elif container.numeric_type %}
+ {
+ {{container.numeric_type.v8_value_to_local_cpp_value}};
+ return;
Jens Widell 2014/10/30 14:04:07 Aren't we missing an impl.set{{container.numeri
bashi 2014/10/30 23:19:18 Yes. Thank you for taking a closer look as usual!
+ }
+
+ {# 18. Boolean (fallback) #}
+ {% elif container.boolean_type %}
+ {
+ impl.setBoolean(v8Value->ToBoolean()->Value());
+ return;
+ }
+
+ {% endif %}
+ {# 19. TypeError #}
+ exceptionState.throwTypeError("Not a valid union member.");
+}
+
+v8::Handle<v8::Value> toV8({{container.cpp_class}}& impl, v8::Handle<v8::Object> creationContext, v8::Isolate* isolate)
+{
+ {# FIXME: We might want to return undefined in some cases #}
+ if (impl.isNull())
+ return v8::Null(isolate);
+
+ {% for member in container.members %}
+ if (impl.is{{member.type_name}}())
+ return {{member.cpp_value_to_v8_value}};
+
+ {% endfor %}
+ ASSERT_NOT_REACHED();
+ return v8::Handle<v8::Value>();
+}
+
+{% endfor %}
+} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698