Chromium Code Reviews| 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_utilities | 5 import v8_utilities |
| 6 | 6 |
| 7 | 7 |
| 8 UNION_H_INCLUDES = frozenset([ | 8 UNION_H_INCLUDES = frozenset([ |
| 9 'bindings/core/v8/Dictionary.h', | 9 'bindings/core/v8/Dictionary.h', |
| 10 'bindings/core/v8/ExceptionState.h', | 10 'bindings/core/v8/ExceptionState.h', |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 63 def container_context(union_type, interfaces_info): | 63 def container_context(union_type, interfaces_info): |
| 64 members = [] | 64 members = [] |
| 65 | 65 |
| 66 # These variables refer to member contexts if the given union type has | 66 # These variables refer to member contexts if the given union type has |
| 67 # corresponding types. They are used for V8 -> impl conversion. | 67 # corresponding types. They are used for V8 -> impl conversion. |
| 68 array_buffer_type = None | 68 array_buffer_type = None |
| 69 array_buffer_view_type = None | 69 array_buffer_view_type = None |
| 70 array_or_sequence_type = None | 70 array_or_sequence_type = None |
| 71 boolean_type = None | 71 boolean_type = None |
| 72 dictionary_type = None | 72 dictionary_type = None |
| 73 enum_type = None | |
| 73 interface_types = [] | 74 interface_types = [] |
| 74 numeric_type = None | 75 numeric_type = None |
| 75 string_type = None | 76 string_type = None |
| 76 for member in union_type.member_types: | 77 for member in union_type.member_types: |
| 77 context = member_context(member, interfaces_info) | 78 context = member_context(member, interfaces_info) |
| 78 members.append(context) | 79 members.append(context) |
| 79 if member.base_type == 'ArrayBuffer': | 80 if member.base_type == 'ArrayBuffer': |
| 80 if array_buffer_type: | 81 if array_buffer_type: |
| 81 raise Exception('%s is ambiguous.' % union_type.name) | 82 raise Exception('%s is ambiguous.' % union_type.name) |
| 82 array_buffer_type = context | 83 array_buffer_type = context |
| 83 elif member.base_type == 'ArrayBufferView': | 84 elif member.base_type == 'ArrayBufferView': |
| 84 if array_buffer_view_type: | 85 if array_buffer_view_type: |
| 85 raise Exception('%s is ambiguous.' % union_type.name) | 86 raise Exception('%s is ambiguous.' % union_type.name) |
| 86 array_buffer_view_type = context | 87 array_buffer_view_type = context |
| 87 # FIXME: Remove generic Dictionary special casing. | 88 # FIXME: Remove generic Dictionary special casing. |
| 88 elif member.is_dictionary or member.base_type == 'Dictionary': | 89 elif member.is_dictionary or member.base_type == 'Dictionary': |
| 89 if dictionary_type: | 90 if dictionary_type: |
| 90 raise Exception('%s is ambiguous.' % union_type.name) | 91 raise Exception('%s is ambiguous.' % union_type.name) |
| 91 dictionary_type = context | 92 dictionary_type = context |
| 92 elif member.is_array_or_sequence_type: | 93 elif member.is_array_or_sequence_type: |
| 93 if array_or_sequence_type: | 94 if array_or_sequence_type: |
| 94 raise Exception('%s is ambiguous.' % union_type.name) | 95 raise Exception('%s is ambiguous.' % union_type.name) |
| 95 array_or_sequence_type = context | 96 array_or_sequence_type = context |
| 96 elif member.is_interface_type: | 97 elif member.is_interface_type: |
| 97 interface_types.append(context) | 98 interface_types.append(context) |
| 99 elif member.is_enum: | |
|
Jens Widell
2015/01/16 09:53:51
If there's an enum type in the union, it will be u
bashi
2015/01/16 10:11:58
My understanding is that enums and strings are not
| |
| 100 if string_type: | |
| 101 raise Exception('%s is ambiguous.' % union_type.name) | |
| 102 enum_type = context | |
| 98 elif member is union_type.boolean_member_type: | 103 elif member is union_type.boolean_member_type: |
| 99 boolean_type = context | 104 boolean_type = context |
| 100 elif member is union_type.numeric_member_type: | 105 elif member is union_type.numeric_member_type: |
| 101 numeric_type = context | 106 numeric_type = context |
| 102 elif member is union_type.string_member_type: | 107 elif member is union_type.string_member_type: |
| 108 if enum_type: | |
| 109 raise Exception('%s is ambiguious.' % union_type.name) | |
| 103 string_type = context | 110 string_type = context |
| 104 else: | 111 else: |
| 105 raise Exception('%s is not supported as an union member.' % member.n ame) | 112 raise Exception('%s is not supported as an union member.' % member.n ame) |
| 106 | 113 |
| 107 # Nullable restriction checks | 114 # Nullable restriction checks |
| 108 nullable_members = union_type.number_of_nullable_member_types | 115 nullable_members = union_type.number_of_nullable_member_types |
| 109 if nullable_members > 1: | 116 if nullable_members > 1: |
| 110 raise Exception('%s contains more than one nullable members' % union_typ e.name) | 117 raise Exception('%s contains more than one nullable members' % union_typ e.name) |
| 111 if dictionary_type and nullable_members == 1: | 118 if dictionary_type and nullable_members == 1: |
| 112 raise Exception('%s has a dictionary and a nullable member' % union_type .name) | 119 raise Exception('%s has a dictionary and a nullable member' % union_type .name) |
| 113 | 120 |
| 114 return { | 121 return { |
| 115 'array_buffer_type': array_buffer_type, | 122 'array_buffer_type': array_buffer_type, |
| 116 'array_buffer_view_type': array_buffer_view_type, | 123 'array_buffer_view_type': array_buffer_view_type, |
| 117 'array_or_sequence_type': array_or_sequence_type, | 124 'array_or_sequence_type': array_or_sequence_type, |
| 118 'boolean_type': boolean_type, | 125 'boolean_type': boolean_type, |
| 119 'cpp_class': union_type.cpp_type, | 126 'cpp_class': union_type.cpp_type, |
| 120 'dictionary_type': dictionary_type, | 127 'dictionary_type': dictionary_type, |
| 121 'type_string': str(union_type), | 128 'enum_type': enum_type, |
| 122 'includes_nullable_type': union_type.includes_nullable_type, | 129 'includes_nullable_type': union_type.includes_nullable_type, |
| 123 'interface_types': interface_types, | 130 'interface_types': interface_types, |
| 124 'members': members, | 131 'members': members, |
| 125 'needs_trace': any(member['is_traceable'] for member in members), | 132 'needs_trace': any(member['is_traceable'] for member in members), |
| 126 'numeric_type': numeric_type, | 133 'numeric_type': numeric_type, |
| 127 'string_type': string_type, | 134 'string_type': string_type, |
| 135 'type_string': str(union_type), | |
| 128 } | 136 } |
| 129 | 137 |
| 130 | 138 |
| 131 def member_context(member, interfaces_info): | 139 def member_context(member, interfaces_info): |
| 132 cpp_includes.update(member.includes_for_type) | 140 cpp_includes.update(member.includes_for_type) |
| 133 interface_info = interfaces_info.get(member.name, None) | 141 interface_info = interfaces_info.get(member.name, None) |
| 134 if interface_info: | 142 if interface_info: |
| 135 cpp_includes.update(interface_info.get('dependencies_include_paths', []) ) | 143 cpp_includes.update(interface_info.get('dependencies_include_paths', []) ) |
| 136 header_forward_decls.add(member.implemented_as) | 144 header_forward_decls.add(member.implemented_as) |
| 137 if member.is_nullable: | 145 if member.is_nullable: |
| 138 member = member.inner_type | 146 member = member.inner_type |
| 139 return { | 147 return { |
| 140 'cpp_name': v8_utilities.uncapitalize(member.name), | 148 'cpp_name': v8_utilities.uncapitalize(member.name), |
| 141 'cpp_type': member.cpp_type_args(used_in_cpp_sequence=True), | 149 'cpp_type': member.cpp_type_args(used_in_cpp_sequence=True), |
| 142 'cpp_local_type': member.cpp_type, | 150 'cpp_local_type': member.cpp_type, |
| 143 'cpp_value_to_v8_value': member.cpp_value_to_v8_value( | 151 'cpp_value_to_v8_value': member.cpp_value_to_v8_value( |
| 144 cpp_value='impl.getAs%s()' % member.name, isolate='isolate', | 152 cpp_value='impl.getAs%s()' % member.name, isolate='isolate', |
| 145 creation_context='creationContext'), | 153 creation_context='creationContext'), |
| 154 'enum_validation_expression': member.enum_validation_expression, | |
| 146 'is_traceable': member.is_traceable, | 155 'is_traceable': member.is_traceable, |
| 147 'rvalue_cpp_type': member.cpp_type_args(used_as_rvalue_type=True), | 156 'rvalue_cpp_type': member.cpp_type_args(used_as_rvalue_type=True), |
| 148 'specific_type_enum': 'SpecificType' + member.name, | 157 'specific_type_enum': 'SpecificType' + member.name, |
| 149 'type_name': member.name, | 158 'type_name': member.name, |
| 150 'v8_value_to_local_cpp_value': member.v8_value_to_local_cpp_value( | 159 'v8_value_to_local_cpp_value': member.v8_value_to_local_cpp_value( |
| 151 {}, 'v8Value', 'cppValue', isolate='isolate', | 160 {}, 'v8Value', 'cppValue', isolate='isolate', |
| 152 needs_exception_state_for_string=True), | 161 needs_exception_state_for_string=True), |
| 153 } | 162 } |
| OLD | NEW |