| OLD | NEW |
| 1 {% filter format_blink_cpp_source_code %} | |
| 2 | |
| 3 {% from 'utilities.cpp.tmpl' import declare_enum_validation_variable %} | 1 {% from 'utilities.cpp.tmpl' import declare_enum_validation_variable %} |
| 4 {% include 'copyright_block.txt' %} | |
| 5 #include "{{this_include_header_name}}.h" | |
| 6 | |
| 7 {% from 'utilities.cpp.tmpl' import v8_value_to_local_cpp_value %} | 2 {% from 'utilities.cpp.tmpl' import v8_value_to_local_cpp_value %} |
| 3 {#############################################################################} |
| 8 {% macro assign_and_return_if_hasinstance(member) %} | 4 {% macro assign_and_return_if_hasinstance(member) %} |
| 9 {% if member.is_array_buffer_or_view_type %} | 5 {% if member.is_array_buffer_or_view_type %} |
| 10 if (v8Value->Is{{member.type_name}}()) { | 6 if (v8Value->Is{{member.type_name}}()) { |
| 11 {% else %} | 7 {% else %} |
| 12 if (V8{{member.type_name}}::hasInstance(v8Value, isolate)) { | 8 if (V8{{member.type_name}}::hasInstance(v8Value, isolate)) { |
| 13 {% endif %} | 9 {% endif %} |
| 14 {{member.cpp_local_type}} cppValue = V8{{member.type_name}}::toImpl(v8::Loca
l<v8::Object>::Cast(v8Value)); | 10 {{member.cpp_local_type}} cppValue = V8{{member.type_name}}::toImpl(v8::Local<
v8::Object>::Cast(v8Value)); |
| 15 impl.set{{member.type_name}}(cppValue); | 11 impl.set{{member.type_name}}(cppValue); |
| 16 return; | 12 return; |
| 17 } | 13 } |
| 18 {% endmacro %} | 14 {% endmacro %} |
| 15 {#############################################################################} |
| 16 {% filter format_blink_cpp_source_code %} |
| 17 {% include 'copyright_block.txt' %} |
| 18 #include "{{this_include_header_name}}.h" |
| 19 |
| 19 {% for filename in cpp_includes %} | 20 {% for filename in cpp_includes %} |
| 20 #include "{{filename}}" | 21 #include "{{filename}}" |
| 21 {% endfor %} | 22 {% endfor %} |
| 22 | 23 |
| 23 namespace blink { | 24 namespace blink { |
| 24 | 25 |
| 25 {{cpp_class}}::{{cpp_class}}() | 26 {{cpp_class}}::{{cpp_class}}() : m_type(SpecificTypeNone) {} |
| 26 : m_type(SpecificTypeNone) | 27 |
| 27 { | 28 {% for member in members %} |
| 29 {{member.rvalue_cpp_type}} {{cpp_class}}::getAs{{member.type_name}}() const { |
| 30 DCHECK(is{{member.type_name}}()); |
| 31 return m_{{member.cpp_name}}; |
| 28 } | 32 } |
| 29 | 33 |
| 30 {% for member in members %} | 34 void {{cpp_class}}::set{{member.type_name}}({{member.rvalue_cpp_type}} value) { |
| 31 {{member.rvalue_cpp_type}} {{cpp_class}}::getAs{{member.type_name}}() const | 35 DCHECK(isNull()); |
| 32 { | 36 {% if member.enum_values %} |
| 33 ASSERT(is{{member.type_name}}()); | 37 NonThrowableExceptionState exceptionState; |
| 34 return m_{{member.cpp_name}}; | 38 {{declare_enum_validation_variable(member.enum_values) | indent(2)}} |
| 39 if (!isValidEnum(value, validValues, WTF_ARRAY_LENGTH(validValues), "{{member.
type_name}}", exceptionState)) { |
| 40 NOTREACHED(); |
| 41 return; |
| 42 } |
| 43 {% endif %} |
| 44 m_{{member.cpp_name}} = value; |
| 45 m_type = {{member.specific_type_enum}}; |
| 35 } | 46 } |
| 36 | 47 |
| 37 void {{cpp_class}}::set{{member.type_name}}({{member.rvalue_cpp_type}} value) | 48 {{cpp_class}} {{cpp_class}}::from{{member.type_name}}({{member.rvalue_cpp_type}}
value) { |
| 38 { | 49 {{cpp_class}} container; |
| 39 ASSERT(isNull()); | 50 container.set{{member.type_name}}(value); |
| 40 {% if member.enum_values %} | 51 return container; |
| 41 NonThrowableExceptionState exceptionState; | |
| 42 {{declare_enum_validation_variable(member.enum_values) | indent}} | |
| 43 if (!isValidEnum(value, validValues, WTF_ARRAY_LENGTH(validValues), "{{membe
r.type_name}}", exceptionState)) { | |
| 44 ASSERT_NOT_REACHED(); | |
| 45 return; | |
| 46 } | |
| 47 {% endif %} | |
| 48 m_{{member.cpp_name}} = value; | |
| 49 m_type = {{member.specific_type_enum}}; | |
| 50 } | |
| 51 | |
| 52 {{cpp_class}} {{cpp_class}}::from{{member.type_name}}({{member.rvalue_cpp_type}}
value) | |
| 53 { | |
| 54 {{cpp_class}} container; | |
| 55 container.set{{member.type_name}}(value); | |
| 56 return container; | |
| 57 } | 52 } |
| 58 | 53 |
| 59 {% endfor %} | 54 {% endfor %} |
| 60 {{cpp_class}}::{{cpp_class}}(const {{cpp_class}}&) = default; | 55 {{cpp_class}}::{{cpp_class}}(const {{cpp_class}}&) = default; |
| 61 {{cpp_class}}::~{{cpp_class}}() = default; | 56 {{cpp_class}}::~{{cpp_class}}() = default; |
| 62 {{cpp_class}}& {{cpp_class}}::operator=(const {{cpp_class}}&) = default; | 57 {{cpp_class}}& {{cpp_class}}::operator=(const {{cpp_class}}&) = default; |
| 63 | 58 |
| 64 DEFINE_TRACE({{cpp_class}}) | 59 DEFINE_TRACE({{cpp_class}}) { |
| 65 { | 60 {% for member in members if member.is_traceable %} |
| 66 {% for member in members if member.is_traceable %} | 61 visitor->trace(m_{{member.cpp_name}}); |
| 67 visitor->trace(m_{{member.cpp_name}}); | 62 {% endfor %} |
| 68 {% endfor %} | |
| 69 } | 63 } |
| 70 | 64 |
| 71 void {{v8_class}}::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, {{
cpp_class}}& impl, UnionTypeConversionMode conversionMode, ExceptionState& excep
tionState) | 65 void {{v8_class}}::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, {{
cpp_class}}& impl, UnionTypeConversionMode conversionMode, ExceptionState& excep
tionState) { |
| 72 { | 66 if (v8Value.IsEmpty()) |
| 73 if (v8Value.IsEmpty()) | 67 return; |
| 74 return; | |
| 75 | 68 |
| 76 {# The numbers in the following comments refer to the steps described in | 69 {# The numbers in the following comments refer to the steps described in |
| 77 http://heycam.github.io/webidl/#es-union #} | 70 http://heycam.github.io/webidl/#es-union #} |
| 78 {# 1. null or undefined #} | 71 {# 1. null or undefined #} |
| 79 if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull
(v8Value)) | 72 if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull(v
8Value)) |
| 80 return; | 73 return; |
| 81 | 74 |
| 82 {% if dictionary_type %} | 75 {% if dictionary_type %} |
| 83 {# 3. Dictionaries for null or undefined #} | 76 {# 3. Dictionaries for null or undefined #} |
| 84 if (isUndefinedOrNull(v8Value)) { | 77 if (isUndefinedOrNull(v8Value)) { |
| 85 {{v8_value_to_local_cpp_value(dictionary_type) | indent(8)}} | 78 {{v8_value_to_local_cpp_value(dictionary_type) | indent}} |
| 86 impl.set{{dictionary_type.type_name}}(cppValue); | 79 impl.set{{dictionary_type.type_name}}(cppValue); |
| 87 return; | 80 return; |
| 88 } | 81 } |
| 89 | 82 |
| 83 {% endif %} |
| 84 {# 4. Platform objects (interfaces) #} |
| 85 {% for interface in interface_types %} |
| 86 {{assign_and_return_if_hasinstance(interface) | indent(2)}} |
| 87 |
| 88 {% endfor %} |
| 89 {# 8. ArrayBuffer #} |
| 90 {% if array_buffer_type %} |
| 91 {{assign_and_return_if_hasinstance(array_buffer_type) | indent(2)}} |
| 92 |
| 93 {% endif %} |
| 94 {# 9., 10. ArrayBufferView #} |
| 95 {# FIXME: Individual typed arrays (e.g. Uint8Array) aren\'t supported yet. #} |
| 96 {% if array_buffer_view_type %} |
| 97 {{assign_and_return_if_hasinstance(array_buffer_view_type) | indent(2)}} |
| 98 |
| 99 {% endif %} |
| 100 {% if array_or_sequence_type %} |
| 101 {# 12.1, 12.2. Arrays and Sequences #} |
| 102 {# FIXME: This should also check "object but not RegExp". Add checks |
| 103 when we implement conversions for Date and RegExp. #} |
| 104 {# TODO(bashi): Should check @@iterator symbol instead. #} |
| 105 if (v8Value->IsArray()) { |
| 106 {{v8_value_to_local_cpp_value(array_or_sequence_type) | indent}} |
| 107 impl.set{{array_or_sequence_type.type_name}}(cppValue); |
| 108 return; |
| 109 } |
| 110 |
| 111 {% endif %} |
| 112 {% if dictionary_type %} |
| 113 {# 12.3. Dictionaries #} |
| 114 if (v8Value->IsObject()) { |
| 115 {{v8_value_to_local_cpp_value(dictionary_type) | indent}} |
| 116 impl.set{{dictionary_type.type_name}}(cppValue); |
| 117 return; |
| 118 } |
| 119 |
| 120 {% endif %} |
| 121 {# TODO(bashi): Support 12.4 Callback interface when we need it #} |
| 122 {# 12.5. Objects #} |
| 123 {% if object_type %} |
| 124 if (isUndefinedOrNull(v8Value) || v8Value->IsObject()) { |
| 125 {{v8_value_to_local_cpp_value(object_type) | indent}} |
| 126 impl.set{{object_type.type_name}}(cppValue); |
| 127 return; |
| 128 } |
| 129 |
| 130 {% endif %} |
| 131 {# FIXME: In some cases, we can omit boolean and numeric type checks because |
| 132 we have fallback conversions. (step 16 and 17) #} |
| 133 {% if boolean_type %} |
| 134 {# 13. Boolean #} |
| 135 if (v8Value->IsBoolean()) { |
| 136 impl.setBoolean(v8Value.As<v8::Boolean>()->Value()); |
| 137 return; |
| 138 } |
| 139 |
| 140 {% endif %} |
| 141 {% if numeric_type %} |
| 142 {# 14. Number #} |
| 143 if (v8Value->IsNumber()) { |
| 144 {{v8_value_to_local_cpp_value(numeric_type) | indent}} |
| 145 impl.set{{numeric_type.type_name}}(cppValue); |
| 146 return; |
| 147 } |
| 148 |
| 149 {% endif %} |
| 150 {% if string_type %} |
| 151 {# 15. String #} |
| 152 { |
| 153 {{v8_value_to_local_cpp_value(string_type) | indent}} |
| 154 {% if string_type.enum_values %} |
| 155 {{declare_enum_validation_variable(string_type.enum_values) | indent}} |
| 156 if (!isValidEnum(cppValue, validValues, WTF_ARRAY_LENGTH(validValues), "{{st
ring_type.type_name}}", exceptionState)) |
| 157 return; |
| 90 {% endif %} | 158 {% endif %} |
| 91 {# 4. Platform objects (interfaces) #} | 159 impl.set{{string_type.type_name}}(cppValue); |
| 92 {% for interface in interface_types %} | 160 return; |
| 93 {{assign_and_return_if_hasinstance(interface) | indent}} | 161 } |
| 94 | 162 |
| 95 {% endfor %} | 163 {# 16. Number (fallback) #} |
| 96 {# 8. ArrayBuffer #} | 164 {% elif numeric_type %} |
| 97 {% if array_buffer_type %} | 165 { |
| 98 {{assign_and_return_if_hasinstance(array_buffer_type) | indent}} | 166 {{v8_value_to_local_cpp_value(numeric_type) | indent}} |
| 167 impl.set{{numeric_type.type_name}}(cppValue); |
| 168 return; |
| 169 } |
| 99 | 170 |
| 100 {% endif %} | 171 {# 17. Boolean (fallback) #} |
| 101 {# 9., 10. ArrayBufferView #} | 172 {% elif boolean_type %} |
| 102 {# FIXME: Individual typed arrays (e.g. Uint8Array) aren\'t supported yet. #
} | 173 { |
| 103 {% if array_buffer_view_type %} | 174 impl.setBoolean(v8Value->BooleanValue()); |
| 104 {{assign_and_return_if_hasinstance(array_buffer_view_type) | indent}} | 175 return; |
| 176 } |
| 105 | 177 |
| 106 {% endif %} | 178 {% else %} |
| 107 {% if array_or_sequence_type %} | 179 {# 18. TypeError #} |
| 108 {# 12.1, 12.2. Arrays and Sequences #} | 180 exceptionState.throwTypeError("The provided value is not of type '{{type_strin
g}}'"); |
| 109 {# FIXME: This should also check "object but not RegExp". Add checks | 181 {% endif %} |
| 110 when we implement conversions for Date and RegExp. #} | |
| 111 {# TODO(bashi): Should check @@iterator symbol instead. #} | |
| 112 if (v8Value->IsArray()) { | |
| 113 {{v8_value_to_local_cpp_value(array_or_sequence_type) | indent(8)}} | |
| 114 impl.set{{array_or_sequence_type.type_name}}(cppValue); | |
| 115 return; | |
| 116 } | |
| 117 | |
| 118 {% endif %} | |
| 119 {% if dictionary_type %} | |
| 120 {# 12.3. Dictionaries #} | |
| 121 if (v8Value->IsObject()) { | |
| 122 {{v8_value_to_local_cpp_value(dictionary_type) | indent(8)}} | |
| 123 impl.set{{dictionary_type.type_name}}(cppValue); | |
| 124 return; | |
| 125 } | |
| 126 | |
| 127 {% endif %} | |
| 128 {# TODO(bashi): Support 12.4 Callback interface when we need it #} | |
| 129 {# 12.5. Objects #} | |
| 130 {% if object_type %} | |
| 131 if (isUndefinedOrNull(v8Value) || v8Value->IsObject()) { | |
| 132 {{v8_value_to_local_cpp_value(object_type) | indent(8)}} | |
| 133 impl.set{{object_type.type_name}}(cppValue); | |
| 134 return; | |
| 135 } | |
| 136 | |
| 137 {% endif %} | |
| 138 {# FIXME: In some cases, we can omit boolean and numeric type checks because | |
| 139 we have fallback conversions. (step 16 and 17) #} | |
| 140 {% if boolean_type %} | |
| 141 {# 13. Boolean #} | |
| 142 if (v8Value->IsBoolean()) { | |
| 143 impl.setBoolean(v8Value.As<v8::Boolean>()->Value()); | |
| 144 return; | |
| 145 } | |
| 146 | |
| 147 {% endif %} | |
| 148 {% if numeric_type %} | |
| 149 {# 14. Number #} | |
| 150 if (v8Value->IsNumber()) { | |
| 151 {{v8_value_to_local_cpp_value(numeric_type) | indent(8)}} | |
| 152 impl.set{{numeric_type.type_name}}(cppValue); | |
| 153 return; | |
| 154 } | |
| 155 | |
| 156 {% endif %} | |
| 157 {% if string_type %} | |
| 158 {# 15. String #} | |
| 159 { | |
| 160 {{v8_value_to_local_cpp_value(string_type) | indent(8)}} | |
| 161 {% if string_type.enum_values %} | |
| 162 {{declare_enum_validation_variable(string_type.enum_values) | indent(8)}
} | |
| 163 if (!isValidEnum(cppValue, validValues, WTF_ARRAY_LENGTH(validValues), "
{{string_type.type_name}}", exceptionState)) | |
| 164 return; | |
| 165 {% endif %} | |
| 166 impl.set{{string_type.type_name}}(cppValue); | |
| 167 return; | |
| 168 } | |
| 169 | |
| 170 {# 16. Number (fallback) #} | |
| 171 {% elif numeric_type %} | |
| 172 { | |
| 173 {{v8_value_to_local_cpp_value(numeric_type) | indent(8)}} | |
| 174 impl.set{{numeric_type.type_name}}(cppValue); | |
| 175 return; | |
| 176 } | |
| 177 | |
| 178 {# 17. Boolean (fallback) #} | |
| 179 {% elif boolean_type %} | |
| 180 { | |
| 181 impl.setBoolean(v8Value->BooleanValue()); | |
| 182 return; | |
| 183 } | |
| 184 | |
| 185 {% else %} | |
| 186 {# 18. TypeError #} | |
| 187 exceptionState.throwTypeError("The provided value is not of type '{{type_str
ing}}'"); | |
| 188 {% endif %} | |
| 189 } | 182 } |
| 190 | 183 |
| 191 v8::Local<v8::Value> toV8(const {{cpp_class}}& impl, v8::Local<v8::Object> creat
ionContext, v8::Isolate* isolate) | 184 v8::Local<v8::Value> toV8(const {{cpp_class}}& impl, v8::Local<v8::Object> creat
ionContext, v8::Isolate* isolate) { |
| 192 { | 185 switch (impl.m_type) { |
| 193 switch (impl.m_type) { | |
| 194 case {{cpp_class}}::SpecificTypeNone: | 186 case {{cpp_class}}::SpecificTypeNone: |
| 195 {# FIXME: We might want to return undefined in some cases #} | 187 {# FIXME: We might want to return undefined in some cases #} |
| 196 return v8::Null(isolate); | 188 return v8::Null(isolate); |
| 197 {% for member in members %} | 189 {% for member in members %} |
| 198 case {{cpp_class}}::{{member.specific_type_enum}}: | 190 case {{cpp_class}}::{{member.specific_type_enum}}: |
| 199 return {{member.cpp_value_to_v8_value}}; | 191 return {{member.cpp_value_to_v8_value}}; |
| 200 {% endfor %} | 192 {% endfor %} |
| 201 default: | 193 default: |
| 202 ASSERT_NOT_REACHED(); | 194 NOTREACHED(); |
| 203 } | 195 } |
| 204 return v8::Local<v8::Value>(); | 196 return v8::Local<v8::Value>(); |
| 205 } | 197 } |
| 206 | 198 |
| 207 {{cpp_class}} NativeValueTraits<{{cpp_class}}>::nativeValue(v8::Isolate* isolate
, v8::Local<v8::Value> value, ExceptionState& exceptionState) | 199 {{cpp_class}} NativeValueTraits<{{cpp_class}}>::nativeValue(v8::Isolate* isolate
, v8::Local<v8::Value> value, ExceptionState& exceptionState) { |
| 208 { | 200 {{cpp_class}} impl; |
| 209 {{cpp_class}} impl; | 201 {{v8_class}}::toImpl(isolate, value, impl, UnionTypeConversionMode::NotNullabl
e, exceptionState); |
| 210 {{v8_class}}::toImpl(isolate, value, impl, UnionTypeConversionMode::NotNulla
ble, exceptionState); | 202 return impl; |
| 211 return impl; | |
| 212 } | 203 } |
| 213 | 204 |
| 214 } // namespace blink | 205 } // namespace blink |
| 215 | 206 |
| 216 {% endfilter %}{# format_blink_cpp_source_code #} | 207 {% endfilter %}{# format_blink_cpp_source_code #} |
| OLD | NEW |