| OLD | NEW |
| 1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 import v8_types | 5 import v8_types |
| 6 import v8_utilities | 6 import v8_utilities |
| 7 | 7 |
| 8 | 8 |
| 9 UNION_CPP_INCLUDES = frozenset([ | 9 UNION_CPP_INCLUDES = frozenset([ |
| 10 'bindings/core/v8/ToV8.h', | 10 'bindings/core/v8/ToV8.h', |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 # casing a header like this. | 27 # casing a header like this. |
| 28 'core/dom/GlobalEventHandlers.h', | 28 'core/dom/GlobalEventHandlers.h', |
| 29 ]) | 29 ]) |
| 30 | 30 |
| 31 | 31 |
| 32 cpp_includes = set() | 32 cpp_includes = set() |
| 33 header_forward_decls = set() | 33 header_forward_decls = set() |
| 34 header_includes = set() | 34 header_includes = set() |
| 35 | 35 |
| 36 | 36 |
| 37 def container_context(union_type, interfaces_info): | 37 def container_context(union_type, info_provider): |
| 38 cpp_includes.clear() | 38 cpp_includes.clear() |
| 39 header_forward_decls.clear() | 39 header_forward_decls.clear() |
| 40 header_includes.clear() | 40 header_includes.clear() |
| 41 cpp_includes.update(UNION_CPP_INCLUDES) | 41 cpp_includes.update(UNION_CPP_INCLUDES) |
| 42 header_includes.update(UNION_H_INCLUDES) | 42 header_includes.update(UNION_H_INCLUDES) |
| 43 members = [] | 43 members = [] |
| 44 | 44 |
| 45 # These variables refer to member contexts if the given union type has | 45 # These variables refer to member contexts if the given union type has |
| 46 # corresponding types. They are used for V8 -> impl conversion. | 46 # corresponding types. They are used for V8 -> impl conversion. |
| 47 array_buffer_type = None | 47 array_buffer_type = None |
| 48 array_buffer_view_type = None | 48 array_buffer_view_type = None |
| 49 array_or_sequence_type = None | 49 array_or_sequence_type = None |
| 50 boolean_type = None | 50 boolean_type = None |
| 51 dictionary_type = None | 51 dictionary_type = None |
| 52 interface_types = [] | 52 interface_types = [] |
| 53 numeric_type = None | 53 numeric_type = None |
| 54 object_type = None | 54 object_type = None |
| 55 record_type = None | 55 record_type = None |
| 56 string_type = None | 56 string_type = None |
| 57 for member in sorted(union_type.flattened_member_types, key=lambda m: m.name
): | 57 for member in sorted(union_type.flattened_member_types, key=lambda m: m.name
): |
| 58 context = member_context(member, interfaces_info) | 58 context = member_context(member, info_provider) |
| 59 members.append(context) | 59 members.append(context) |
| 60 if member.base_type == 'ArrayBuffer': | 60 if member.base_type == 'ArrayBuffer': |
| 61 if array_buffer_type: | 61 if array_buffer_type: |
| 62 raise Exception('%s is ambiguous.' % union_type.name) | 62 raise Exception('%s is ambiguous.' % union_type.name) |
| 63 array_buffer_type = context | 63 array_buffer_type = context |
| 64 elif member.base_type == 'ArrayBufferView': | 64 elif member.base_type == 'ArrayBufferView': |
| 65 if array_buffer_view_type: | 65 if array_buffer_view_type: |
| 66 raise Exception('%s is ambiguous.' % union_type.name) | 66 raise Exception('%s is ambiguous.' % union_type.name) |
| 67 array_buffer_view_type = context | 67 array_buffer_view_type = context |
| 68 elif member.is_dictionary: | 68 elif member.is_dictionary: |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 116 'members': members, | 116 'members': members, |
| 117 'numeric_type': numeric_type, | 117 'numeric_type': numeric_type, |
| 118 'object_type': object_type, | 118 'object_type': object_type, |
| 119 'record_type': record_type, | 119 'record_type': record_type, |
| 120 'string_type': string_type, | 120 'string_type': string_type, |
| 121 'type_string': str(union_type), | 121 'type_string': str(union_type), |
| 122 'v8_class': v8_types.v8_type(cpp_class), | 122 'v8_class': v8_types.v8_type(cpp_class), |
| 123 } | 123 } |
| 124 | 124 |
| 125 | 125 |
| 126 def _update_includes_and_forward_decls(member, interface_info): | 126 def _update_includes_and_forward_decls(member, info_provider): |
| 127 interface_info = info_provider.interfaces_info.get(member.name, None) |
| 127 if interface_info: | 128 if interface_info: |
| 128 cpp_includes.update(interface_info.get( | 129 cpp_includes.update(interface_info.get( |
| 129 'dependencies_include_paths', [])) | 130 'dependencies_include_paths', [])) |
| 130 # We need complete types for IDL dictionaries in union containers. | 131 # We need complete types for IDL dictionaries in union containers. |
| 131 if member.is_dictionary or member.is_typed_array: | 132 if member.is_dictionary or member.is_typed_array: |
| 132 header_includes.update(member.includes_for_type()) | 133 header_includes.update(member.includes_for_type()) |
| 133 else: | 134 else: |
| 134 cpp_includes.update(member.includes_for_type()) | 135 cpp_includes.update(member.includes_for_type()) |
| 135 header_forward_decls.add(member.implemented_as) | 136 header_forward_decls.add(member.implemented_as) |
| 136 else: | 137 else: |
| 137 if member.is_record_type: | 138 if member.is_record_type: |
| 138 # The headers for both T and U must be present when | 139 _update_includes_and_forward_decls(member.key_type, info_provider) |
| 139 # Vector<std::pair<T, U>> is declared. | 140 _update_includes_and_forward_decls(member.value_type, info_provider) |
| 140 header_includes.update(member.includes_for_type()) | 141 elif member.is_array_or_sequence_type: |
| 142 _update_includes_and_forward_decls(member.element_type, info_provide
r) |
| 141 else: | 143 else: |
| 142 cpp_includes.update(member.includes_for_type()) | 144 if member.is_union_type: |
| 145 # Reaching this block means we have a union that is inside a |
| 146 # record or sequence. |
| 147 header_forward_decls.add(member.name) |
| 148 cpp_includes.update([info_provider.include_path_for_union_types(
member)]) |
| 149 else: |
| 150 cpp_includes.update(member.includes_for_type()) |
| 143 | 151 |
| 144 | 152 |
| 145 def member_context(member, interfaces_info): | 153 def member_context(member, info_provider): |
| 146 interface_info = interfaces_info.get(member.name, None) | 154 _update_includes_and_forward_decls(member, info_provider) |
| 147 _update_includes_and_forward_decls(member, interface_info) | |
| 148 if member.is_nullable: | 155 if member.is_nullable: |
| 149 member = member.inner_type | 156 member = member.inner_type |
| 150 return { | 157 return { |
| 151 'cpp_name': v8_utilities.uncapitalize(member.name), | 158 'cpp_name': v8_utilities.uncapitalize(member.name), |
| 152 'cpp_type': member.cpp_type_args(used_in_cpp_sequence=True), | 159 'cpp_type': member.cpp_type_args(used_in_cpp_sequence=True), |
| 153 'cpp_local_type': member.cpp_type, | 160 'cpp_local_type': member.cpp_type, |
| 154 'cpp_value_to_v8_value': member.cpp_value_to_v8_value( | 161 'cpp_value_to_v8_value': member.cpp_value_to_v8_value( |
| 155 cpp_value='impl.getAs%s()' % member.name, isolate='isolate', | 162 cpp_value='impl.getAs%s()' % member.name, isolate='isolate', |
| 156 creation_context='creationContext'), | 163 creation_context='creationContext'), |
| 157 'enum_values': member.enum_values, | 164 'enum_values': member.enum_values, |
| 158 'is_array_buffer_or_view_type': member.is_array_buffer_or_view, | 165 'is_array_buffer_or_view_type': member.is_array_buffer_or_view, |
| 159 'is_traceable': member.is_traceable, | 166 'is_traceable': member.is_traceable, |
| 160 'rvalue_cpp_type': member.cpp_type_args(used_as_rvalue_type=True), | 167 'rvalue_cpp_type': member.cpp_type_args(used_as_rvalue_type=True), |
| 161 'specific_type_enum': 'SpecificType' + member.name, | 168 'specific_type_enum': 'SpecificType' + member.name, |
| 162 'type_name': member.name, | 169 'type_name': member.name, |
| 163 'v8_value_to_local_cpp_value': member.v8_value_to_local_cpp_value( | 170 'v8_value_to_local_cpp_value': member.v8_value_to_local_cpp_value( |
| 164 {}, 'v8Value', 'cppValue', isolate='isolate', | 171 {}, 'v8Value', 'cppValue', isolate='isolate', |
| 165 use_exception_state=True) | 172 use_exception_state=True) |
| 166 } | 173 } |
| OLD | NEW |