OLD | NEW |
1 # Copyright (C) 2013 Google Inc. All rights reserved. | 1 # Copyright (C) 2013 Google Inc. All rights reserved. |
2 # | 2 # |
3 # Redistribution and use in source and binary forms, with or without | 3 # Redistribution and use in source and binary forms, with or without |
4 # modification, are permitted provided that the following conditions are | 4 # modification, are permitted provided that the following conditions are |
5 # met: | 5 # met: |
6 # | 6 # |
7 # * Redistributions of source code must retain the above copyright | 7 # * Redistributions of source code must retain the above copyright |
8 # notice, this list of conditions and the following disclaimer. | 8 # notice, this list of conditions and the following disclaimer. |
9 # * Redistributions in binary form must reproduce the above | 9 # * Redistributions in binary form must reproduce the above |
10 # copyright notice, this list of conditions and the following disclaimer | 10 # copyright notice, this list of conditions and the following disclaimer |
(...skipping 20 matching lines...) Expand all Loading... |
31 Extends IdlType and IdlUnionType with C++-specific properties, methods, and | 31 Extends IdlType and IdlUnionType with C++-specific properties, methods, and |
32 class methods. | 32 class methods. |
33 | 33 |
34 Spec: | 34 Spec: |
35 http://www.w3.org/TR/WebIDL/#es-type-mapping | 35 http://www.w3.org/TR/WebIDL/#es-type-mapping |
36 | 36 |
37 Design doc: http://www.chromium.org/developers/design-documents/idl-compiler | 37 Design doc: http://www.chromium.org/developers/design-documents/idl-compiler |
38 """ | 38 """ |
39 | 39 |
40 import posixpath | 40 import posixpath |
41 from idl_types import IdlType, IdlUnionType, TYPE_NAMES | 41 from idl_types import IdlTypeBase, IdlType, IdlUnionType, TYPE_NAMES, IdlArrayOr
SequenceType |
| 42 |
42 import dart_attributes # for IdlType.constructor_type_name | 43 import dart_attributes # for IdlType.constructor_type_name |
43 from dart_utilities import DartUtilities | 44 from dart_utilities import DartUtilities |
44 from v8_globals import includes | 45 from v8_globals import includes |
45 | 46 |
46 | 47 |
47 ################################################################################ | 48 ################################################################################ |
48 # CPP -specific handling of IDL types for Dart:Blink | 49 # CPP -specific handling of IDL types for Dart:Blink |
49 ################################################################################ | 50 ################################################################################ |
50 | 51 |
51 NON_WRAPPER_TYPES = frozenset([ | 52 NON_WRAPPER_TYPES = frozenset([ |
(...skipping 13 matching lines...) Expand all Loading... |
65 'Float64Array': ('double', 'Float64List'), | 66 'Float64Array': ('double', 'Float64List'), |
66 'Int8Array': ('signed char', 'Int8List'), | 67 'Int8Array': ('signed char', 'Int8List'), |
67 'Int16Array': ('short', 'Int16List'), | 68 'Int16Array': ('short', 'Int16List'), |
68 'Int32Array': ('int', 'Int32List'), | 69 'Int32Array': ('int', 'Int32List'), |
69 'Uint8Array': ('unsigned char', 'Uint8List'), | 70 'Uint8Array': ('unsigned char', 'Uint8List'), |
70 'Uint8ClampedArray': ('unsigned char', 'Uint8ClampedList'), | 71 'Uint8ClampedArray': ('unsigned char', 'Uint8ClampedList'), |
71 'Uint16Array': ('unsigned short', 'Uint16List'), | 72 'Uint16Array': ('unsigned short', 'Uint16List'), |
72 'Uint32Array': ('unsigned int', 'Uint32List'), | 73 'Uint32Array': ('unsigned int', 'Uint32List'), |
73 } | 74 } |
74 | 75 |
75 IdlType.is_typed_array_type = property( | 76 |
| 77 IdlTypeBase.is_typed_array_type = property( |
76 lambda self: self.base_type in TYPED_ARRAYS) | 78 lambda self: self.base_type in TYPED_ARRAYS) |
77 | 79 |
78 | 80 |
79 IdlType.is_wrapper_type = property( | 81 IdlType.is_wrapper_type = property( |
80 lambda self: (self.is_interface_type and | 82 lambda self: (self.is_interface_type and |
81 self.base_type not in NON_WRAPPER_TYPES)) | 83 self.base_type not in NON_WRAPPER_TYPES)) |
82 | 84 |
83 | 85 |
84 ################################################################################ | 86 ################################################################################ |
85 # C++ types | 87 # C++ types |
(...skipping 25 matching lines...) Expand all Loading... |
111 'Promise': 'ScriptPromise', | 113 'Promise': 'ScriptPromise', |
112 'ScriptValue': 'ScriptValue', | 114 'ScriptValue': 'ScriptValue', |
113 # FIXME: Eliminate custom bindings for XPathNSResolver http://crbug.com/345
529 | 115 # FIXME: Eliminate custom bindings for XPathNSResolver http://crbug.com/345
529 |
114 'XPathNSResolver': 'RefPtrWillBeRawPtr<XPathNSResolver>', | 116 'XPathNSResolver': 'RefPtrWillBeRawPtr<XPathNSResolver>', |
115 'boolean': 'bool', | 117 'boolean': 'bool', |
116 'unrestricted double': 'double', | 118 'unrestricted double': 'double', |
117 'unrestricted float': 'float', | 119 'unrestricted float': 'float', |
118 } | 120 } |
119 | 121 |
120 | 122 |
121 def cpp_type(idl_type, extended_attributes=None, used_as_argument=False, used_in
_cpp_sequence=False): | 123 def cpp_type(idl_type, extended_attributes=None, raw_type=False, used_as_rvalue_
type=False, used_in_cpp_sequence=False): |
122 """Returns C++ type corresponding to IDL type. | 124 """Returns C++ type corresponding to IDL type. |
123 | 125 |
124 |idl_type| argument is of type IdlType, while return value is a string | 126 |idl_type| argument is of type IdlType, while return value is a string |
125 | 127 |
126 Args: | 128 Args: |
127 idl_type: | 129 idl_type: |
128 IdlType | 130 IdlType |
129 used_as_argument: | 131 raw_type: |
130 bool, True if idl_type's raw/primitive C++ type should be returned. | 132 bool, True if idl_type's raw/primitive C++ type should be returned. |
131 will_be_in_heap_object: | 133 used_as_rvalue_type: |
132 bool, True if idl_type will be part of a possibly heap allocated | 134 bool, True if the C++ type is used as an argument or the return |
133 object (e.g., appears as an element of a C++ heap vector type.) | 135 type of a method. |
134 The C++ type of an interface type changes, if so. | 136 used_as_variadic_argument: |
| 137 bool, True if the C++ type is used as a variadic argument of a metho
d. |
| 138 used_in_cpp_sequence: |
| 139 bool, True if the C++ type is used as an element of a container. |
| 140 Containers can be an array, a sequence or a dictionary. |
135 """ | 141 """ |
136 extended_attributes = extended_attributes or {} | 142 extended_attributes = extended_attributes or {} |
137 idl_type = idl_type.preprocessed_type | 143 idl_type = idl_type.preprocessed_type |
138 | 144 |
139 # Composite types | 145 # Composite types |
140 array_or_sequence_type = idl_type.array_or_sequence_type | 146 native_array_element_type = idl_type.native_array_element_type |
141 if array_or_sequence_type: | 147 if native_array_element_type: |
142 vector_type = cpp_ptr_type('Vector', 'HeapVector', array_or_sequence_typ
e.gc_type) | 148 vector_type = cpp_ptr_type('Vector', 'HeapVector', native_array_element_
type.gc_type) |
143 return cpp_template_type(vector_type, array_or_sequence_type.cpp_type_ar
gs(used_in_cpp_sequence=True)) | 149 return cpp_template_type(vector_type, native_array_element_type.cpp_type
_args(used_in_cpp_sequence=True)) |
144 | 150 |
145 # Simple types | 151 # Simple types |
146 base_idl_type = idl_type.base_type | 152 base_idl_type = idl_type.base_type |
147 | 153 |
148 if base_idl_type in CPP_TYPE_SAME_AS_IDL_TYPE: | 154 if base_idl_type in CPP_TYPE_SAME_AS_IDL_TYPE: |
149 return base_idl_type | 155 return base_idl_type |
150 if base_idl_type in CPP_INT_TYPES: | 156 if base_idl_type in CPP_INT_TYPES: |
151 return 'int' | 157 return 'int' |
152 if base_idl_type in CPP_UNSIGNED_TYPES: | 158 if base_idl_type in CPP_UNSIGNED_TYPES: |
153 return 'unsigned' | 159 return 'unsigned' |
154 if base_idl_type in CPP_SPECIAL_CONVERSION_RULES: | 160 if base_idl_type in CPP_SPECIAL_CONVERSION_RULES: |
155 return CPP_SPECIAL_CONVERSION_RULES[base_idl_type] | 161 return CPP_SPECIAL_CONVERSION_RULES[base_idl_type] |
156 | 162 |
157 if base_idl_type in NON_WRAPPER_TYPES: | 163 if base_idl_type in NON_WRAPPER_TYPES: |
158 return 'RefPtr<%s>' % base_idl_type | 164 return ('PassRefPtr<%s>' if used_as_rvalue_type else 'RefPtr<%s>') % bas
e_idl_type |
159 if base_idl_type in ('DOMString', 'ByteString', 'ScalarValueString'): | 165 if base_idl_type in ('DOMString', 'ByteString', 'ScalarValueString'): |
160 if not used_as_argument: | 166 if not raw_type: |
161 return 'String' | 167 return 'String' |
162 return 'DartStringAdapter' | 168 return 'DartStringAdapter' |
163 | 169 |
164 if idl_type.is_typed_array_type and used_as_argument: | 170 if idl_type.is_typed_array_type and raw_type: |
165 return 'RefPtr<%s>' % base_idl_type | 171 return 'RefPtr<%s>' % base_idl_type |
166 if idl_type.is_callback_interface: | 172 if idl_type.is_callback_interface: |
167 return 'OwnPtr<%s>' % base_idl_type | 173 return 'OwnPtr<%s>' % base_idl_type |
168 if idl_type.is_interface_type: | 174 if idl_type.is_interface_type: |
169 implemented_as_class = idl_type.implemented_as | 175 implemented_as_class = idl_type.implemented_as |
170 if used_as_argument: | 176 if raw_type: |
171 return implemented_as_class + '*' | 177 return implemented_as_class + '*' |
172 new_type = 'Member' if used_in_cpp_sequence else 'RawPtr' | 178 new_type = 'Member' if used_in_cpp_sequence else 'RawPtr' |
173 ptr_type = cpp_ptr_type('RefPtr', new_type, idl_type.gc_type) | 179 ptr_type = cpp_ptr_type(('PassRefPtr' if used_as_rvalue_type else 'RefPt
r'), new_type, idl_type.gc_type) |
174 return cpp_template_type(ptr_type, implemented_as_class) | 180 return cpp_template_type(ptr_type, implemented_as_class) |
175 | 181 |
176 # Default, assume native type is a pointer with same type name as idl type | 182 # Default, assume native type is a pointer with same type name as idl type |
177 return base_idl_type + '*' | 183 return base_idl_type + '*' |
178 | 184 |
179 | 185 |
180 def cpp_type_union(idl_type, extended_attributes=None, used_as_argument=False, w
ill_be_in_heap_object=False): | 186 def cpp_type_union(idl_type, extended_attributes=None, used_as_rvalue_type=False
, will_be_in_heap_object=False): |
181 return (member_type.cpp_type for member_type in idl_type.member_types) | 187 return (member_type.cpp_type for member_type in idl_type.member_types) |
182 | 188 |
| 189 |
183 # Allow access as idl_type.cpp_type if no arguments | 190 # Allow access as idl_type.cpp_type if no arguments |
184 IdlType.cpp_type = property(cpp_type) | 191 IdlTypeBase.cpp_type = property(cpp_type) |
| 192 IdlTypeBase.cpp_type_args = cpp_type |
185 IdlUnionType.cpp_type = property(cpp_type_union) | 193 IdlUnionType.cpp_type = property(cpp_type_union) |
186 IdlType.cpp_type_args = cpp_type | |
187 IdlUnionType.cpp_type_args = cpp_type_union | 194 IdlUnionType.cpp_type_args = cpp_type_union |
188 | 195 |
189 | 196 |
| 197 IdlTypeBase.native_array_element_type = None |
| 198 IdlArrayOrSequenceType.native_array_element_type = property( |
| 199 lambda self: self.element_type) |
| 200 |
| 201 |
190 def cpp_template_type(template, inner_type): | 202 def cpp_template_type(template, inner_type): |
191 """Returns C++ template specialized to type, with space added if needed.""" | 203 """Returns C++ template specialized to type, with space added if needed.""" |
192 if inner_type.endswith('>'): | 204 if inner_type.endswith('>'): |
193 format_string = '{template}<{inner_type} >' | 205 format_string = '{template}<{inner_type} >' |
194 else: | 206 else: |
195 format_string = '{template}<{inner_type}>' | 207 format_string = '{template}<{inner_type}>' |
196 return format_string.format(template=template, inner_type=inner_type) | 208 return format_string.format(template=template, inner_type=inner_type) |
197 | 209 |
198 | 210 |
199 def cpp_ptr_type(old_type, new_type, gc_type): | 211 def cpp_ptr_type(old_type, new_type, gc_type): |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
231 return IdlType.implemented_as_interfaces[base_idl_type] | 243 return IdlType.implemented_as_interfaces[base_idl_type] |
232 return base_idl_type | 244 return base_idl_type |
233 | 245 |
234 | 246 |
235 IdlType.implemented_as = property(implemented_as) | 247 IdlType.implemented_as = property(implemented_as) |
236 | 248 |
237 IdlType.set_implemented_as_interfaces = classmethod( | 249 IdlType.set_implemented_as_interfaces = classmethod( |
238 lambda cls, new_implemented_as_interfaces: | 250 lambda cls, new_implemented_as_interfaces: |
239 cls.implemented_as_interfaces.update(new_implemented_as_interfaces)) | 251 cls.implemented_as_interfaces.update(new_implemented_as_interfaces)) |
240 | 252 |
| 253 |
241 # [GarbageCollected] | 254 # [GarbageCollected] |
242 IdlType.garbage_collected_types = set() | 255 IdlType.garbage_collected_types = set() |
243 | 256 |
| 257 IdlTypeBase.is_garbage_collected = False |
244 IdlType.is_garbage_collected = property( | 258 IdlType.is_garbage_collected = property( |
245 lambda self: self.base_type in IdlType.garbage_collected_types) | 259 lambda self: self.base_type in IdlType.garbage_collected_types) |
246 | 260 |
247 IdlType.set_garbage_collected_types = classmethod( | 261 IdlType.set_garbage_collected_types = classmethod( |
248 lambda cls, new_garbage_collected_types: | 262 lambda cls, new_garbage_collected_types: |
249 cls.garbage_collected_types.update(new_garbage_collected_types)) | 263 cls.garbage_collected_types.update(new_garbage_collected_types)) |
250 | 264 |
251 | 265 |
252 # [WillBeGarbageCollected] | 266 # [WillBeGarbageCollected] |
253 IdlType.will_be_garbage_collected_types = set() | 267 IdlType.will_be_garbage_collected_types = set() |
254 | 268 |
| 269 IdlTypeBase.is_will_be_garbage_collected = False |
255 IdlType.is_will_be_garbage_collected = property( | 270 IdlType.is_will_be_garbage_collected = property( |
256 lambda self: self.base_type in IdlType.will_be_garbage_collected_types) | 271 lambda self: self.base_type in IdlType.will_be_garbage_collected_types) |
257 | 272 |
258 IdlType.set_will_be_garbage_collected_types = classmethod( | 273 IdlType.set_will_be_garbage_collected_types = classmethod( |
259 lambda cls, new_will_be_garbage_collected_types: | 274 lambda cls, new_will_be_garbage_collected_types: |
260 cls.will_be_garbage_collected_types.update(new_will_be_garbage_collected
_types)) | 275 cls.will_be_garbage_collected_types.update(new_will_be_garbage_collected
_types)) |
261 | 276 |
262 | 277 |
263 def gc_type(idl_type): | 278 def gc_type(idl_type): |
264 if idl_type.is_garbage_collected: | 279 if idl_type.is_garbage_collected: |
265 return 'GarbageCollectedObject' | 280 return 'GarbageCollectedObject' |
266 if idl_type.is_will_be_garbage_collected: | 281 if idl_type.is_will_be_garbage_collected: |
267 return 'WillBeGarbageCollectedObject' | 282 return 'WillBeGarbageCollectedObject' |
268 return 'RefCountedObject' | 283 return 'RefCountedObject' |
269 | 284 |
270 IdlType.gc_type = property(gc_type) | 285 IdlTypeBase.gc_type = property(gc_type) |
271 | 286 |
272 | 287 |
273 ################################################################################ | 288 ################################################################################ |
274 # Includes | 289 # Includes |
275 ################################################################################ | 290 ################################################################################ |
276 | 291 |
277 def includes_for_cpp_class(class_name, relative_dir_posix): | 292 def includes_for_cpp_class(class_name, relative_dir_posix): |
278 return set([posixpath.join('bindings', relative_dir_posix, class_name + '.h'
)]) | 293 return set([posixpath.join('bindings', relative_dir_posix, class_name + '.h'
)]) |
279 | 294 |
280 # TODO(terry): Will we need this group header for dart:blink? | 295 # TODO(terry): Will we need this group header for dart:blink? |
281 INCLUDES_FOR_TYPE = { | 296 INCLUDES_FOR_TYPE = { |
282 'object': set(), | 297 'object': set(), |
283 'CompareHow': set(), | 298 'CompareHow': set(), |
284 'Dictionary': set(['bindings/common/Dictionary.h']), | 299 'Dictionary': set(['bindings/core/v8/Dictionary.h']), |
285 'EventHandler': set(), | 300 'EventHandler': set(), |
286 'EventListener': set(), | 301 'EventListener': set(), |
287 'HTMLCollection': set(['bindings/core/dart/DartHTMLCollection.h', | 302 'HTMLCollection': set(['bindings/core/dart/DartHTMLCollection.h', |
288 'core/dom/ClassCollection.h', | 303 'core/dom/ClassCollection.h', |
289 'core/dom/TagCollection.h', | 304 'core/dom/TagCollection.h', |
290 'core/html/HTMLCollection.h', | 305 'core/html/HTMLCollection.h', |
291 'core/html/HTMLFormControlsCollection.h', | 306 'core/html/HTMLFormControlsCollection.h', |
292 'core/html/HTMLTableRowsCollection.h']), | 307 'core/html/HTMLTableRowsCollection.h']), |
293 'MediaQueryListListener': set(['core/css/MediaQueryListListener.h']), | 308 'MediaQueryListListener': set(['core/css/MediaQueryListListener.h']), |
294 'NodeList': set(['bindings/core/dart/DartNodeList.h', | 309 'NodeList': set(['bindings/core/dart/DartNodeList.h', |
295 'core/dom/NameNodeList.h', | 310 'core/dom/NameNodeList.h', |
296 'core/dom/NodeList.h', | 311 'core/dom/NodeList.h', |
297 'core/dom/StaticNodeList.h', | 312 'core/dom/StaticNodeList.h', |
298 'core/html/LabelsNodeList.h']), | 313 'core/html/LabelsNodeList.h']), |
299 'Promise': set(), | 314 'Promise': set(), |
300 'SerializedScriptValue': set(), | 315 'SerializedScriptValue': set(), |
301 'ScriptValue': set(['bindings/dart/DartScriptValue.h']), | 316 'ScriptValue': set(['bindings/core/dart/DartScriptValue.h']), |
302 } | 317 } |
303 | 318 |
304 | 319 |
305 def includes_for_type(idl_type): | 320 def includes_for_type(idl_type): |
306 idl_type = idl_type.preprocessed_type | 321 idl_type = idl_type.preprocessed_type |
307 | 322 |
308 # Composite types | 323 # Composite types |
309 array_or_sequence_type = idl_type.array_or_sequence_type | 324 if idl_type.native_array_element_type: |
310 if array_or_sequence_type: | 325 return includes_for_type(idl_type) |
311 return includes_for_type(array_or_sequence_type) | |
312 | 326 |
313 # Simple types | 327 # Simple types |
314 base_idl_type = idl_type.base_type | 328 base_idl_type = idl_type.base_type |
315 if base_idl_type in INCLUDES_FOR_TYPE: | 329 if base_idl_type in INCLUDES_FOR_TYPE: |
316 return INCLUDES_FOR_TYPE[base_idl_type] | 330 return INCLUDES_FOR_TYPE[base_idl_type] |
317 if idl_type.is_basic_type: | 331 if idl_type.is_basic_type: |
318 return set() | 332 return set() |
319 if idl_type.is_typed_array_type: | 333 if idl_type.is_typed_array_type: |
320 # Typed array factory methods are already provided by DartUtilities.h. | 334 # Typed array factory methods are already provided by DartUtilities.h. |
321 return set([]) | 335 return set([]) |
322 if base_idl_type.endswith('ConstructorConstructor'): | 336 if base_idl_type.endswith('ConstructorConstructor'): |
323 # FIXME: rename to NamedConstructor | 337 # FIXME: rename to NamedConstructor |
324 # FIXME: replace with a [NamedConstructorAttribute] extended attribute | 338 # FIXME: replace with a [NamedConstructorAttribute] extended attribute |
325 # Ending with 'ConstructorConstructor' indicates a named constructor, | 339 # Ending with 'ConstructorConstructor' indicates a named constructor, |
326 # and these do not have header files, as they are part of the generated | 340 # and these do not have header files, as they are part of the generated |
327 # bindings for the interface | 341 # bindings for the interface |
328 return set() | 342 return set() |
329 if base_idl_type.endswith('Constructor'): | 343 if base_idl_type.endswith('Constructor'): |
330 # FIXME: replace with a [ConstructorAttribute] extended attribute | 344 # FIXME: replace with a [ConstructorAttribute] extended attribute |
331 base_idl_type = idl_type.constructor_type_name | 345 base_idl_type = idl_type.constructor_type_name |
332 return set(['Dart%s.h' % base_idl_type]) | 346 if base_idl_type not in component_dir: |
| 347 return set() |
| 348 return set(['bindings/%s/dart/Dart%s.h' % (component_dir[base_idl_type], |
| 349 base_idl_type)]) |
333 | 350 |
334 IdlType.includes_for_type = property(includes_for_type) | 351 IdlType.includes_for_type = property(includes_for_type) |
335 IdlUnionType.includes_for_type = property( | 352 IdlUnionType.includes_for_type = property( |
336 lambda self: set.union(*[includes_for_type(member_type) | 353 lambda self: set.union(*[includes_for_type(member_type) |
337 for member_type in self.member_types])) | 354 for member_type in self.member_types])) |
338 | 355 |
339 | 356 |
340 def add_includes_for_type(idl_type): | 357 def add_includes_for_type(idl_type): |
341 includes.update(idl_type.includes_for_type) | 358 includes.update(idl_type.includes_for_type) |
342 | 359 |
343 IdlType.add_includes_for_type = add_includes_for_type | 360 IdlTypeBase.add_includes_for_type = add_includes_for_type |
344 IdlUnionType.add_includes_for_type = add_includes_for_type | 361 IdlUnionType.add_includes_for_type = add_includes_for_type |
345 | 362 |
346 | 363 |
347 def includes_for_interface(interface_name): | 364 def includes_for_interface(interface_name): |
348 return IdlType(interface_name).includes_for_type | 365 return IdlType(interface_name).includes_for_type |
349 | 366 |
350 | 367 |
351 def add_includes_for_interface(interface_name): | 368 def add_includes_for_interface(interface_name): |
352 includes.update(includes_for_interface(interface_name)) | 369 includes.update(includes_for_interface(interface_name)) |
353 | 370 |
354 | 371 |
| 372 component_dir = {} |
| 373 |
| 374 |
| 375 def set_component_dirs(new_component_dirs): |
| 376 component_dir.update(new_component_dirs) |
| 377 |
| 378 |
355 ################################################################################ | 379 ################################################################################ |
356 # Dart -> C++ | 380 # Dart -> C++ |
357 ################################################################################ | 381 ################################################################################ |
358 | 382 |
359 # TODO(terry): Need to fix to handle getter/setters for onEvent. | 383 # TODO(terry): Need to fix to handle getter/setters for onEvent. |
360 DART_FIX_ME = 'DART_UNIMPLEMENTED(/* Conversion unimplemented*/);' | 384 DART_FIX_ME = 'DART_UNIMPLEMENTED(/* Conversion unimplemented*/);' |
361 | 385 |
362 # For a given IDL type, the DartHandle to C++ conversion. | 386 # For a given IDL type, the DartHandle to C++ conversion. |
363 DART_TO_CPP_VALUE = { | 387 DART_TO_CPP_VALUE = { |
364 # Basic | 388 # Basic |
(...skipping 30 matching lines...) Expand all Loading... |
395 'XPathNSResolver': 'nullptr /* FIXME, DART_TO_CPP_VALUE[XPathNSResolver] */'
, | 419 'XPathNSResolver': 'nullptr /* FIXME, DART_TO_CPP_VALUE[XPathNSResolver] */'
, |
396 # FIXME(vsm): This is an enum type (defined in StorageQuota.idl). | 420 # FIXME(vsm): This is an enum type (defined in StorageQuota.idl). |
397 # We should handle it automatically, but map to a String for now. | 421 # We should handle it automatically, but map to a String for now. |
398 'StorageType': 'DartUtilities::dartToString(args, {index}, exception, {auto_
scope})', | 422 'StorageType': 'DartUtilities::dartToString(args, {index}, exception, {auto_
scope})', |
399 } | 423 } |
400 | 424 |
401 | 425 |
402 def dart_value_to_cpp_value(idl_type, interface_extended_attributes, extended_at
tributes, variable_name, | 426 def dart_value_to_cpp_value(idl_type, interface_extended_attributes, extended_at
tributes, variable_name, |
403 null_check, index, auto_scope=True): | 427 null_check, index, auto_scope=True): |
404 # Composite types | 428 # Composite types |
405 array_or_sequence_type = idl_type.array_or_sequence_type | 429 native_array_element_type = idl_type.native_array_element_type |
406 if array_or_sequence_type: | 430 if native_array_element_type: |
407 return dart_value_to_cpp_value_array_or_sequence(array_or_sequence_type,
variable_name, index) | 431 return dart_value_to_cpp_value_array_or_sequence(native_array_element_ty
pe, variable_name, index) |
408 | 432 |
409 # Simple types | 433 # Simple types |
410 idl_type = idl_type.preprocessed_type | 434 idl_type = idl_type.preprocessed_type |
411 add_includes_for_type(idl_type) | 435 add_includes_for_type(idl_type) |
412 base_idl_type = idl_type.base_type | 436 base_idl_type = idl_type.base_type |
413 | 437 |
414 if 'EnforceRange' in extended_attributes: | 438 if 'EnforceRange' in extended_attributes: |
415 arguments = ', '.join([variable_name, 'EnforceRange', 'exceptionState']) | 439 arguments = ', '.join([variable_name, 'EnforceRange', 'exceptionState']) |
416 elif idl_type.is_integer_type: # NormalConversion | 440 elif idl_type.is_integer_type: # NormalConversion |
417 arguments = ', '.join([variable_name, 'es']) | 441 arguments = ', '.join([variable_name, 'es']) |
(...skipping 19 matching lines...) Expand all Loading... |
437 # of this differently, and we may wish to reconsider this approach | 461 # of this differently, and we may wish to reconsider this approach |
438 null_check = 'WithNullCheck' \ | 462 null_check = 'WithNullCheck' \ |
439 if null_check or allow_null(idl_type, interface_extended_attributes, ext
ended_attributes) else '' | 463 if null_check or allow_null(idl_type, interface_extended_attributes, ext
ended_attributes) else '' |
440 return cpp_expression_format.format(null_check=null_check, | 464 return cpp_expression_format.format(null_check=null_check, |
441 arguments=arguments, | 465 arguments=arguments, |
442 index=index, | 466 index=index, |
443 idl_type=base_idl_type, | 467 idl_type=base_idl_type, |
444 auto_scope=DartUtilities.bool_to_cpp(aut
o_scope)) | 468 auto_scope=DartUtilities.bool_to_cpp(aut
o_scope)) |
445 | 469 |
446 | 470 |
447 def dart_value_to_cpp_value_array_or_sequence(array_or_sequence_type, variable_n
ame, index): | 471 def dart_value_to_cpp_value_array_or_sequence(native_array_element_type, variabl
e_name, index): |
448 # Index is None for setters, index (starting at 0) for method arguments, | 472 # Index is None for setters, index (starting at 0) for method arguments, |
449 # and is used to provide a human-readable exception message | 473 # and is used to provide a human-readable exception message |
450 | |
451 if index is None: | 474 if index is None: |
452 index = 0 # special case, meaning "setter" | 475 index = 0 # special case, meaning "setter" |
453 # else: | 476 # else: |
454 # index += 1 # human-readable index | 477 # index += 1 # human-readable index |
455 if (array_or_sequence_type.is_interface_type and | 478 if (native_array_element_type.is_interface_type and |
456 array_or_sequence_type.name != 'Dictionary'): | 479 native_array_element_type.name != 'Dictionary'): |
457 this_cpp_type = array_or_sequence_type.cpp_type | 480 this_cpp_type = None |
458 ref_ptr_type = 'Member' if array_or_sequence_type.is_will_be_garbage_col
lected else 'RefPtr' | 481 ref_ptr_type = cpp_ptr_type('RefPtr', 'Member', native_array_element_typ
e.gc_type) |
459 # FIXME(vsm): We're not using ref_ptr_type.... | 482 # FIXME(vsm): We're not using ref_ptr_type.... |
460 expression_format = 'DartUtilities::toNativeVector<{cpp_type} >(args, {i
ndex}, {variable_name}, exception)' | 483 expression_format = 'DartUtilities::toNativeVector<{cpp_type} >(args, {i
ndex}, {variable_name}, exception)' |
461 add_includes_for_type(array_or_sequence_type) | 484 add_includes_for_type(native_array_element_type) |
462 else: | 485 else: |
463 ref_ptr_type = None | 486 ref_ptr_type = None |
464 this_cpp_type = array_or_sequence_type.cpp_type | 487 this_cpp_type = native_array_element_type.cpp_type |
465 expression_format = 'DartUtilities::toNativeVector<{cpp_type}>(args, {in
dex}, {variable_name}, exception)' | 488 expression_format = 'DartUtilities::toNativeVector<{cpp_type}>(args, {in
dex}, {variable_name}, exception)' |
466 expression = expression_format.format(array_or_sequence_type=array_or_sequen
ce_type.name, | 489 |
| 490 expression = expression_format.format(native_array_element_type=native_array
_element_type.name, |
467 cpp_type=this_cpp_type, index=index, r
ef_ptr_type=ref_ptr_type, | 491 cpp_type=this_cpp_type, index=index, r
ef_ptr_type=ref_ptr_type, |
468 variable_name=variable_name) | 492 variable_name=variable_name) |
469 return expression | 493 return expression |
470 | 494 |
471 | |
472 def dart_value_to_local_cpp_value(idl_type, interface_extended_attributes, exten
ded_attributes, | 495 def dart_value_to_local_cpp_value(idl_type, interface_extended_attributes, exten
ded_attributes, |
473 variable_name, null_check, index=None, auto_sc
ope=True): | 496 variable_name, null_check, index=None, auto_sc
ope=True): |
474 """Returns an expression that converts a Dart value to a C++ value as a loca
l value.""" | 497 """Returns an expression that converts a Dart value to a C++ value as a loca
l value.""" |
475 idl_type = idl_type.preprocessed_type | 498 idl_type = idl_type.preprocessed_type |
476 | 499 |
477 cpp_value = dart_value_to_cpp_value( | 500 cpp_value = dart_value_to_cpp_value( |
478 idl_type, interface_extended_attributes, extended_attributes, | 501 idl_type, interface_extended_attributes, extended_attributes, |
479 variable_name, null_check, index, auto_scope) | 502 variable_name, null_check, index, auto_scope) |
480 | 503 |
481 return cpp_value | 504 return cpp_value |
482 | 505 |
483 IdlType.dart_value_to_local_cpp_value = dart_value_to_local_cpp_value | 506 IdlTypeBase.dart_value_to_local_cpp_value = dart_value_to_local_cpp_value |
484 IdlUnionType.dart_value_to_local_cpp_value = dart_value_to_local_cpp_value | 507 #IdlUnionType.dart_value_to_local_cpp_value = dart_value_to_local_cpp_value |
485 | 508 |
486 | 509 |
487 # Insure that we don't use C++ reserved names. Today on default is a problem. | 510 # Insure that we don't use C++ reserved names. Today on default is a problem. |
488 def check_reserved_name(name): | 511 def check_reserved_name(name): |
489 return 'default_value' if (name == 'default') else name | 512 return 'default_value' if (name == 'default') else name |
490 | 513 |
491 | 514 |
492 ################################################################################ | 515 ################################################################################ |
493 # C++ -> V8 | 516 # C++ -> V8 |
494 ################################################################################ | 517 ################################################################################ |
495 | 518 |
496 def preprocess_idl_type(idl_type): | 519 def preprocess_idl_type(idl_type): |
497 if idl_type.is_enum: | 520 if idl_type.is_enum: |
498 # Enumerations are internally DOMStrings | 521 # Enumerations are internally DOMStrings |
499 return IdlType('DOMString') | 522 return IdlType('DOMString') |
500 if (idl_type.name == 'Any' or idl_type.is_callback_function): | 523 if (idl_type.name == 'Any' or idl_type.is_callback_function): |
501 return IdlType('ScriptValue') | 524 return IdlType('ScriptValue') |
502 return idl_type | 525 return idl_type |
503 | 526 |
504 IdlType.preprocessed_type = property(preprocess_idl_type) | 527 IdlTypeBase.preprocessed_type = property(preprocess_idl_type) |
505 IdlUnionType.preprocessed_type = property(preprocess_idl_type) | 528 IdlUnionType.preprocessed_type = property(preprocess_idl_type) |
506 | 529 |
507 | 530 |
508 def preprocess_idl_type_and_value(idl_type, cpp_value, extended_attributes): | 531 def preprocess_idl_type_and_value(idl_type, cpp_value, extended_attributes): |
509 """Returns IDL type and value, with preliminary type conversions applied.""" | 532 """Returns IDL type and value, with preliminary type conversions applied.""" |
510 idl_type = idl_type.preprocessed_type | 533 idl_type = idl_type.preprocessed_type |
511 if idl_type.name == 'Promise': | 534 if idl_type.name == 'Promise': |
512 idl_type = IdlType('ScriptValue') | 535 idl_type = IdlType('ScriptValue') |
513 # FIXME(vsm): V8 maps 'long long' and 'unsigned long long' to double | 536 # FIXME(vsm): V8 maps 'long long' and 'unsigned long long' to double |
514 # as they are not representable in ECMAScript. Should we do the same? | 537 # as they are not representable in ECMAScript. Should we do the same? |
(...skipping 13 matching lines...) Expand all Loading... |
528 def dart_conversion_type(idl_type, extended_attributes): | 551 def dart_conversion_type(idl_type, extended_attributes): |
529 """Returns Dart conversion type, adding any additional includes. | 552 """Returns Dart conversion type, adding any additional includes. |
530 | 553 |
531 The Dart conversion type is used to select the C++ -> Dart conversion functi
on | 554 The Dart conversion type is used to select the C++ -> Dart conversion functi
on |
532 or setDart*ReturnValue function; it can be an idl_type, a cpp_type, or a | 555 or setDart*ReturnValue function; it can be an idl_type, a cpp_type, or a |
533 separate name for the type of conversion (e.g., 'DOMWrapper'). | 556 separate name for the type of conversion (e.g., 'DOMWrapper'). |
534 """ | 557 """ |
535 extended_attributes = extended_attributes or {} | 558 extended_attributes = extended_attributes or {} |
536 | 559 |
537 # Composite types | 560 # Composite types |
538 array_or_sequence_type = idl_type.array_or_sequence_type | 561 native_array_element_type = idl_type.native_array_element_type |
539 if array_or_sequence_type: | 562 if native_array_element_type: |
540 if array_or_sequence_type.is_interface_type: | 563 if native_array_element_type.is_interface_type: |
541 add_includes_for_type(array_or_sequence_type) | 564 add_includes_for_type(native_array_element_type) |
542 return 'array' | 565 return 'array' |
543 | 566 |
544 # Simple types | 567 # Simple types |
545 base_idl_type = idl_type.base_type | 568 base_idl_type = idl_type.base_type |
546 # Basic types, without additional includes | 569 # Basic types, without additional includes |
547 if base_idl_type in CPP_INT_TYPES or base_idl_type == 'long long': | 570 if base_idl_type in CPP_INT_TYPES or base_idl_type == 'long long': |
548 return 'int' | 571 return 'int' |
549 if base_idl_type in CPP_UNSIGNED_TYPES or base_idl_type == 'unsigned long lo
ng': | 572 if base_idl_type in CPP_UNSIGNED_TYPES or base_idl_type == 'unsigned long lo
ng': |
550 return 'unsigned' | 573 return 'unsigned' |
551 if base_idl_type == 'DOMString': | 574 if base_idl_type == 'DOMString': |
(...skipping 16 matching lines...) Expand all Loading... |
568 # Typed arrays don't have special Dart* classes for Dart. | 591 # Typed arrays don't have special Dart* classes for Dart. |
569 if idl_type.is_typed_array_type: | 592 if idl_type.is_typed_array_type: |
570 if base_idl_type == 'ArrayBuffer': | 593 if base_idl_type == 'ArrayBuffer': |
571 return 'ArrayBuffer' | 594 return 'ArrayBuffer' |
572 else: | 595 else: |
573 return 'TypedList' | 596 return 'TypedList' |
574 | 597 |
575 # Pointer type | 598 # Pointer type |
576 return 'DOMWrapper' | 599 return 'DOMWrapper' |
577 | 600 |
578 IdlType.dart_conversion_type = dart_conversion_type | 601 IdlTypeBase.dart_conversion_type = dart_conversion_type |
579 | 602 |
580 | 603 |
581 DART_SET_RETURN_VALUE = { | 604 DART_SET_RETURN_VALUE = { |
582 'boolean': 'Dart_SetBooleanReturnValue(args, {cpp_value})', | 605 'boolean': 'Dart_SetBooleanReturnValue(args, {cpp_value})', |
583 'int': 'DartUtilities::setDartIntegerReturnValue(args, {cpp_value})', | 606 'int': 'DartUtilities::setDartIntegerReturnValue(args, {cpp_value})', |
584 'unsigned': 'DartUtilities::setDartUnsignedLongLongReturnValue(args, {cpp_va
lue})', | 607 'unsigned': 'DartUtilities::setDartUnsignedLongLongReturnValue(args, {cpp_va
lue})', |
585 'DOMString': 'DartUtilities::setDartStringReturnValue(args, {cpp_value}, {au
to_scope})', | 608 'DOMString': 'DartUtilities::setDartStringReturnValue(args, {cpp_value}, {au
to_scope})', |
586 # FIXME(terry): Need to handle checking to byte values > 255 throwing except
ion. | 609 # FIXME(terry): Need to handle checking to byte values > 255 throwing except
ion. |
587 'ByteString': 'DartUtilities::setDartByteStringReturnValue(args, {cpp_value}
, {auto_scope})', | 610 'ByteString': 'DartUtilities::setDartByteStringReturnValue(args, {cpp_value}
, {auto_scope})', |
588 # FIXME(terry): Need to make valid unicode; match UTF-16 to U+FFFD REPLACEM
ENT CHARACTER. | 611 # FIXME(terry): Need to make valid unicode; match UTF-16 to U+FFFD REPLACEM
ENT CHARACTER. |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
635 this_dart_conversion_type = idl_type.dart_conversion_type(extended_attribute
s) | 658 this_dart_conversion_type = idl_type.dart_conversion_type(extended_attribute
s) |
636 # SetReturn-specific overrides | 659 # SetReturn-specific overrides |
637 if this_dart_conversion_type in ['Date', 'EventHandler', 'ScriptValue', 'Ser
ializedScriptValue', 'array']: | 660 if this_dart_conversion_type in ['Date', 'EventHandler', 'ScriptValue', 'Ser
ializedScriptValue', 'array']: |
638 # Convert value to Dart and then use general Dart_SetReturnValue | 661 # Convert value to Dart and then use general Dart_SetReturnValue |
639 # FIXME(vsm): Why do we differ from V8 here? It doesn't have a | 662 # FIXME(vsm): Why do we differ from V8 here? It doesn't have a |
640 # creation_context. | 663 # creation_context. |
641 creation_context = '' | 664 creation_context = '' |
642 if this_dart_conversion_type == 'array': | 665 if this_dart_conversion_type == 'array': |
643 # FIXME: This is not right if the base type is a primitive, DOMStrin
g, etc. | 666 # FIXME: This is not right if the base type is a primitive, DOMStrin
g, etc. |
644 # What is the right check for base type? | 667 # What is the right check for base type? |
645 if idl_type.base_type not in DART_TO_CPP_VALUE: | 668 base_type = str(idl_type.element_type) |
646 creation_context = '<Dart%s>' % idl_type.base_type | 669 if base_type not in DART_TO_CPP_VALUE: |
| 670 if base_type == 'None': |
| 671 raise Exception('Unknown base type for ' + str(idl_type)) |
| 672 creation_context = '<Dart%s>' % base_type |
| 673 if idl_type.is_nullable: |
| 674 creation_context = 'Nullable' + creation_context |
647 | 675 |
648 cpp_value = idl_type.cpp_value_to_dart_value(cpp_value, creation_context
=creation_context, | 676 cpp_value = idl_type.cpp_value_to_dart_value(cpp_value, creation_context
=creation_context, |
649 extended_attributes=extende
d_attributes) | 677 extended_attributes=extende
d_attributes) |
650 if this_dart_conversion_type == 'DOMWrapper': | 678 if this_dart_conversion_type == 'DOMWrapper': |
651 this_dart_conversion_type = dom_wrapper_conversion_type() | 679 this_dart_conversion_type = dom_wrapper_conversion_type() |
652 | 680 |
653 format_string = DART_SET_RETURN_VALUE[this_dart_conversion_type] | 681 format_string = DART_SET_RETURN_VALUE[this_dart_conversion_type] |
654 | 682 |
655 if release: | 683 if release: |
656 cpp_value = '%s.release()' % cpp_value | 684 cpp_value = '%s.release()' % cpp_value |
(...skipping 16 matching lines...) Expand all Loading... |
673 # FIXME(vsm): Why do we use 'result' instead of cpp_value as V8? | 701 # FIXME(vsm): Why do we use 'result' instead of cpp_value as V8? |
674 member_type.dart_set_return_value('result' + str(i), | 702 member_type.dart_set_return_value('result' + str(i), |
675 extended_attributes, | 703 extended_attributes, |
676 script_wrappable, | 704 script_wrappable, |
677 release and release[i], | 705 release and release[i], |
678 for_main_world, | 706 for_main_world, |
679 auto_scope) | 707 auto_scope) |
680 for i, member_type in | 708 for i, member_type in |
681 enumerate(idl_type.member_types)] | 709 enumerate(idl_type.member_types)] |
682 | 710 |
683 IdlType.dart_set_return_value = dart_set_return_value | 711 IdlTypeBase.dart_set_return_value = dart_set_return_value |
684 IdlUnionType.dart_set_return_value = dart_set_return_value_union | 712 IdlUnionType.dart_set_return_value = dart_set_return_value_union |
685 | 713 |
686 IdlType.release = property(lambda self: self.is_interface_type) | 714 IdlType.release = property(lambda self: self.is_interface_type) |
687 IdlUnionType.release = property( | 715 IdlUnionType.release = property( |
688 lambda self: [member_type.is_interface_type | 716 lambda self: [member_type.is_interface_type |
689 for member_type in self.member_types]) | 717 for member_type in self.member_types]) |
690 | 718 |
691 | 719 |
692 CPP_VALUE_TO_DART_VALUE = { | 720 CPP_VALUE_TO_DART_VALUE = { |
693 # Built-in types | 721 # Built-in types |
(...skipping 24 matching lines...) Expand all Loading... |
718 """Returns an expression that converts a C++ value to a Dart value.""" | 746 """Returns an expression that converts a C++ value to a Dart value.""" |
719 # the isolate parameter is needed for callback interfaces | 747 # the isolate parameter is needed for callback interfaces |
720 idl_type, cpp_value = preprocess_idl_type_and_value(idl_type, cpp_value, ext
ended_attributes) | 748 idl_type, cpp_value = preprocess_idl_type_and_value(idl_type, cpp_value, ext
ended_attributes) |
721 this_dart_conversion_type = idl_type.dart_conversion_type(extended_attribute
s) | 749 this_dart_conversion_type = idl_type.dart_conversion_type(extended_attribute
s) |
722 format_string = CPP_VALUE_TO_DART_VALUE[this_dart_conversion_type] | 750 format_string = CPP_VALUE_TO_DART_VALUE[this_dart_conversion_type] |
723 statement = format_string.format( | 751 statement = format_string.format( |
724 cpp_value=cpp_value, creation_context=creation_context, | 752 cpp_value=cpp_value, creation_context=creation_context, |
725 idl_type=idl_type.base_type) | 753 idl_type=idl_type.base_type) |
726 return statement | 754 return statement |
727 | 755 |
728 IdlType.cpp_value_to_dart_value = cpp_value_to_dart_value | 756 IdlTypeBase.cpp_value_to_dart_value = cpp_value_to_dart_value |
729 | 757 |
730 | 758 |
731 # Override idl_type.name to not suffix orNull to the name, in Dart we always | 759 # Override idl_type.name to not suffix orNull to the name, in Dart we always |
732 # test for null e.g., | 760 # test for null e.g., |
733 # | 761 # |
734 # bool isNull = false; | 762 # bool isNull = false; |
735 # TYPE* result = receiver->GETTER(isNull); | 763 # TYPE* result = receiver->GETTER(isNull); |
736 # if (isNull) | 764 # if (isNull) |
737 # return; | 765 # return; |
738 # | 766 # |
739 def dart_name(idl_type): | 767 def dart_name(idl_type): |
740 """Return type name. | 768 """Return type name. |
741 | 769 |
742 http://heycam.github.io/webidl/#dfn-type-name | 770 http://heycam.github.io/webidl/#dfn-type-name |
743 """ | 771 """ |
744 base_type = idl_type.base_type | 772 base_type = idl_type.base_type |
745 base_type_name = TYPE_NAMES.get(base_type, base_type) | 773 base_type_name = TYPE_NAMES.get(base_type, base_type) |
746 if idl_type.is_array: | 774 if idl_type.native_array_element_type: |
747 return base_type_name + 'Array' | 775 return idl_type.inner_name() |
748 if idl_type.is_sequence: | |
749 return base_type_name + 'Sequence' | |
750 return base_type_name | 776 return base_type_name |
751 | 777 |
752 IdlType.name = property(dart_name) | 778 IdlType.name = property(dart_name) |
753 IdlUnionType.name = property(dart_name) | 779 IdlUnionType.name = property(dart_name) |
754 | 780 |
755 | 781 |
756 def typechecked_interface(extended_attributes): | 782 def typechecked_interface(extended_attributes): |
757 return ('TypeChecking' in extended_attributes and\ | 783 return ('TypeChecking' in extended_attributes and\ |
758 DartUtilities.extended_attribute_value_contains(extended_attributes[
'TypeChecking'], 'Interface')) | 784 DartUtilities.extended_attribute_value_contains(extended_attributes[
'TypeChecking'], 'Interface')) |
759 | 785 |
(...skipping 26 matching lines...) Expand all Loading... |
786 else: | 812 else: |
787 # This logic is implemented in the methods.cpp template in V8 | 813 # This logic is implemented in the methods.cpp template in V8 |
788 if (idl_type.is_nullable or | 814 if (idl_type.is_nullable or |
789 (not typechecked_argument(idl_type, interface_extended_attributes, ex
tended_attributes))): | 815 (not typechecked_argument(idl_type, interface_extended_attributes, ex
tended_attributes))): |
790 return True | 816 return True |
791 | 817 |
792 if extended_attributes.get('Default') == 'Undefined': | 818 if extended_attributes.get('Default') == 'Undefined': |
793 return True | 819 return True |
794 | 820 |
795 return False | 821 return False |
OLD | NEW |