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 21 matching lines...) Expand all Loading... |
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 | 41 |
42 from idl_types import IdlTypeBase, IdlType, IdlUnionType, IdlArrayOrSequenceType | 42 from idl_types import IdlTypeBase, IdlType, IdlUnionType, IdlArrayOrSequenceType
, IdlNullableType |
43 import v8_attributes # for IdlType.constructor_type_name | 43 import v8_attributes # for IdlType.constructor_type_name |
44 from v8_globals import includes | 44 from v8_globals import includes |
45 | 45 |
46 | 46 |
47 ################################################################################ | 47 ################################################################################ |
48 # V8-specific handling of IDL types | 48 # V8-specific handling of IDL types |
49 ################################################################################ | 49 ################################################################################ |
50 | 50 |
51 NON_WRAPPER_TYPES = frozenset([ | 51 NON_WRAPPER_TYPES = frozenset([ |
52 'CompareHow', | 52 'CompareHow', |
(...skipping 12 matching lines...) Expand all Loading... |
65 'Float64Array': ('double', 'v8::kExternalDoubleArray'), | 65 'Float64Array': ('double', 'v8::kExternalDoubleArray'), |
66 'Int8Array': ('signed char', 'v8::kExternalByteArray'), | 66 'Int8Array': ('signed char', 'v8::kExternalByteArray'), |
67 'Int16Array': ('short', 'v8::kExternalShortArray'), | 67 'Int16Array': ('short', 'v8::kExternalShortArray'), |
68 'Int32Array': ('int', 'v8::kExternalIntArray'), | 68 'Int32Array': ('int', 'v8::kExternalIntArray'), |
69 'Uint8Array': ('unsigned char', 'v8::kExternalUnsignedByteArray'), | 69 'Uint8Array': ('unsigned char', 'v8::kExternalUnsignedByteArray'), |
70 'Uint8ClampedArray': ('unsigned char', 'v8::kExternalPixelArray'), | 70 'Uint8ClampedArray': ('unsigned char', 'v8::kExternalPixelArray'), |
71 'Uint16Array': ('unsigned short', 'v8::kExternalUnsignedShortArray'), | 71 'Uint16Array': ('unsigned short', 'v8::kExternalUnsignedShortArray'), |
72 'Uint32Array': ('unsigned int', 'v8::kExternalUnsignedIntArray'), | 72 'Uint32Array': ('unsigned int', 'v8::kExternalUnsignedIntArray'), |
73 } | 73 } |
74 | 74 |
75 IdlTypeBase.is_typed_array_element_type = False | |
76 IdlType.is_typed_array_element_type = property( | 75 IdlType.is_typed_array_element_type = property( |
77 lambda self: self.base_type in TYPED_ARRAYS) | 76 lambda self: self.base_type in TYPED_ARRAYS) |
78 | 77 |
79 | |
80 IdlTypeBase.is_wrapper_type = False | |
81 IdlType.is_wrapper_type = property( | 78 IdlType.is_wrapper_type = property( |
82 lambda self: (self.is_interface_type and | 79 lambda self: (self.is_interface_type and |
83 self.base_type not in NON_WRAPPER_TYPES)) | 80 self.base_type not in NON_WRAPPER_TYPES)) |
84 | 81 |
85 | 82 |
86 ################################################################################ | 83 ################################################################################ |
87 # C++ types | 84 # C++ types |
88 ################################################################################ | 85 ################################################################################ |
89 | 86 |
90 CPP_TYPE_SAME_AS_IDL_TYPE = set([ | 87 CPP_TYPE_SAME_AS_IDL_TYPE = set([ |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
232 | 229 |
233 # Allow access as idl_type.cpp_type if no arguments | 230 # Allow access as idl_type.cpp_type if no arguments |
234 IdlTypeBase.cpp_type = property(cpp_type) | 231 IdlTypeBase.cpp_type = property(cpp_type) |
235 IdlTypeBase.cpp_type_initializer = property(cpp_type_initializer) | 232 IdlTypeBase.cpp_type_initializer = property(cpp_type_initializer) |
236 IdlTypeBase.cpp_type_args = cpp_type | 233 IdlTypeBase.cpp_type_args = cpp_type |
237 IdlUnionType.cpp_type = property(cpp_type_union) | 234 IdlUnionType.cpp_type = property(cpp_type_union) |
238 IdlUnionType.cpp_type_initializer = property(cpp_type_initializer_union) | 235 IdlUnionType.cpp_type_initializer = property(cpp_type_initializer_union) |
239 IdlUnionType.cpp_type_args = cpp_type_union | 236 IdlUnionType.cpp_type_args = cpp_type_union |
240 | 237 |
241 | 238 |
242 IdlTypeBase.native_array_element_type = None | |
243 IdlArrayOrSequenceType.native_array_element_type = property( | 239 IdlArrayOrSequenceType.native_array_element_type = property( |
244 lambda self: self.element_type) | 240 lambda self: self.element_type) |
245 | 241 |
246 | 242 |
247 def cpp_template_type(template, inner_type): | 243 def cpp_template_type(template, inner_type): |
248 """Returns C++ template specialized to type, with space added if needed.""" | 244 """Returns C++ template specialized to type, with space added if needed.""" |
249 if inner_type.endswith('>'): | 245 if inner_type.endswith('>'): |
250 format_string = '{template}<{inner_type} >' | 246 format_string = '{template}<{inner_type} >' |
251 else: | 247 else: |
252 format_string = '{template}<{inner_type}>' | 248 format_string = '{template}<{inner_type}>' |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
288 IdlType.implemented_as = property(implemented_as) | 284 IdlType.implemented_as = property(implemented_as) |
289 | 285 |
290 IdlType.set_implemented_as_interfaces = classmethod( | 286 IdlType.set_implemented_as_interfaces = classmethod( |
291 lambda cls, new_implemented_as_interfaces: | 287 lambda cls, new_implemented_as_interfaces: |
292 cls.implemented_as_interfaces.update(new_implemented_as_interfaces)) | 288 cls.implemented_as_interfaces.update(new_implemented_as_interfaces)) |
293 | 289 |
294 | 290 |
295 # [GarbageCollected] | 291 # [GarbageCollected] |
296 IdlType.garbage_collected_types = set() | 292 IdlType.garbage_collected_types = set() |
297 | 293 |
298 IdlTypeBase.is_garbage_collected = False | |
299 IdlType.is_garbage_collected = property( | 294 IdlType.is_garbage_collected = property( |
300 lambda self: self.base_type in IdlType.garbage_collected_types) | 295 lambda self: self.base_type in IdlType.garbage_collected_types) |
301 | 296 |
302 IdlType.set_garbage_collected_types = classmethod( | 297 IdlType.set_garbage_collected_types = classmethod( |
303 lambda cls, new_garbage_collected_types: | 298 lambda cls, new_garbage_collected_types: |
304 cls.garbage_collected_types.update(new_garbage_collected_types)) | 299 cls.garbage_collected_types.update(new_garbage_collected_types)) |
305 | 300 |
306 | 301 |
307 # [WillBeGarbageCollected] | 302 # [WillBeGarbageCollected] |
308 IdlType.will_be_garbage_collected_types = set() | 303 IdlType.will_be_garbage_collected_types = set() |
309 | 304 |
310 IdlTypeBase.is_will_be_garbage_collected = False | |
311 IdlType.is_will_be_garbage_collected = property( | 305 IdlType.is_will_be_garbage_collected = property( |
312 lambda self: self.base_type in IdlType.will_be_garbage_collected_types) | 306 lambda self: self.base_type in IdlType.will_be_garbage_collected_types) |
313 | 307 |
314 IdlType.set_will_be_garbage_collected_types = classmethod( | 308 IdlType.set_will_be_garbage_collected_types = classmethod( |
315 lambda cls, new_will_be_garbage_collected_types: | 309 lambda cls, new_will_be_garbage_collected_types: |
316 cls.will_be_garbage_collected_types.update(new_will_be_garbage_collected
_types)) | 310 cls.will_be_garbage_collected_types.update(new_will_be_garbage_collected
_types)) |
317 | 311 |
318 | 312 |
319 def gc_type(idl_type): | 313 def gc_type(idl_type): |
320 if idl_type.is_garbage_collected: | 314 if idl_type.is_garbage_collected: |
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
598 | 592 |
599 | 593 |
600 def preprocess_idl_type_and_value(idl_type, cpp_value, extended_attributes): | 594 def preprocess_idl_type_and_value(idl_type, cpp_value, extended_attributes): |
601 """Returns IDL type and value, with preliminary type conversions applied.""" | 595 """Returns IDL type and value, with preliminary type conversions applied.""" |
602 idl_type = idl_type.preprocessed_type | 596 idl_type = idl_type.preprocessed_type |
603 if idl_type.name == 'Promise': | 597 if idl_type.name == 'Promise': |
604 idl_type = IdlType('ScriptValue') | 598 idl_type = IdlType('ScriptValue') |
605 if idl_type.base_type in ['long long', 'unsigned long long']: | 599 if idl_type.base_type in ['long long', 'unsigned long long']: |
606 # long long and unsigned long long are not representable in ECMAScript; | 600 # long long and unsigned long long are not representable in ECMAScript; |
607 # we represent them as doubles. | 601 # we represent them as doubles. |
608 idl_type = IdlType('double', is_nullable=idl_type.is_nullable) | 602 is_nullable = idl_type.is_nullable |
| 603 idl_type = IdlType('double') |
| 604 if is_nullable: |
| 605 idl_type = IdlNullableType(idl_type) |
609 cpp_value = 'static_cast<double>(%s)' % cpp_value | 606 cpp_value = 'static_cast<double>(%s)' % cpp_value |
610 # HTML5 says that unsigned reflected attributes should be in the range | 607 # HTML5 says that unsigned reflected attributes should be in the range |
611 # [0, 2^31). When a value isn't in this range, a default value (or 0) | 608 # [0, 2^31). When a value isn't in this range, a default value (or 0) |
612 # should be returned instead. | 609 # should be returned instead. |
613 extended_attributes = extended_attributes or {} | 610 extended_attributes = extended_attributes or {} |
614 if ('Reflect' in extended_attributes and | 611 if ('Reflect' in extended_attributes and |
615 idl_type.base_type in ['unsigned long', 'unsigned short']): | 612 idl_type.base_type in ['unsigned long', 'unsigned short']): |
616 cpp_value = cpp_value.replace('getUnsignedIntegralAttribute', | 613 cpp_value = cpp_value.replace('getUnsignedIntegralAttribute', |
617 'getIntegralAttribute') | 614 'getIntegralAttribute') |
618 cpp_value = 'std::max(0, static_cast<int>(%s))' % cpp_value | 615 cpp_value = 'std::max(0, static_cast<int>(%s))' % cpp_value |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
735 return None | 732 return None |
736 | 733 |
737 | 734 |
738 IdlTypeBase.v8_set_return_value = v8_set_return_value | 735 IdlTypeBase.v8_set_return_value = v8_set_return_value |
739 IdlUnionType.v8_set_return_value = v8_set_return_value_union | 736 IdlUnionType.v8_set_return_value = v8_set_return_value_union |
740 | 737 |
741 IdlType.release = property(lambda self: self.is_interface_type) | 738 IdlType.release = property(lambda self: self.is_interface_type) |
742 IdlUnionType.release = property( | 739 IdlUnionType.release = property( |
743 lambda self: [member_type.is_interface_type | 740 lambda self: [member_type.is_interface_type |
744 for member_type in self.member_types]) | 741 for member_type in self.member_types]) |
745 IdlArrayOrSequenceType.release = False | |
746 | 742 |
747 | 743 |
748 CPP_VALUE_TO_V8_VALUE = { | 744 CPP_VALUE_TO_V8_VALUE = { |
749 # Built-in types | 745 # Built-in types |
750 'Date': 'v8DateOrNaN({cpp_value}, {isolate})', | 746 'Date': 'v8DateOrNaN({cpp_value}, {isolate})', |
751 'DOMString': 'v8String({isolate}, {cpp_value})', | 747 'DOMString': 'v8String({isolate}, {cpp_value})', |
752 'ByteString': 'v8String({isolate}, {cpp_value})', | 748 'ByteString': 'v8String({isolate}, {cpp_value})', |
753 'ScalarValueString': 'v8String({isolate}, {cpp_value})', | 749 'ScalarValueString': 'v8String({isolate}, {cpp_value})', |
754 'boolean': 'v8Boolean({cpp_value}, {isolate})', | 750 'boolean': 'v8Boolean({cpp_value}, {isolate})', |
755 'int': 'v8::Integer::New({isolate}, {cpp_value})', | 751 'int': 'v8::Integer::New({isolate}, {cpp_value})', |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
816 | 812 |
817 | 813 |
818 def is_explicit_nullable(idl_type): | 814 def is_explicit_nullable(idl_type): |
819 # Nullable type that isn't implicit nullable (see above.) For such types, | 815 # Nullable type that isn't implicit nullable (see above.) For such types, |
820 # we use Nullable<T> or similar explicit ways to represent a null value. | 816 # we use Nullable<T> or similar explicit ways to represent a null value. |
821 return idl_type.is_nullable and not idl_type.is_implicit_nullable | 817 return idl_type.is_nullable and not idl_type.is_implicit_nullable |
822 | 818 |
823 IdlTypeBase.is_implicit_nullable = property(is_implicit_nullable) | 819 IdlTypeBase.is_implicit_nullable = property(is_implicit_nullable) |
824 IdlUnionType.is_implicit_nullable = False | 820 IdlUnionType.is_implicit_nullable = False |
825 IdlTypeBase.is_explicit_nullable = property(is_explicit_nullable) | 821 IdlTypeBase.is_explicit_nullable = property(is_explicit_nullable) |
OLD | NEW |