OLD | NEW |
(Empty) | |
| 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 |
| 3 # found in the LICENSE file. |
| 4 |
| 5 """Generate template contexts of dictionaries for both v8 bindings and |
| 6 implementation classes that are used by blink's core/modules. |
| 7 """ |
| 8 |
| 9 import operator |
| 10 from v8_globals import includes |
| 11 import v8_types |
| 12 import v8_utilities |
| 13 |
| 14 |
| 15 DICTIONARY_H_INCLUDES_V8 = frozenset([ |
| 16 'bindings/core/v8/V8Binding.h', |
| 17 'platform/heap/Handle.h', |
| 18 ]) |
| 19 |
| 20 DICTIONARY_CPP_INCLUDES_V8 = frozenset([ |
| 21 # FIXME: Remove this, http://crbug.com/321462 |
| 22 'bindings/core/v8/Dictionary.h', |
| 23 ]) |
| 24 |
| 25 |
| 26 def setter_name_for_dictionary_member(member): |
| 27 return 'set%s' % v8_utilities.capitalize(member.name) |
| 28 |
| 29 |
| 30 def has_name_for_dictionary_member(member): |
| 31 return 'has%s' % v8_utilities.capitalize(member.name) |
| 32 |
| 33 |
| 34 # Context for V8 bindings |
| 35 |
| 36 |
| 37 def dictionary_context_v8(dictionary): |
| 38 includes.clear() |
| 39 includes.update(DICTIONARY_CPP_INCLUDES_V8) |
| 40 return { |
| 41 'cpp_class': v8_utilities.cpp_name(dictionary), |
| 42 'header_includes': set(DICTIONARY_H_INCLUDES_V8), |
| 43 'members': [member_context_v8(member) |
| 44 for member in sorted(dictionary.members, |
| 45 key=operator.attrgetter('name'))], |
| 46 'v8_class': v8_utilities.v8_class_name(dictionary), |
| 47 } |
| 48 |
| 49 |
| 50 def member_context_v8(member): |
| 51 idl_type = member.idl_type |
| 52 idl_type.add_includes_for_type() |
| 53 |
| 54 def default_values(): |
| 55 if not member.default_value: |
| 56 return None, None |
| 57 if member.default_value.is_null: |
| 58 return None, 'v8::Null(isolate)' |
| 59 default_value = str(member.default_value) |
| 60 v8_default_value = idl_type.cpp_value_to_v8_value( |
| 61 cpp_value=default_value, isolate='isolate', |
| 62 creation_context='creationContext', |
| 63 extended_attributes=member.extended_attributes) |
| 64 return default_value, v8_default_value |
| 65 |
| 66 default_value, v8_default_value = default_values() |
| 67 |
| 68 return { |
| 69 'cpp_type': idl_type.cpp_type, |
| 70 'cpp_value_to_v8_value': idl_type.cpp_value_to_v8_value( |
| 71 cpp_value='impl->%s()' % member.name, isolate='isolate', |
| 72 creation_context='creationContext', |
| 73 extended_attributes=member.extended_attributes), |
| 74 'default_value': default_value, |
| 75 'has_name': has_name_for_dictionary_member(member), |
| 76 'name': member.name, |
| 77 'setter_name': setter_name_for_dictionary_member(member), |
| 78 'v8_default_value': v8_default_value, |
| 79 'v8_type': v8_types.v8_type(idl_type.base_type), |
| 80 } |
| 81 |
| 82 |
| 83 # Context for implementation classes |
| 84 |
| 85 |
| 86 def dictionary_context_impl(dictionary, interfaces_info): |
| 87 includes.clear() |
| 88 header_includes = set(['platform/heap/Handle.h']) |
| 89 return { |
| 90 'header_includes': header_includes, |
| 91 'cpp_class': v8_utilities.cpp_name(dictionary), |
| 92 'members': [member_context_impl(member, interfaces_info, |
| 93 header_includes) |
| 94 for member in dictionary.members], |
| 95 } |
| 96 |
| 97 |
| 98 # FIXME: We may want to put this in v8_types.py |
| 99 def impl_includes_for_type(idl_type, interfaces_info): |
| 100 includes_for_type = set() |
| 101 if idl_type.is_primitive_type: |
| 102 includes_for_type.add('bindings/core/v8/Nullable.h') |
| 103 |
| 104 idl_type = idl_type.preprocessed_type |
| 105 native_array_element_type = idl_type.native_array_element_type |
| 106 if native_array_element_type: |
| 107 includes_for_type.update(impl_includes_for_type( |
| 108 native_array_element_type, interfaces_info)) |
| 109 includes_for_type.add('wtf/Vector.h') |
| 110 |
| 111 if idl_type.is_string_type: |
| 112 includes_for_type.add('wtf/text/WTFString.h') |
| 113 if idl_type.name in interfaces_info: |
| 114 interface_info = interfaces_info[idl_type.name] |
| 115 includes_for_type.add(interface_info['include_path']) |
| 116 return includes_for_type |
| 117 |
| 118 |
| 119 def member_context_impl(member, interfaces_info, header_includes): |
| 120 idl_type = member.idl_type |
| 121 |
| 122 def argument_cpp_type(): |
| 123 argument_cpp_type = idl_type.cpp_type_args(used_as_argument=True) |
| 124 if idl_type.native_array_element_type: |
| 125 return 'const %s&' % argument_cpp_type |
| 126 return argument_cpp_type |
| 127 |
| 128 def getter_cpp_type(): |
| 129 getter_cpp_type = idl_type.cpp_type_args(used_as_return_type=True) |
| 130 if (idl_type.native_array_element_type or |
| 131 idl_type.is_string_type): |
| 132 return 'const %s&' % getter_cpp_type |
| 133 return getter_cpp_type |
| 134 |
| 135 def getter_method_expression(): |
| 136 if idl_type.is_primitive_type: |
| 137 return 'm_%s.get()' % member.name |
| 138 return 'm_%s' % member.name |
| 139 |
| 140 def has_method_expression(): |
| 141 if idl_type.is_sequence or idl_type.is_array: |
| 142 return '!m_%s.isEmpty()' % member.name |
| 143 elif idl_type.is_primitive_type or idl_type.is_string_type: |
| 144 return '!m_%s.isNull()' % member.name |
| 145 else: |
| 146 return 'm_%s' % member.name |
| 147 |
| 148 def member_cpp_type(): |
| 149 member_cpp_type = idl_type.cpp_type_args(used_as_member=True) |
| 150 if idl_type.is_primitive_type: |
| 151 return v8_types.cpp_template_type('Nullable', member_cpp_type) |
| 152 return member_cpp_type |
| 153 |
| 154 includes_for_member = impl_includes_for_type(idl_type, interfaces_info) |
| 155 header_includes.update(includes_for_member) |
| 156 return { |
| 157 'argument_cpp_type': argument_cpp_type(), |
| 158 'getter_cpp_type': getter_cpp_type(), |
| 159 'getter_method_expression': getter_method_expression(), |
| 160 'has_method_expression': has_method_expression(), |
| 161 'has_name': has_name_for_dictionary_member(member), |
| 162 'is_traceable': (idl_type.is_garbage_collected or |
| 163 idl_type.is_will_be_garbage_collected), |
| 164 'member_cpp_type': member_cpp_type(), |
| 165 'name': member.name, |
| 166 'setter_name': setter_name_for_dictionary_member(member), |
| 167 } |
OLD | NEW |