Chromium Code Reviews| Index: Source/bindings/templates/union.cpp |
| diff --git a/Source/bindings/templates/union.cpp b/Source/bindings/templates/union.cpp |
| index d3523387f89a93d6f1a4de2575ba5b8a8293128b..2cb8a4bd9a9e3ba6c9712788bbdd6459952be2ac 100644 |
| --- a/Source/bindings/templates/union.cpp |
| +++ b/Source/bindings/templates/union.cpp |
| @@ -2,4 +2,127 @@ |
| // 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 |
| + 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 |
| + 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; |
| + } |
| + |
| + {# 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) |
| +{ |
| + if (impl.isNull()) |
| + return v8::Null(isolate); |
|
Jens Widell
2014/10/29 11:40:45
It's possible we should sometimes convert to undef
bashi
2014/10/30 01:34:37
I missed the statement, thank you for pointing thi
|
| + |
| + {% 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 |