Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(11)

Side by Side Diff: Source/bindings/scripts/unstable/v8_attributes.py

Issue 36793003: IDL compiler: constructor attributes (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Simpler loop Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
50 attributes = [generate_attribute(attribute) for attribute in interface.attri butes] 50 attributes = [generate_attribute(attribute) for attribute in interface.attri butes]
51 contents = {'attributes': attributes} 51 contents = {'attributes': attributes}
52 contents.update(generate_attributes_common(interface, attributes)) 52 contents.update(generate_attributes_common(interface, attributes))
53 return contents, includes 53 return contents, includes
54 54
55 55
56 def generate_attributes_common(interface, attributes): 56 def generate_attributes_common(interface, attributes):
57 v8_class_name = v8_utilities.v8_class_name(interface) 57 v8_class_name = v8_utilities.v8_class_name(interface)
58 return { 58 return {
59 'has_per_context_enabled_attributes': any(attribute['per_context_enabled _function_name'] for attribute in attributes), 59 'has_per_context_enabled_attributes': any(attribute['per_context_enabled _function_name'] for attribute in attributes),
60 'has_constructor_getter': any(attribute['is_constructor'] for attribute in attributes),
60 'has_replaceable_attributes': any(attribute['is_replaceable'] for attrib ute in attributes), 61 'has_replaceable_attributes': any(attribute['is_replaceable'] for attrib ute in attributes),
61 'has_runtime_enabled_attributes': any(attribute['runtime_enabled_functio n_name'] for attribute in attributes), 62 'has_runtime_enabled_attributes': any(attribute['runtime_enabled_functio n_name'] for attribute in attributes),
62 'installed_attributes': '%sAttributes' % v8_class_name if attributes els e '0', 63 'installed_attributes': '%sAttributes' % v8_class_name if attributes els e '0',
63 # Size 0 constant array is not allowed in VC++ 64 # Size 0 constant array is not allowed in VC++
64 'number_of_attributes': 'WTF_ARRAY_LENGTH(%sAttributes)' % v8_class_name if attributes else '0', 65 'number_of_attributes': 'WTF_ARRAY_LENGTH(%sAttributes)' % v8_class_name if attributes else '0',
65 } 66 }
66 67
67 68
68 def generate_attribute_and_includes(interface, attribute): 69 def generate_attribute_and_includes(interface, attribute):
69 idl_type = attribute.data_type 70 idl_type = attribute.data_type
70 extended_attributes = attribute.extended_attributes 71 extended_attributes = attribute.extended_attributes
71 72
72 has_custom_getter = has_extended_attribute(attribute, ('Custom', 'CustomGett er')) 73 has_custom_getter = has_extended_attribute(attribute, ('Custom', 'CustomGett er'))
73 is_replaceable = 'Replaceable' in attribute.extended_attributes 74 is_replaceable = 'Replaceable' in attribute.extended_attributes
74 has_custom_setter = ( 75 has_custom_setter = (
75 (not attribute.is_read_only or is_replaceable) and 76 (not attribute.is_read_only or is_replaceable) and
76 has_extended_attribute(attribute, ('Custom', 'CustomSetter'))) 77 has_extended_attribute(attribute, ('Custom', 'CustomSetter')))
77 includes = set() 78 includes = set()
78 contents = { 79 contents = {
79 'access_control_list': access_control_list(attribute), 80 'access_control_list': access_control_list(attribute),
80 'activity_logging_world_list_for_getter': v8_utilities.activity_logging_ world_list(attribute, includes, 'Getter'), # [ActivityLogging] 81 'activity_logging_world_list_for_getter': v8_utilities.activity_logging_ world_list(attribute, includes, 'Getter'), # [ActivityLogging]
81 'activity_logging_world_list_for_setter': v8_utilities.activity_logging_ world_list(attribute, includes, 'Setter'), # [ActivityLogging] 82 'activity_logging_world_list_for_setter': v8_utilities.activity_logging_ world_list(attribute, includes, 'Setter'), # [ActivityLogging]
82 'cached_attribute_validation_method': extended_attributes.get('CachedAtt ribute'), 83 'cached_attribute_validation_method': extended_attributes.get('CachedAtt ribute'),
83 'conditional_string': v8_utilities.generate_conditional_string(attribute ), 84 'conditional_string': v8_utilities.generate_conditional_string(attribute ),
84 'cpp_type': v8_types.cpp_type(idl_type), 85 'cpp_type': v8_types.cpp_type(idl_type),
86 'data': installation_data(attribute),
haraken 2013/10/24 03:33:03 data => wrapper_type_info
Nils Barth (inactive) 2013/10/24 05:33:03 Done.
85 'getter_callback_name': getter_callback_name(interface, attribute), 87 'getter_callback_name': getter_callback_name(interface, attribute),
86 'getter_callback_name_for_main_world': getter_callback_name_for_main_wor ld(interface, attribute), 88 'getter_callback_name_for_main_world': getter_callback_name_for_main_wor ld(interface, attribute),
87 'has_custom_getter': has_custom_getter, 89 'has_custom_getter': has_custom_getter,
88 'has_custom_setter': has_custom_setter, 90 'has_custom_setter': has_custom_setter,
89 'idl_type': idl_type, 91 'idl_type': idl_type,
92 'is_constructor': is_constructor(attribute),
90 'is_getter_raises_exception': has_extended_attribute(attribute, ('Getter RaisesException', 'RaisesException')), 93 'is_getter_raises_exception': has_extended_attribute(attribute, ('Getter RaisesException', 'RaisesException')),
91 'is_keep_alive_for_gc': is_keep_alive_for_gc(attribute), 94 'is_keep_alive_for_gc': is_keep_alive_for_gc(attribute),
92 'is_nullable': attribute.is_nullable, 95 'is_nullable': attribute.is_nullable,
93 'is_read_only': attribute.is_read_only, 96 'is_read_only': attribute.is_read_only,
94 'is_replaceable': is_replaceable, 97 'is_replaceable': is_replaceable,
95 'is_setter_raises_exception': has_extended_attribute(attribute, ('Raises Exception', 'SetterRaisesException')), 98 'is_setter_raises_exception': has_extended_attribute(attribute, ('Raises Exception', 'SetterRaisesException')),
96 'is_static': attribute.is_static, 99 'is_static': attribute.is_static,
97 'name': attribute.name, 100 'name': attribute.name,
98 'per_context_enabled_function_name': v8_utilities.per_context_enabled_fu nction_name(attribute), # [PerContextEnabled] 101 'per_context_enabled_function_name': v8_utilities.per_context_enabled_fu nction_name(attribute), # [PerContextEnabled]
99 'property_attributes': property_attributes(attribute), 102 'property_attributes': property_attributes(attribute),
100 'setter_callback_name': setter_callback_name(interface, attribute), 103 'setter_callback_name': setter_callback_name(interface, attribute),
101 'setter_callback_name_for_main_world': setter_callback_name_for_main_wor ld(interface, attribute), 104 'setter_callback_name_for_main_world': setter_callback_name_for_main_wor ld(interface, attribute),
102 'v8_type': v8_types.v8_type(idl_type), 105 'v8_type': v8_types.v8_type(idl_type),
103 'runtime_enabled_function_name': v8_utilities.runtime_enabled_function_n ame(attribute), # [RuntimeEnabled] 106 'runtime_enabled_function_name': v8_utilities.runtime_enabled_function_n ame(attribute), # [RuntimeEnabled]
104 'world_suffixes': ['', 'ForMainWorld'] if 'PerWorldBindings' in extended _attributes else [''], # [PerWorldBindings] 107 'world_suffixes': ['', 'ForMainWorld'] if 'PerWorldBindings' in extended _attributes else [''], # [PerWorldBindings]
105 } 108 }
109 if is_constructor(attribute):
110 includes.update(v8_types.includes_for_type(idl_type))
haraken 2013/10/24 03:33:03 We might want to call includes.update() always in
Nils Barth (inactive) 2013/10/24 05:33:03 I was thinking the same thing! That's a Perl chang
111 return contents, includes
106 if not has_custom_getter: 112 if not has_custom_getter:
107 generate_getter(interface, attribute, contents, includes) 113 generate_getter(interface, attribute, contents, includes)
108 if not (attribute.is_read_only or has_custom_setter): 114 if not (attribute.is_read_only or has_custom_setter):
109 generate_setter(interface, attribute, contents, includes) 115 generate_setter(interface, attribute, contents, includes)
110 116
111 return contents, includes 117 return contents, includes
112 118
113 119
120 # Getter
121
114 def generate_getter(interface, attribute, contents, includes): 122 def generate_getter(interface, attribute, contents, includes):
115 idl_type = attribute.data_type 123 idl_type = attribute.data_type
116 includes.update(v8_types.includes_for_type(idl_type)) 124 includes.update(v8_types.includes_for_type(idl_type))
117 extended_attributes = attribute.extended_attributes 125 extended_attributes = attribute.extended_attributes
118 126
119 cpp_value = getter_expression(interface, attribute, contents, includes) 127 cpp_value = getter_expression(interface, attribute, contents, includes)
120 # Normally we can inline the function call into the return statement to 128 # Normally we can inline the function call into the return statement to
121 # avoid the overhead of using a Ref<> temporary, but for some cases 129 # avoid the overhead of using a Ref<> temporary, but for some cases
122 # (nullable types, EventHandler, [CachedAttribute], or if there are 130 # (nullable types, EventHandler, [CachedAttribute], or if there are
123 # exceptions), we need to use a local variable. 131 # exceptions), we need to use a local variable.
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 not( 226 not(
219 # Node lifetime is managed by object grouping. 227 # Node lifetime is managed by object grouping.
220 v8_types.is_dom_node_type(idl_type) or 228 v8_types.is_dom_node_type(idl_type) or
221 # A self-reference is unnecessary. 229 # A self-reference is unnecessary.
222 attribute.name == 'self' or 230 attribute.name == 'self' or
223 # FIXME: Remove these hard-coded hacks. 231 # FIXME: Remove these hard-coded hacks.
224 idl_type in ['EventHandler', 'Promise', 'Window'] or 232 idl_type in ['EventHandler', 'Promise', 'Window'] or
225 idl_type.startswith('HTML')))) 233 idl_type.startswith('HTML'))))
226 234
227 235
236 # Setter
237
228 def generate_setter(interface, attribute, contents, includes): 238 def generate_setter(interface, attribute, contents, includes):
229 idl_type = attribute.data_type 239 idl_type = attribute.data_type
230 extended_attributes = attribute.extended_attributes 240 extended_attributes = attribute.extended_attributes
231 if v8_types.is_interface_type(idl_type) and not v8_types.array_type(idl_type ): 241 if v8_types.is_interface_type(idl_type) and not v8_types.array_type(idl_type ):
232 cpp_value = 'WTF::getPtr(cppValue)' 242 cpp_value = 'WTF::getPtr(cppValue)'
233 else: 243 else:
234 cpp_value = 'cppValue' 244 cpp_value = 'cppValue'
235 is_reflect = 'Reflect' in extended_attributes 245 is_reflect = 'Reflect' in extended_attributes
236 if is_reflect: 246 if is_reflect:
237 includes.add('core/dom/custom/CustomElementCallbackDispatcher.h') 247 includes.add('core/dom/custom/CustomElementCallbackDispatcher.h')
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
301 includes.add('%s.h' % namespace) 311 includes.add('%s.h' % namespace)
302 return '%s::%sAttr' % (namespace, content_attribute_name) 312 return '%s::%sAttr' % (namespace, content_attribute_name)
303 313
304 314
305 def scoped_name(interface, attribute, base_name): 315 def scoped_name(interface, attribute, base_name):
306 if attribute.is_static: 316 if attribute.is_static:
307 return '%s::%s' % (interface.name, base_name) 317 return '%s::%s' % (interface.name, base_name)
308 return 'imp->%s' % base_name 318 return 'imp->%s' % base_name
309 319
310 320
321 # Attribute configuration
322
311 def getter_callback_name(interface, attribute): 323 def getter_callback_name(interface, attribute):
324 if attribute.data_type.endswith('Constructor'):
325 return '{0}V8Internal::{0}ConstructorGetter'.format(cpp_name(interface))
312 return '%sV8Internal::%sAttributeGetterCallback' % (cpp_name(interface), att ribute.name) 326 return '%sV8Internal::%sAttributeGetterCallback' % (cpp_name(interface), att ribute.name)
313 327
314 328
329 # [Replaceable]
315 def setter_callback_name(interface, attribute): 330 def setter_callback_name(interface, attribute):
316 if (attribute.is_read_only and 331 if (attribute.is_read_only and
317 'Replaceable' not in attribute.extended_attributes): 332 'Replaceable' not in attribute.extended_attributes):
318 # FIXME: support [PutForwards] 333 # FIXME: support [PutForwards]
319 return '0' 334 return '0'
320 cpp_class_name = cpp_name(interface) 335 cpp_class_name = cpp_name(interface)
321 if ('Replaceable' in attribute.extended_attributes and 336 if (('Replaceable' in attribute.extended_attributes and
322 not has_extended_attribute(attribute, ('Custom', 'CustomSetter'))): 337 not has_extended_attribute(attribute, ('Custom', 'CustomSetter'))) or
338 attribute.data_type.endswith('Constructor')):
323 # Non-custom replaceable attributes have a single interface-level 339 # Non-custom replaceable attributes have a single interface-level
324 # setter callback (rather than individual attribute-level callbacks), 340 # setter callback (rather than individual attribute-level callbacks),
325 # but custom replaceable attributes have individual callbacks, as usual. 341 # but custom replaceable attributes have individual callbacks, as usual.
326 return '{0}V8Internal::{0}ReplaceableAttributeSetterCallback'.format(cpp _class_name) 342 return '{0}V8Internal::{0}ReplaceableAttributeSetterCallback'.format(cpp _class_name)
327 return '%sV8Internal::%sAttributeSetterCallback' % (cpp_class_name, attribut e.name) 343 return '%sV8Internal::%sAttributeSetterCallback' % (cpp_class_name, attribut e.name)
328 344
329 345
346 # [PerWorldBindings]
347 def getter_callback_name_for_main_world(interface, attribute):
348 if 'PerWorldBindings' not in attribute.extended_attributes:
349 return '0'
350 return '%sV8Internal::%sAttributeGetterCallbackForMainWorld' % (cpp_name(int erface), attribute.name)
351
352
353 def setter_callback_name_for_main_world(interface, attribute):
354 if ('PerWorldBindings' not in attribute.extended_attributes or
355 attribute.is_read_only):
356 return '0'
357 return '%sV8Internal::%sAttributeSetterCallbackForMainWorld' % (cpp_name(int erface), attribute.name)
358
359
360 def installation_data(attribute):
haraken 2013/10/24 03:33:03 installation_data => wrapper_type_info
Nils Barth (inactive) 2013/10/24 05:33:03 Done.
361 if not is_constructor(attribute):
362 return '0'
363 return '&V8%s::info' % v8_types.constructor_type(attribute.data_type)
haraken 2013/10/24 03:33:03 Shall we rename |info| to |wrapperTypeInfo|? It's
Nils Barth (inactive) 2013/10/24 05:33:03 That clarifies things! Simple rename (in Perl too,
364
365
330 # [DoNotCheckSecurity], [DoNotCheckSecurityOnGetter], [DoNotCheckSecurityOnSette r], [Unforgeable] 366 # [DoNotCheckSecurity], [DoNotCheckSecurityOnGetter], [DoNotCheckSecurityOnSette r], [Unforgeable]
331 def access_control_list(attribute): 367 def access_control_list(attribute):
332 extended_attributes = attribute.extended_attributes 368 extended_attributes = attribute.extended_attributes
333 access_control = [] 369 access_control = []
334 if 'DoNotCheckSecurity' in extended_attributes: 370 if 'DoNotCheckSecurity' in extended_attributes:
335 access_control.append('v8::ALL_CAN_READ') 371 access_control.append('v8::ALL_CAN_READ')
336 if not attribute.is_read_only: 372 if not attribute.is_read_only:
337 access_control.append('v8::ALL_CAN_WRITE') 373 access_control.append('v8::ALL_CAN_WRITE')
338 if 'DoNotCheckSecurityOnSetter' in extended_attributes: 374 if 'DoNotCheckSecurityOnSetter' in extended_attributes:
339 access_control.append('v8::ALL_CAN_WRITE') 375 access_control.append('v8::ALL_CAN_WRITE')
340 if 'DoNotCheckSecurityOnGetter' in extended_attributes: 376 if 'DoNotCheckSecurityOnGetter' in extended_attributes:
341 access_control.append('v8::ALL_CAN_READ') 377 access_control.append('v8::ALL_CAN_READ')
342 if 'Unforgeable' in extended_attributes: 378 if 'Unforgeable' in extended_attributes:
343 access_control.append('v8::PROHIBITS_OVERWRITING') 379 access_control.append('v8::PROHIBITS_OVERWRITING')
344 return access_control or ['v8::DEFAULT'] 380 return access_control or ['v8::DEFAULT']
345 381
346 382
347 # [NotEnumerable], [Unforgeable] 383 # [NotEnumerable], [Unforgeable]
348 def property_attributes(attribute): 384 def property_attributes(attribute):
349 extended_attributes = attribute.extended_attributes 385 extended_attributes = attribute.extended_attributes
350 property_attributes_list = [] 386 property_attributes_list = []
351 if 'NotEnumerable' in extended_attributes: 387 if ('NotEnumerable' in extended_attributes or
388 is_constructor(attribute)):
352 property_attributes_list.append('v8::DontEnum') 389 property_attributes_list.append('v8::DontEnum')
353 if 'Unforgeable' in extended_attributes: 390 if 'Unforgeable' in extended_attributes:
354 property_attributes_list.append('v8::DontDelete') 391 property_attributes_list.append('v8::DontDelete')
355 return property_attributes_list or ['v8::None'] 392 return property_attributes_list or ['v8::None']
356 393
357 394
358 # [PerWorldBindings] 395 def is_constructor(attribute):
359 def getter_callback_name_for_main_world(interface, attribute): 396 return attribute.data_type.endswith('Constructor')
360 if 'PerWorldBindings' not in attribute.extended_attributes:
361 return '0'
362 return '%sV8Internal::%sAttributeGetterCallbackForMainWorld' % (cpp_name(int erface), attribute.name)
363
364
365 def setter_callback_name_for_main_world(interface, attribute):
366 if ('PerWorldBindings' not in attribute.extended_attributes or
367 attribute.is_read_only):
368 return '0'
369 return '%sV8Internal::%sAttributeSetterCallbackForMainWorld' % (cpp_name(int erface), attribute.name)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698