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 16 matching lines...) Expand all Loading... |
27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
28 | 28 |
29 """Generate template values for attributes. | 29 """Generate template values for attributes. |
30 | 30 |
31 Extends IdlType with property |constructor_type_name|. | 31 Extends IdlType with property |constructor_type_name|. |
32 | 32 |
33 Design doc: http://www.chromium.org/developers/design-documents/idl-compiler | 33 Design doc: http://www.chromium.org/developers/design-documents/idl-compiler |
34 """ | 34 """ |
35 | 35 |
36 import idl_types | 36 import idl_types |
37 from idl_types import inherits_interface | |
38 from dart_interface import suppress_getter, suppress_setter | 37 from dart_interface import suppress_getter, suppress_setter |
39 import dart_types | 38 import dart_types |
40 from dart_utilities import DartUtilities | 39 from dart_utilities import DartUtilities |
41 from v8_globals import includes, interfaces | 40 from v8_globals import interfaces |
| 41 |
| 42 import v8_attributes |
42 | 43 |
43 | 44 |
44 def generate_attribute(interface, attribute): | 45 def attribute_context(interface, attribute): |
| 46 # Call v8's implementation. |
| 47 context = v8_attributes.attribute_context(interface, attribute) |
| 48 |
| 49 extended_attributes = attribute.extended_attributes |
| 50 |
| 51 # Augment's Dart's information to context. |
45 idl_type = attribute.idl_type | 52 idl_type = attribute.idl_type |
46 base_idl_type = idl_type.base_type | 53 base_idl_type = idl_type.base_type |
47 # TODO(terry): Work around for DOMString[] base should be IDLTypeArray | 54 # TODO(terry): Work around for DOMString[] base should be IDLTypeArray |
48 if base_idl_type == None: | 55 if base_idl_type == None: |
49 # Returns Array or Sequence. | 56 # Returns Array or Sequence. |
50 base_idl_type = idl_type.inner_name | 57 base_idl_type = idl_type.name |
51 extended_attributes = attribute.extended_attributes | |
52 | 58 |
53 idl_type.add_includes_for_type() | |
54 | |
55 # [CheckSecurity] | |
56 is_check_security_for_node = 'CheckSecurity' in extended_attributes | |
57 if is_check_security_for_node: | |
58 includes.add('bindings/common/BindingSecurity.h') | |
59 # [Custom] | 59 # [Custom] |
60 has_custom_getter = (('Custom' in extended_attributes and | 60 has_custom_getter = (('Custom' in extended_attributes and |
61 extended_attributes['Custom'] in [None, 'Getter']) or | 61 extended_attributes['Custom'] in [None, 'Getter']) or |
62 ('DartCustom' in extended_attributes and | 62 ('DartCustom' in extended_attributes and |
63 extended_attributes['DartCustom'] in [None, 'Getter',
'New'])) | 63 extended_attributes['DartCustom'] in [None, 'Getter',
'New'])) |
64 has_custom_setter = (not attribute.is_read_only and | 64 has_custom_setter = (not attribute.is_read_only and |
65 (('Custom' in extended_attributes and | 65 (('Custom' in extended_attributes and |
66 extended_attributes['Custom'] in [None, 'Setter']) or | 66 extended_attributes['Custom'] in [None, 'Setter']) or |
67 ('DartCustom' in extended_attributes and | 67 ('DartCustom' in extended_attributes and |
68 extended_attributes['DartCustom'] in [None, 'Setter',
'New']))) | 68 extended_attributes['DartCustom'] in [None, 'Setter',
'New']))) |
69 | 69 |
70 is_call_with_script_state = DartUtilities.has_extended_attribute_value(attri
bute, 'CallWith', 'ScriptState') | 70 is_call_with_script_state = DartUtilities.has_extended_attribute_value(attri
bute, 'CallWith', 'ScriptState') |
71 | 71 |
72 # [CustomElementCallbacks], [Reflect] | 72 is_auto_scope = not 'DartNoAutoScope' in extended_attributes |
73 is_custom_element_callbacks = 'CustomElementCallbacks' in extended_attribute
s | |
74 is_reflect = 'Reflect' in extended_attributes | |
75 if is_custom_element_callbacks or is_reflect: | |
76 includes.add('core/dom/custom/CustomElementCallbackDispatcher.h') | |
77 # [RaisesException], [RaisesException=Setter] | |
78 is_setter_raises_exception = ( | |
79 'RaisesException' in extended_attributes and | |
80 extended_attributes['RaisesException'] in [None, 'Setter']) | |
81 # [DartStrictTypeChecking] | |
82 has_strict_type_checking = ( | |
83 ('DartStrictTypeChecking' in extended_attributes or | |
84 'DartStrictTypeChecking' in interface.extended_attributes) and | |
85 idl_type.is_wrapper_type) | |
86 | 73 |
87 if (base_idl_type == 'EventHandler' and | 74 context.update({ |
88 interface.name in ['Window', 'WorkerGlobalScope'] and | 75 'activity_logging_world_list_for_getter': DartUtilities.activity_logging_w
orld_list(attribute, 'Getter'), # [ActivityLogging] |
89 attribute.name == 'onerror'): | 76 'activity_logging_world_list_for_setter': DartUtilities.activity_logging_w
orld_list(attribute, 'Setter'), # [ActivityLogging] |
90 includes.add('bindings/core/v8/V8ErrorHandler.h') | 77 'deprecate_as': DartUtilities.deprecate_as(attribute), # [DeprecateAs] |
| 78 'has_custom_getter': has_custom_getter, |
| 79 'has_custom_setter': has_custom_setter, |
| 80 'is_auto_scope': is_auto_scope, # Used internally (outside of templates)
. |
| 81 'is_call_with_script_state': is_call_with_script_state, |
| 82 'auto_scope': DartUtilities.bool_to_cpp(is_auto_scope), |
| 83 'measure_as': DartUtilities.measure_as(attribute), # [MeasureAs] |
| 84 'v8_type': dart_types.v8_type(base_idl_type), |
| 85 }) |
91 | 86 |
92 is_auto_scope = not 'DartNoAutoScope' in extended_attributes | 87 if v8_attributes.is_constructor_attribute(attribute): |
93 contents = { | 88 v8_attributes.constructor_getter_context(interface, attribute, context) |
94 'access_control_list': access_control_list(attribute), | 89 return context |
95 'activity_logging_world_list_for_getter': DartUtilities.activity_logging
_world_list(attribute, 'Getter'), # [ActivityLogging] | 90 if not v8_attributes.has_custom_getter(attribute): |
96 'activity_logging_world_list_for_setter': DartUtilities.activity_logging
_world_list(attribute, 'Setter'), # [ActivityLogging] | 91 getter_context(interface, attribute, context) |
97 'cached_attribute_validation_method': extended_attributes.get('CachedAtt
ribute'), | |
98 'conditional_string': DartUtilities.conditional_string(attribute), | |
99 'constructor_type': idl_type.constructor_type_name | |
100 if is_constructor_attribute(attribute) else None, | |
101 'cpp_name': DartUtilities.cpp_name(attribute), | |
102 'cpp_type': idl_type.cpp_type, | |
103 'deprecate_as': DartUtilities.deprecate_as(attribute), # [DeprecateAs] | |
104 'enum_validation_expression': idl_type.enum_validation_expression, | |
105 'has_custom_getter': has_custom_getter, | |
106 'has_custom_setter': has_custom_setter, | |
107 'has_strict_type_checking': has_strict_type_checking, | |
108 'idl_type': str(idl_type), # need trailing [] on array for Dictionary::
ConversionContext::setConversionType | |
109 'is_auto_scope': is_auto_scope, | |
110 'auto_scope': DartUtilities.bool_to_cpp(is_auto_scope), | |
111 'is_call_with_execution_context': DartUtilities.has_extended_attribute_v
alue(attribute, 'CallWith', 'ExecutionContext'), | |
112 'is_call_with_script_state': is_call_with_script_state, | |
113 'is_check_security_for_node': is_check_security_for_node, | |
114 'is_custom_element_callbacks': is_custom_element_callbacks, | |
115 'is_expose_js_accessors': 'ExposeJSAccessors' in extended_attributes, | |
116 'is_getter_raises_exception': ( # [RaisesException] | |
117 'RaisesException' in extended_attributes and | |
118 extended_attributes['RaisesException'] in [None, 'Getter']), | |
119 'is_partial_interface_member': 'PartialInterfaceImplementedAs' in exten
ded_attributes, | |
120 'is_initialized_by_event_constructor': | |
121 'InitializedByEventConstructor' in extended_attributes, | |
122 'is_keep_alive_for_gc': is_keep_alive_for_gc(interface, attribute), | |
123 'is_nullable': attribute.idl_type.is_nullable, | |
124 'is_per_world_bindings': 'PerWorldBindings' in extended_attributes, | |
125 'is_read_only': attribute.is_read_only, | |
126 'is_reflect': is_reflect, | |
127 'is_replaceable': 'Replaceable' in attribute.extended_attributes, | |
128 'is_setter_call_with_execution_context': DartUtilities.has_extended_attr
ibute_value(attribute, 'SetterCallWith', 'ExecutionContext'), | |
129 'is_setter_raises_exception': is_setter_raises_exception, | |
130 'has_setter_exception_state': ( | |
131 is_setter_raises_exception or has_strict_type_checking or | |
132 idl_type.is_integer_type), | |
133 'is_static': attribute.is_static, | |
134 'is_url': 'URL' in extended_attributes, | |
135 'is_unforgeable': 'Unforgeable' in extended_attributes, | |
136 'measure_as': DartUtilities.measure_as(attribute), # [MeasureAs] | |
137 'name': attribute.name, | |
138 'per_context_enabled_function': DartUtilities.per_context_enabled_functi
on_name(attribute), # [PerContextEnabled] | |
139 'property_attributes': property_attributes(attribute), | |
140 'put_forwards': 'PutForwards' in extended_attributes, | |
141 'ref_ptr': 'RefPtrWillBeRawPtr' if idl_type.is_will_be_garbage_collected
else 'RefPtr', | |
142 'reflect_empty': extended_attributes.get('ReflectEmpty'), | |
143 'reflect_invalid': extended_attributes.get('ReflectInvalid', ''), | |
144 'reflect_missing': extended_attributes.get('ReflectMissing'), | |
145 'reflect_only': extended_attributes['ReflectOnly'].split('|') | |
146 if 'ReflectOnly' in extended_attributes else None, | |
147 'setter_callback': setter_callback_name(interface, attribute), | |
148 'v8_type': dart_types.v8_type(base_idl_type), | |
149 'runtime_enabled_function': DartUtilities.runtime_enabled_function_name(
attribute), # [RuntimeEnabled] | |
150 'world_suffixes': ['', 'ForMainWorld'] | |
151 if 'PerWorldBindings' in extended_attributes | |
152 else [''], # [PerWorldBindings] | |
153 } | |
154 | |
155 if is_constructor_attribute(attribute): | |
156 generate_constructor_getter(interface, attribute, contents) | |
157 return contents | |
158 if not has_custom_getter: | |
159 generate_getter(interface, attribute, contents) | |
160 # FIXME: We did not previously support the PutForwards attribute, so I am | |
161 # disabling it here for now to get things compiling. | |
162 # We may wish to revisit this. | |
163 # if ((not attribute.is_read_only or 'PutForwards' in extended_attributes)): | |
164 if (not attribute.is_read_only): | 92 if (not attribute.is_read_only): |
165 generate_setter(interface, attribute, contents) | 93 # FIXME: We did not previously support the PutForwards attribute, so I a
m |
| 94 # disabling it here for now to get things compiling. |
| 95 # We may wish to revisit this. |
| 96 # if (not has_custom_setter(attribute) and |
| 97 # (not attribute.is_read_only or 'PutForwards' in extended_attributes)): |
| 98 setter_context(interface, attribute, context) |
166 | 99 |
167 native_entry_getter = \ | 100 native_entry_getter = \ |
168 DartUtilities.generate_native_entry(interface.name, contents, | 101 DartUtilities.generate_native_entry( |
169 attribute.name, 'Getter', | 102 interface.name, attribute.name, 'Getter', attribute.is_static, 0) |
170 None, [], None) | |
171 native_entry_setter = \ | 103 native_entry_setter = \ |
172 DartUtilities.generate_native_entry(interface.name, contents, | 104 DartUtilities.generate_native_entry( |
173 attribute.name, 'Setter', | 105 interface.name, attribute.name, 'Setter', attribute.is_static, 1) |
174 None, ["value"], None) | 106 context.update({ |
175 contents.update({ | |
176 'native_entry_getter': native_entry_getter, | 107 'native_entry_getter': native_entry_getter, |
177 'native_entry_setter': native_entry_setter, | 108 'native_entry_setter': native_entry_setter, |
178 }) | 109 }) |
179 | 110 |
180 return contents | 111 return context |
181 | 112 |
182 | 113 |
183 ################################################################################ | 114 ################################################################################ |
184 # Getter | 115 # Getter |
185 ################################################################################ | 116 ################################################################################ |
186 | 117 |
187 def generate_getter(interface, attribute, contents): | 118 def getter_context(interface, attribute, context): |
| 119 v8_attributes.getter_context(interface, attribute, context) |
| 120 |
188 idl_type = attribute.idl_type | 121 idl_type = attribute.idl_type |
189 base_idl_type = idl_type.base_type | 122 base_idl_type = idl_type.base_type |
190 extended_attributes = attribute.extended_attributes | 123 extended_attributes = attribute.extended_attributes |
191 name = attribute.name | |
192 | 124 |
193 cpp_value = getter_expression(interface, attribute, contents) | 125 cpp_value = getter_expression(interface, attribute, context) |
194 # Normally we can inline the function call into the return statement to | 126 # Normally we can inline the function call into the return statement to |
195 # avoid the overhead of using a Ref<> temporary, but for some cases | 127 # avoid the overhead of using a Ref<> temporary, but for some cases |
196 # (nullable types, EventHandler, [CachedAttribute], or if there are | 128 # (nullable types, EventHandler, [CachedAttribute], or if there are |
197 # exceptions), we need to use a local variable. | 129 # exceptions), we need to use a local variable. |
198 # FIXME: check if compilers are smart enough to inline this, and if so, | 130 # FIXME: check if compilers are smart enough to inline this, and if so, |
199 # always use a local variable (for readability and CG simplicity). | 131 # always use a local variable (for readability and CG simplicity). |
200 release = False | 132 release = False |
201 if (idl_type.is_nullable or | 133 if (idl_type.is_nullable or |
202 base_idl_type == 'EventHandler' or | 134 base_idl_type == 'EventHandler' or |
203 'CachedAttribute' in extended_attributes or | 135 'CachedAttribute' in extended_attributes or |
204 'ReflectOnly' in extended_attributes or | 136 'ReflectOnly' in extended_attributes or |
205 contents['is_getter_raises_exception']): | 137 context['is_getter_raises_exception']): |
206 contents['cpp_value_original'] = cpp_value | 138 context['cpp_value_original'] = cpp_value |
207 cpp_value = 'result' | 139 cpp_value = 'result' |
208 # EventHandler has special handling | 140 # EventHandler has special handling |
209 if base_idl_type != 'EventHandler' and idl_type.is_interface_type: | 141 if base_idl_type != 'EventHandler' and idl_type.is_interface_type: |
210 release = True | 142 release = True |
211 | 143 |
212 dart_set_return_value = \ | 144 dart_set_return_value = \ |
213 idl_type.dart_set_return_value(cpp_value, | 145 idl_type.dart_set_return_value(cpp_value, |
214 extended_attributes=extended_attributes, | 146 extended_attributes=extended_attributes, |
215 script_wrappable='impl', | 147 script_wrappable='impl', |
216 release=release, | 148 release=release, |
217 for_main_world=False, | 149 for_main_world=False, |
218 auto_scope=contents['is_auto_scope']) | 150 auto_scope=context['is_auto_scope']) |
219 | 151 |
220 # TODO(terry): Should be able to eliminate suppress_getter as we move from | 152 # TODO(terry): Should be able to eliminate suppress_getter as we move from |
221 # IGNORE_MEMBERS to DartSuppress in the IDL. | 153 # IGNORE_MEMBERS to DartSuppress in the IDL. |
222 suppress = (suppress_getter(interface.name, attribute.name) or | 154 suppress = (suppress_getter(interface.name, attribute.name) or |
223 DartUtilities.has_extended_attribute_value(attribute, 'DartSuppr
ess', 'Getter')) | 155 DartUtilities.has_extended_attribute_value(attribute, 'DartSuppr
ess', 'Getter')) |
224 | 156 |
225 contents.update({ | 157 context.update({ |
226 'cpp_value': cpp_value, | 158 'cpp_value': cpp_value, |
227 'dart_set_return_value': dart_set_return_value, | 159 'dart_set_return_value': dart_set_return_value, |
228 'is_getter_suppressed': suppress, | 160 'is_getter_suppressed': suppress, |
229 }) | 161 }) |
230 | 162 |
231 | 163 |
232 def getter_expression(interface, attribute, contents): | 164 def getter_expression(interface, attribute, context): |
| 165 v8_attributes.getter_expression(interface, attribute, context) |
| 166 |
233 arguments = [] | 167 arguments = [] |
234 idl_type = attribute.idl_type | 168 this_getter_base_name = v8_attributes.getter_base_name(interface, attribute,
arguments) |
235 this_getter_base_name = getter_base_name(interface, attribute, arguments) | |
236 getter_name = DartUtilities.scoped_name(interface, attribute, this_getter_ba
se_name) | 169 getter_name = DartUtilities.scoped_name(interface, attribute, this_getter_ba
se_name) |
237 | 170 |
238 arguments.extend(DartUtilities.call_with_arguments(attribute)) | 171 arguments.extend(DartUtilities.call_with_arguments( |
| 172 attribute.extended_attributes.get('CallWith'))) |
239 if ('PartialInterfaceImplementedAs' in attribute.extended_attributes and | 173 if ('PartialInterfaceImplementedAs' in attribute.extended_attributes and |
240 not attribute.is_static): | 174 not attribute.is_static): |
241 # Pass by reference. | 175 # Pass by reference. |
242 arguments.append('*receiver') | 176 arguments.append('*receiver') |
243 | 177 |
244 # TODO(jacobr): refactor has_type_checking_nullable to better match v8. | |
245 has_type_checking_nullable = ( | |
246 (DartUtilities.has_extended_attribute_value(interface, 'TypeChecking', '
Nullable') or | |
247 DartUtilities.has_extended_attribute_value(attribute, 'TypeChecking', '
Nullable')) and | |
248 idl_type.is_wrapper_type) | |
249 | |
250 if attribute.idl_type.is_explicit_nullable: | 178 if attribute.idl_type.is_explicit_nullable: |
251 arguments.append('isNull') | 179 arguments.append('isNull') |
252 if contents['is_getter_raises_exception']: | 180 if context['is_getter_raises_exception']: |
253 arguments.append('es') | 181 arguments.append('es') |
254 return '%s(%s)' % (getter_name, ', '.join(arguments)) | 182 return '%s(%s)' % (getter_name, ', '.join(arguments)) |
255 | 183 |
256 | 184 |
257 CONTENT_ATTRIBUTE_GETTER_NAMES = { | |
258 'boolean': 'hasAttribute', | |
259 'long': 'getIntegralAttribute', | |
260 'unsigned long': 'getUnsignedIntegralAttribute', | |
261 } | |
262 | |
263 | |
264 def getter_base_name(interface, attribute, arguments): | |
265 extended_attributes = attribute.extended_attributes | |
266 if 'Reflect' not in extended_attributes: | |
267 return DartUtilities.uncapitalize(DartUtilities.cpp_name(attribute)) | |
268 | |
269 content_attribute_name = extended_attributes['Reflect'] or attribute.name.lo
wer() | |
270 if content_attribute_name in ['class', 'id', 'name']: | |
271 # Special-case for performance optimization. | |
272 return 'get%sAttribute' % content_attribute_name.capitalize() | |
273 | |
274 arguments.append(scoped_content_attribute_name(interface, attribute)) | |
275 | |
276 base_idl_type = attribute.idl_type.base_type | |
277 if base_idl_type in CONTENT_ATTRIBUTE_GETTER_NAMES: | |
278 return CONTENT_ATTRIBUTE_GETTER_NAMES[base_idl_type] | |
279 if 'URL' in attribute.extended_attributes: | |
280 return 'getURLAttribute' | |
281 return 'fastGetAttribute' | |
282 | |
283 | |
284 def is_keep_alive_for_gc(interface, attribute): | |
285 idl_type = attribute.idl_type | |
286 base_idl_type = idl_type.base_type | |
287 extended_attributes = attribute.extended_attributes | |
288 return ( | |
289 # For readonly attributes, for performance reasons we keep the attribute | |
290 # wrapper alive while the owner wrapper is alive, because the attribute | |
291 # never changes. | |
292 (attribute.is_read_only and | |
293 idl_type.is_wrapper_type and | |
294 # There are some exceptions, however: | |
295 not( | |
296 # Node lifetime is managed by object grouping. | |
297 inherits_interface(interface.name, 'Node') or | |
298 inherits_interface(base_idl_type, 'Node') or | |
299 # A self-reference is unnecessary. | |
300 attribute.name == 'self' or | |
301 # FIXME: Remove these hard-coded hacks. | |
302 base_idl_type in ['EventTarget', 'Window'] or | |
303 base_idl_type.startswith(('HTML', 'SVG'))))) | |
304 | |
305 | |
306 ################################################################################ | 185 ################################################################################ |
307 # Setter | 186 # Setter |
308 ################################################################################ | 187 ################################################################################ |
309 | 188 |
310 def generate_setter(interface, attribute, contents): | 189 def setter_context(interface, attribute, context): |
| 190 v8_attributes.setter_context(interface, attribute, context) |
| 191 |
311 def target_attribute(): | 192 def target_attribute(): |
312 target_interface_name = attribute.idl_type.base_type | 193 target_interface_name = attribute.idl_type.base_type |
313 target_attribute_name = extended_attributes['PutForwards'] | 194 target_attribute_name = extended_attributes['PutForwards'] |
314 target_interface = interfaces[target_interface_name] | 195 target_interface = interfaces[target_interface_name] |
315 try: | 196 try: |
316 return next(attribute | 197 return next(attribute |
317 for attribute in target_interface.attributes | 198 for attribute in target_interface.attributes |
318 if attribute.name == target_attribute_name) | 199 if attribute.name == target_attribute_name) |
319 except StopIteration: | 200 except StopIteration: |
320 raise Exception('[PutForward] target not found:\n' | 201 raise Exception('[PutForward] target not found:\n' |
321 'Attribute "%s" is not present in interface "%s"' % | 202 'Attribute "%s" is not present in interface "%s"' % |
322 (target_attribute_name, target_interface_name)) | 203 (target_attribute_name, target_interface_name)) |
323 | 204 |
324 extended_attributes = attribute.extended_attributes | 205 extended_attributes = attribute.extended_attributes |
325 interface_extended_attributes = interface.extended_attributes | |
326 | 206 |
327 if 'PutForwards' in extended_attributes: | 207 if 'PutForwards' in extended_attributes: |
328 # Use target attribute in place of original attribute | 208 # Use target attribute in place of original attribute |
329 attribute = target_attribute() | 209 attribute = target_attribute() |
330 this_cpp_type = 'DartStringAdapter' | 210 this_cpp_type = 'DartStringAdapter' |
331 else: | 211 else: |
332 this_cpp_type = contents['cpp_type'] | 212 this_cpp_type = context['cpp_type'] |
333 | 213 |
334 idl_type = attribute.idl_type | 214 idl_type = attribute.idl_type |
335 | 215 |
336 # TODO(terry): Should be able to eliminate suppress_setter as we move from | 216 # TODO(terry): Should be able to eliminate suppress_setter as we move from |
337 # IGNORE_MEMBERS to DartSuppress in the IDL. | 217 # IGNORE_MEMBERS to DartSuppress in the IDL. |
338 suppress = (suppress_setter(interface.name, attribute.name) or | 218 suppress = (suppress_setter(interface.name, attribute.name) or |
339 DartUtilities.has_extended_attribute_value(attribute, 'DartSuppr
ess', 'Setter')) | 219 DartUtilities.has_extended_attribute_value(attribute, 'DartSuppr
ess', 'Setter')) |
340 contents.update({ | 220 context.update({ |
| 221 'has_setter_exception_state': ( |
| 222 context['is_setter_raises_exception'] or context['has_type_checking_
interface'] or |
| 223 idl_type.is_integer_type), |
341 'is_setter_suppressed': suppress, | 224 'is_setter_suppressed': suppress, |
342 'setter_lvalue': dart_types.check_reserved_name(attribute.name), | 225 'setter_lvalue': dart_types.check_reserved_name(attribute.name), |
343 'cpp_type': this_cpp_type, | 226 'cpp_type': this_cpp_type, |
344 'local_cpp_type': idl_type.cpp_type_args(attribute.extended_attributes,
raw_type=True), | 227 'local_cpp_type': idl_type.cpp_type_args(attribute.extended_attributes,
raw_type=True), |
345 'cpp_setter': setter_expression(interface, attribute, contents), | |
346 'dart_value_to_local_cpp_value': | 228 'dart_value_to_local_cpp_value': |
347 attribute.idl_type.dart_value_to_local_cpp_value( | 229 attribute.idl_type.dart_value_to_local_cpp_value( |
348 interface_extended_attributes, extended_attributes, attribute.na
me, False, 1, | 230 extended_attributes, attribute.name, False, |
349 contents['is_auto_scope']), | 231 context['has_type_checking_interface'], 1, |
| 232 context['is_auto_scope']), |
350 }) | 233 }) |
351 | 234 |
| 235 # setter_expression() depends on context values we set above. |
| 236 context['cpp_setter'] = setter_expression(interface, attribute, context) |
352 | 237 |
353 def setter_expression(interface, attribute, contents): | 238 |
| 239 def setter_expression(interface, attribute, context): |
354 extended_attributes = attribute.extended_attributes | 240 extended_attributes = attribute.extended_attributes |
355 arguments = DartUtilities.call_with_arguments(attribute, extended_attributes
.get('SetterCallWith')) | 241 arguments = DartUtilities.call_with_arguments( |
| 242 extended_attributes.get('SetterCallWith') or |
| 243 extended_attributes.get('CallWith')) |
356 | 244 |
357 this_setter_base_name = setter_base_name(interface, attribute, arguments) | 245 this_setter_base_name = v8_attributes.setter_base_name(interface, attribute,
arguments) |
358 setter_name = DartUtilities.scoped_name(interface, attribute, this_setter_ba
se_name) | 246 setter_name = DartUtilities.scoped_name(interface, attribute, this_setter_ba
se_name) |
359 | 247 |
360 if ('PartialInterfaceImplementedAs' in extended_attributes and | 248 if ('PartialInterfaceImplementedAs' in extended_attributes and |
361 not attribute.is_static): | 249 not attribute.is_static): |
362 arguments.append('*receiver') | 250 arguments.append('*receiver') |
363 idl_type = attribute.idl_type | 251 idl_type = attribute.idl_type |
364 if idl_type.base_type == 'EventHandler': | 252 if idl_type.base_type == 'EventHandler': |
365 getter_name = DartUtilities.scoped_name(interface, attribute, DartUtilit
ies.cpp_name(attribute)) | 253 getter_name = DartUtilities.scoped_name(interface, attribute, DartUtilit
ies.cpp_name(attribute)) |
366 contents['event_handler_getter_expression'] = '%s(%s)' % ( | 254 context['event_handler_getter_expression'] = '%s(%s)' % ( |
367 getter_name, ', '.join(arguments)) | 255 getter_name, ', '.join(arguments)) |
368 # FIXME(vsm): Do we need to support this? If so, what's our analogue of | 256 # FIXME(vsm): Do we need to support this? If so, what's our analogue of |
369 # V8EventListenerList? | 257 # V8EventListenerList? |
370 arguments.append('nullptr') | 258 arguments.append('nullptr') |
371 # if (interface.name in ['Window', 'WorkerGlobalScope'] and | 259 # if (interface.name in ['Window', 'WorkerGlobalScope'] and |
372 # attribute.name == 'onerror'): | 260 # attribute.name == 'onerror'): |
373 # includes.add('bindings/core/v8/V8ErrorHandler.h') | 261 # includes.add('bindings/core/v8/V8ErrorHandler.h') |
374 # arguments.append('V8EventListenerList::findOrCreateWrapper<V8ErrorH
andler>(jsValue, true, info.GetIsolate())') | 262 # arguments.append('V8EventListenerList::findOrCreateWrapper<V8ErrorH
andler>(jsValue, true, info.GetIsolate())') |
375 # else: | 263 # else: |
376 # arguments.append('V8EventListenerList::getEventListener(jsValue, tr
ue, ListenerFindOrCreate)') | 264 # arguments.append('V8EventListenerList::getEventListener(jsValue, tr
ue, ListenerFindOrCreate)') |
377 else: | 265 else: |
378 attribute_name = dart_types.check_reserved_name(attribute.name) | 266 attribute_name = dart_types.check_reserved_name(attribute.name) |
379 arguments.append(attribute_name) | 267 arguments.append(attribute_name) |
380 if contents['is_setter_raises_exception']: | 268 if context['is_setter_raises_exception']: |
381 arguments.append('es') | 269 arguments.append('es') |
382 | 270 |
383 return '%s(%s)' % (setter_name, ', '.join(arguments)) | 271 return '%s(%s)' % (setter_name, ', '.join(arguments)) |
384 | 272 |
385 | 273 |
386 CONTENT_ATTRIBUTE_SETTER_NAMES = { | |
387 'boolean': 'setBooleanAttribute', | |
388 'long': 'setIntegralAttribute', | |
389 'unsigned long': 'setUnsignedIntegralAttribute', | |
390 } | |
391 | |
392 | |
393 def setter_base_name(interface, attribute, arguments): | |
394 if 'Reflect' not in attribute.extended_attributes: | |
395 return 'set%s' % DartUtilities.capitalize(DartUtilities.cpp_name(attribu
te)) | |
396 arguments.append(scoped_content_attribute_name(interface, attribute)) | |
397 | |
398 base_idl_type = attribute.idl_type.base_type | |
399 if base_idl_type in CONTENT_ATTRIBUTE_SETTER_NAMES: | |
400 return CONTENT_ATTRIBUTE_SETTER_NAMES[base_idl_type] | |
401 return 'setAttribute' | |
402 | |
403 | |
404 def scoped_content_attribute_name(interface, attribute): | |
405 content_attribute_name = attribute.extended_attributes['Reflect'] or attribu
te.name.lower() | |
406 if interface.name.startswith('SVG'): | |
407 # SVG's xmlbase/xmlspace/xmllang need special behavior, i.e. | |
408 # it is in XMLNames namespace and the generated attribute has no xml pre
fix. | |
409 if attribute.name.startswith('xml'): | |
410 namespace = 'XMLNames' | |
411 content_attribute_name = content_attribute_name[3:] | |
412 else: | |
413 namespace = 'SVGNames' | |
414 else: | |
415 namespace = 'HTMLNames' | |
416 includes.add('core/%s.h' % namespace) | |
417 return '%s::%sAttr' % (namespace, content_attribute_name) | |
418 | |
419 | |
420 ################################################################################ | 274 ################################################################################ |
421 # Attribute configuration | 275 # Attribute configuration |
422 ################################################################################ | 276 ################################################################################ |
423 | 277 |
424 # [Replaceable] | 278 # [Replaceable] |
425 def setter_callback_name(interface, attribute): | 279 def setter_callback_name(interface, attribute): |
426 cpp_class_name = DartUtilities.cpp_name(interface) | 280 cpp_class_name = DartUtilities.cpp_name(interface) |
427 extended_attributes = attribute.extended_attributes | 281 extended_attributes = attribute.extended_attributes |
428 if (('Replaceable' in extended_attributes and | 282 if (('Replaceable' in extended_attributes and |
429 'PutForwards' not in extended_attributes) or | 283 'PutForwards' not in extended_attributes) or |
430 is_constructor_attribute(attribute)): | 284 v8_attributes.is_constructor_attribute(attribute)): |
431 # FIXME: rename to ForceSetAttributeOnThisCallback, since also used for
Constructors | 285 # FIXME: rename to ForceSetAttributeOnThisCallback, since also used for
Constructors |
432 return '{0}V8Internal::{0}ReplaceableAttributeSetterCallback'.format(cpp
_class_name) | 286 return '{0}V8Internal::{0}ReplaceableAttributeSetterCallback'.format(cpp
_class_name) |
433 # FIXME:disabling PutForwards for now since we didn't support it before | 287 # FIXME:disabling PutForwards for now since we didn't support it before |
434 # if attribute.is_read_only and 'PutForwards' not in extended_attributes: | 288 # if attribute.is_read_only and 'PutForwards' not in extended_attributes: |
435 if attribute.is_read_only: | 289 if attribute.is_read_only: |
436 return '0' | 290 return '0' |
437 return '%sV8Internal::%sAttributeSetterCallback' % (cpp_class_name, attribut
e.name) | 291 return '%sV8Internal::%sAttributeSetterCallback' % (cpp_class_name, attribut
e.name) |
438 | 292 |
439 | 293 |
440 # [DoNotCheckSecurity], [Unforgeable] | |
441 def access_control_list(attribute): | |
442 extended_attributes = attribute.extended_attributes | |
443 access_control = [] | |
444 if 'DoNotCheckSecurity' in extended_attributes: | |
445 do_not_check_security = extended_attributes['DoNotCheckSecurity'] | |
446 if do_not_check_security == 'Setter': | |
447 access_control.append('v8::ALL_CAN_WRITE') | |
448 else: | |
449 access_control.append('v8::ALL_CAN_READ') | |
450 if (not attribute.is_read_only or | |
451 'Replaceable' in extended_attributes): | |
452 access_control.append('v8::ALL_CAN_WRITE') | |
453 if 'Unforgeable' in extended_attributes: | |
454 access_control.append('v8::PROHIBITS_OVERWRITING') | |
455 return access_control or ['v8::DEFAULT'] | |
456 | |
457 | |
458 # [NotEnumerable], [Unforgeable] | |
459 def property_attributes(attribute): | |
460 extended_attributes = attribute.extended_attributes | |
461 property_attributes_list = [] | |
462 if ('NotEnumerable' in extended_attributes or | |
463 is_constructor_attribute(attribute)): | |
464 property_attributes_list.append('v8::DontEnum') | |
465 if 'Unforgeable' in extended_attributes: | |
466 property_attributes_list.append('v8::DontDelete') | |
467 return property_attributes_list or ['v8::None'] | |
468 | |
469 | |
470 ################################################################################ | 294 ################################################################################ |
471 # Constructors | 295 # Constructors |
472 ################################################################################ | 296 ################################################################################ |
473 | 297 |
474 idl_types.IdlType.constructor_type_name = property( | 298 idl_types.IdlType.constructor_type_name = property( |
475 # FIXME: replace this with a [ConstructorAttribute] extended attribute | 299 # FIXME: replace this with a [ConstructorAttribute] extended attribute |
476 lambda self: DartUtilities.strip_suffix(self.base_type, 'Constructor')) | 300 lambda self: DartUtilities.strip_suffix(self.base_type, 'Constructor')) |
477 | |
478 | |
479 def is_constructor_attribute(attribute): | |
480 # FIXME: replace this with [ConstructorAttribute] extended attribute | |
481 return attribute.idl_type.name.endswith('Constructor') | |
482 | |
483 | |
484 def generate_constructor_getter(interface, attribute, contents): | |
485 contents['needs_constructor_getter_callback'] = contents['measure_as'] or co
ntents['deprecate_as'] | |
OLD | NEW |