OLD | NEW |
1 {% from 'utilities.cpp' import declare_enum_validation_variable %} | 1 {% from 'utilities.cpp' import declare_enum_validation_variable %} |
2 {% include 'copyright_block.txt' %} | 2 {% include 'copyright_block.txt' %} |
3 #include "{{this_include_header_name}}.h" | 3 #include "{{this_include_header_name}}.h" |
4 | 4 |
5 {% from 'utilities.cpp' import v8_value_to_local_cpp_value %} | 5 {% from 'utilities.cpp' import v8_value_to_local_cpp_value %} |
6 {% macro assign_and_return_if_hasinstance(member) %} | 6 {% macro assign_and_return_if_hasinstance(member) %} |
7 if (V8{{member.type_name}}::hasInstance(v8Value, isolate)) { | 7 if (V8{{member.type_name}}::hasInstance(v8Value, isolate)) { |
8 {{member.cpp_local_type}} cppValue = V8{{member.type_name}}::toImpl(v8::Loca
l<v8::Object>::Cast(v8Value)); | 8 {{member.cpp_local_type}} cppValue = V8{{member.type_name}}::toImpl(v8::Loca
l<v8::Object>::Cast(v8Value)); |
9 impl.set{{member.type_name}}(cppValue); | 9 impl.set{{member.type_name}}(cppValue); |
10 return; | 10 return; |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
66 { | 66 { |
67 if (v8Value.IsEmpty()) | 67 if (v8Value.IsEmpty()) |
68 return; | 68 return; |
69 | 69 |
70 {# The numbers in the following comments refer to the steps described in | 70 {# The numbers in the following comments refer to the steps described in |
71 http://heycam.github.io/webidl/#es-union #} | 71 http://heycam.github.io/webidl/#es-union #} |
72 {# 1. null or undefined #} | 72 {# 1. null or undefined #} |
73 if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull
(v8Value)) | 73 if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull
(v8Value)) |
74 return; | 74 return; |
75 | 75 |
76 {# 3. Platform objects (interfaces) #} | 76 {% if dictionary_type %} |
| 77 {# 3. Dictionaries for null or undefined #} |
| 78 if (isUndefinedOrNull(v8Value)) { |
| 79 {{v8_value_to_local_cpp_value(dictionary_type) | indent(8)}} |
| 80 impl.set{{dictionary_type.type_name}}(cppValue); |
| 81 return; |
| 82 } |
| 83 |
| 84 {% endif %} |
| 85 {# 4. Platform objects (interfaces) #} |
77 {% for interface in interface_types %} | 86 {% for interface in interface_types %} |
78 {{assign_and_return_if_hasinstance(interface) | indent}} | 87 {{assign_and_return_if_hasinstance(interface) | indent}} |
79 | 88 |
80 {% endfor %} | 89 {% endfor %} |
81 {# 8. ArrayBuffer #} | 90 {# 8. ArrayBuffer #} |
82 {% if array_buffer_type %} | 91 {% if array_buffer_type %} |
83 {{assign_and_return_if_hasinstance(array_buffer_type) | indent}} | 92 {{assign_and_return_if_hasinstance(array_buffer_type) | indent}} |
84 | 93 |
85 {% endif %} | 94 {% endif %} |
86 {# 9., 10. ArrayBufferView #} | 95 {# 9., 10. ArrayBufferView #} |
87 {# FIXME: Individual typed arrays (e.g. Uint8Array) aren't supported yet. #} | 96 {# FIXME: Individual typed arrays (e.g. Uint8Array) aren't supported yet. #} |
88 {% if array_buffer_view_type %} | 97 {% if array_buffer_view_type %} |
89 {{assign_and_return_if_hasinstance(array_buffer_view_type) | indent}} | 98 {{assign_and_return_if_hasinstance(array_buffer_view_type) | indent}} |
90 | 99 |
91 {% endif %} | 100 {% endif %} |
92 {% if dictionary_type %} | 101 {% if array_or_sequence_type %} |
93 {# 12. Dictionaries #} | 102 {# 12.1, 12.2. Arrays and Sequences #} |
94 {# FIXME: This should also check "object but not Date or RegExp". Add checks | 103 {# FIXME: This should also check "object but not RegExp". Add checks |
95 when we implement conversions for Date and RegExp. #} | 104 when we implement conversions for Date and RegExp. #} |
96 {# TODO(bashi): The spec doesn't say we should check !IsArray() but otherwis
e | 105 {# TODO(bashi): Should check @@iterator symbol instead. #} |
97 we can't distinguish a sequence<T> and a dictionary. | |
98 https://github.com/heycam/webidl/issues/123 #} | |
99 if (isUndefinedOrNull(v8Value) || (v8Value->IsObject() && !v8Value->IsArray(
))) { | |
100 {{v8_value_to_local_cpp_value(dictionary_type) | indent(8)}} | |
101 impl.set{{dictionary_type.type_name}}(cppValue); | |
102 return; | |
103 } | |
104 | |
105 {% endif %} | |
106 {% if array_or_sequence_type %} | |
107 {# 13.1, 13.2. Arrays and Sequences #} | |
108 {# FIXME: This should also check "object but not Date or RegExp". Add checks | |
109 when we implement conversions for Date and RegExp. #} | |
110 {# FIXME: Should check for sequences too, not just Array instances. #} | |
111 if (v8Value->IsArray()) { | 106 if (v8Value->IsArray()) { |
112 {{v8_value_to_local_cpp_value(array_or_sequence_type) | indent(8)}} | 107 {{v8_value_to_local_cpp_value(array_or_sequence_type) | indent(8)}} |
113 impl.set{{array_or_sequence_type.type_name}}(cppValue); | 108 impl.set{{array_or_sequence_type.type_name}}(cppValue); |
114 return; | 109 return; |
115 } | 110 } |
116 | 111 |
117 {% endif %} | 112 {% endif %} |
118 {# TODO(bashi): Support 13.3 Callback interface when we need it #} | 113 {% if dictionary_type %} |
119 {# 13.4. Objects #} | 114 {# 12.3. Dictionaries #} |
| 115 if (v8Value->IsObject()) { |
| 116 {{v8_value_to_local_cpp_value(dictionary_type) | indent(8)}} |
| 117 impl.set{{dictionary_type.type_name}}(cppValue); |
| 118 return; |
| 119 } |
| 120 |
| 121 {% endif %} |
| 122 {# TODO(bashi): Support 12.4 Callback interface when we need it #} |
| 123 {# 12.5. Objects #} |
120 {% if object_type %} | 124 {% if object_type %} |
121 if (isUndefinedOrNull(v8Value) || v8Value->IsObject()) { | 125 if (isUndefinedOrNull(v8Value) || v8Value->IsObject()) { |
122 {{v8_value_to_local_cpp_value(object_type) | indent(8)}} | 126 {{v8_value_to_local_cpp_value(object_type) | indent(8)}} |
123 impl.set{{object_type.type_name}}(cppValue); | 127 impl.set{{object_type.type_name}}(cppValue); |
124 return; | 128 return; |
125 } | 129 } |
126 | 130 |
127 {% endif %} | 131 {% endif %} |
128 {# FIXME: In some cases, we can omit boolean and numeric type checks because | 132 {# FIXME: In some cases, we can omit boolean and numeric type checks because |
129 we have fallback conversions. (step 17 and 18) #} | 133 we have fallback conversions. (step 16 and 17) #} |
130 {% if boolean_type %} | 134 {% if boolean_type %} |
131 {# 14. Boolean #} | 135 {# 13. Boolean #} |
132 if (v8Value->IsBoolean()) { | 136 if (v8Value->IsBoolean()) { |
133 impl.setBoolean(v8Value.As<v8::Boolean>()->Value()); | 137 impl.setBoolean(v8Value.As<v8::Boolean>()->Value()); |
134 return; | 138 return; |
135 } | 139 } |
136 | 140 |
137 {% endif %} | 141 {% endif %} |
138 {% if numeric_type %} | 142 {% if numeric_type %} |
139 {# 15. Number #} | 143 {# 14. Number #} |
140 if (v8Value->IsNumber()) { | 144 if (v8Value->IsNumber()) { |
141 {{v8_value_to_local_cpp_value(numeric_type) | indent(8)}} | 145 {{v8_value_to_local_cpp_value(numeric_type) | indent(8)}} |
142 impl.set{{numeric_type.type_name}}(cppValue); | 146 impl.set{{numeric_type.type_name}}(cppValue); |
143 return; | 147 return; |
144 } | 148 } |
145 | 149 |
146 {% endif %} | 150 {% endif %} |
147 {% if string_type %} | 151 {% if string_type %} |
148 {# 16. String #} | 152 {# 15. String #} |
149 { | 153 { |
150 {{v8_value_to_local_cpp_value(string_type) | indent(8)}} | 154 {{v8_value_to_local_cpp_value(string_type) | indent(8)}} |
151 {% if string_type.enum_values %} | 155 {% if string_type.enum_values %} |
152 {{declare_enum_validation_variable(string_type.enum_values) | indent(8)}
} | 156 {{declare_enum_validation_variable(string_type.enum_values) | indent(8)}
} |
153 if (!isValidEnum(cppValue, validValues, WTF_ARRAY_LENGTH(validValues), "
{{string_type.type_name}}", exceptionState)) | 157 if (!isValidEnum(cppValue, validValues, WTF_ARRAY_LENGTH(validValues), "
{{string_type.type_name}}", exceptionState)) |
154 return; | 158 return; |
155 {% endif %} | 159 {% endif %} |
156 impl.set{{string_type.type_name}}(cppValue); | 160 impl.set{{string_type.type_name}}(cppValue); |
157 return; | 161 return; |
158 } | 162 } |
159 | 163 |
160 {# 17. Number (fallback) #} | 164 {# 16. Number (fallback) #} |
161 {% elif numeric_type %} | 165 {% elif numeric_type %} |
162 { | 166 { |
163 {{v8_value_to_local_cpp_value(numeric_type) | indent(8)}} | 167 {{v8_value_to_local_cpp_value(numeric_type) | indent(8)}} |
164 impl.set{{numeric_type.type_name}}(cppValue); | 168 impl.set{{numeric_type.type_name}}(cppValue); |
165 return; | 169 return; |
166 } | 170 } |
167 | 171 |
168 {# 18. Boolean (fallback) #} | 172 {# 17. Boolean (fallback) #} |
169 {% elif boolean_type %} | 173 {% elif boolean_type %} |
170 { | 174 { |
171 impl.setBoolean(v8Value->BooleanValue()); | 175 impl.setBoolean(v8Value->BooleanValue()); |
172 return; | 176 return; |
173 } | 177 } |
174 | 178 |
175 {% else %} | 179 {% else %} |
176 {# 19. TypeError #} | 180 {# 18. TypeError #} |
177 exceptionState.throwTypeError("The provided value is not of type '{{type_str
ing}}'"); | 181 exceptionState.throwTypeError("The provided value is not of type '{{type_str
ing}}'"); |
178 {% endif %} | 182 {% endif %} |
179 } | 183 } |
180 | 184 |
181 v8::Local<v8::Value> toV8(const {{cpp_class}}& impl, v8::Local<v8::Object> creat
ionContext, v8::Isolate* isolate) | 185 v8::Local<v8::Value> toV8(const {{cpp_class}}& impl, v8::Local<v8::Object> creat
ionContext, v8::Isolate* isolate) |
182 { | 186 { |
183 switch (impl.m_type) { | 187 switch (impl.m_type) { |
184 case {{cpp_class}}::SpecificTypeNone: | 188 case {{cpp_class}}::SpecificTypeNone: |
185 {# FIXME: We might want to return undefined in some cases #} | 189 {# FIXME: We might want to return undefined in some cases #} |
186 return v8::Null(isolate); | 190 return v8::Null(isolate); |
187 {% for member in members %} | 191 {% for member in members %} |
188 case {{cpp_class}}::{{member.specific_type_enum}}: | 192 case {{cpp_class}}::{{member.specific_type_enum}}: |
189 return {{member.cpp_value_to_v8_value}}; | 193 return {{member.cpp_value_to_v8_value}}; |
190 {% endfor %} | 194 {% endfor %} |
191 default: | 195 default: |
192 ASSERT_NOT_REACHED(); | 196 ASSERT_NOT_REACHED(); |
193 } | 197 } |
194 return v8::Local<v8::Value>(); | 198 return v8::Local<v8::Value>(); |
195 } | 199 } |
196 | 200 |
197 {{cpp_class}} NativeValueTraits<{{cpp_class}}>::nativeValue(v8::Isolate* isolate
, v8::Local<v8::Value> value, ExceptionState& exceptionState) | 201 {{cpp_class}} NativeValueTraits<{{cpp_class}}>::nativeValue(v8::Isolate* isolate
, v8::Local<v8::Value> value, ExceptionState& exceptionState) |
198 { | 202 { |
199 {{cpp_class}} impl; | 203 {{cpp_class}} impl; |
200 {{v8_class}}::toImpl(isolate, value, impl, UnionTypeConversionMode::NotNulla
ble, exceptionState); | 204 {{v8_class}}::toImpl(isolate, value, impl, UnionTypeConversionMode::NotNulla
ble, exceptionState); |
201 return impl; | 205 return impl; |
202 } | 206 } |
203 | 207 |
204 } // namespace blink | 208 } // namespace blink |
OLD | NEW |