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

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: Rebased 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 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
46 for attribute in interface.attributes] 46 for attribute in interface.attributes]
47 contents = {'attributes': attributes} 47 contents = {'attributes': attributes}
48 contents.update(generate_attributes_common(interface, attributes)) 48 contents.update(generate_attributes_common(interface, attributes))
49 return contents 49 return contents
50 50
51 51
52 def generate_attributes_common(interface, attributes): 52 def generate_attributes_common(interface, attributes):
53 v8_class_name = v8_utilities.v8_class_name(interface) 53 v8_class_name = v8_utilities.v8_class_name(interface)
54 return { 54 return {
55 'has_per_context_enabled_attributes': any(attribute['per_context_enabled _function_name'] for attribute in attributes), 55 'has_per_context_enabled_attributes': any(attribute['per_context_enabled _function_name'] for attribute in attributes),
56 'has_constructor_attributes': any(attribute['is_constructor'] for attrib ute in attributes),
56 'has_replaceable_attributes': any(attribute['is_replaceable'] for attrib ute in attributes), 57 'has_replaceable_attributes': any(attribute['is_replaceable'] for attrib ute in attributes),
57 'has_runtime_enabled_attributes': any(attribute['runtime_enabled_functio n_name'] for attribute in attributes), 58 'has_runtime_enabled_attributes': any(attribute['runtime_enabled_functio n_name'] for attribute in attributes),
58 'installed_attributes': '%sAttributes' % v8_class_name if attributes els e '0', 59 'installed_attributes': '%sAttributes' % v8_class_name if attributes els e '0',
59 # Size 0 constant array is not allowed in VC++ 60 # Size 0 constant array is not allowed in VC++
60 'number_of_attributes': 'WTF_ARRAY_LENGTH(%sAttributes)' % v8_class_name if attributes else '0', 61 'number_of_attributes': 'WTF_ARRAY_LENGTH(%sAttributes)' % v8_class_name if attributes else '0',
61 } 62 }
62 63
63 64
64 def generate_attribute(interface, attribute): 65 def generate_attribute(interface, attribute):
65 idl_type = attribute.data_type 66 idl_type = attribute.data_type
66 extended_attributes = attribute.extended_attributes 67 extended_attributes = attribute.extended_attributes
67 68
68 has_custom_getter = has_extended_attribute(attribute, ('Custom', 'CustomGett er')) 69 has_custom_getter = has_extended_attribute(attribute, ('Custom', 'CustomGett er'))
69 has_custom_setter = not attribute.is_read_only and has_extended_attribute(at tribute, ('Custom', 'CustomSetter')) 70 has_custom_setter = not attribute.is_read_only and has_extended_attribute(at tribute, ('Custom', 'CustomSetter'))
70 contents = { 71 contents = {
71 'access_control_list': access_control_list(attribute), 72 'access_control_list': access_control_list(attribute),
72 'activity_logging_world_list_for_getter': v8_utilities.activity_logging_ world_list(attribute, 'Getter'), # [ActivityLogging] 73 'activity_logging_world_list_for_getter': v8_utilities.activity_logging_ world_list(attribute, 'Getter'), # [ActivityLogging]
73 'activity_logging_world_list_for_setter': v8_utilities.activity_logging_ world_list(attribute, 'Setter'), # [ActivityLogging] 74 'activity_logging_world_list_for_setter': v8_utilities.activity_logging_ world_list(attribute, 'Setter'), # [ActivityLogging]
74 'cached_attribute_validation_method': extended_attributes.get('CachedAtt ribute'), 75 'cached_attribute_validation_method': extended_attributes.get('CachedAtt ribute'),
75 'conditional_string': v8_utilities.generate_conditional_string(attribute ), 76 'conditional_string': v8_utilities.generate_conditional_string(attribute ),
76 'cpp_type': v8_types.cpp_type(idl_type), 77 'cpp_type': v8_types.cpp_type(idl_type),
77 'getter_callback_name': getter_callback_name(interface, attribute), 78 'getter_callback_name': getter_callback_name(interface, attribute),
78 'getter_callback_name_for_main_world': getter_callback_name_for_main_wor ld(interface, attribute), 79 'getter_callback_name_for_main_world': getter_callback_name_for_main_wor ld(interface, attribute),
79 'has_custom_getter': has_custom_getter, 80 'has_custom_getter': has_custom_getter,
80 'has_custom_setter': has_custom_setter, 81 'has_custom_setter': has_custom_setter,
81 'idl_type': idl_type, 82 'idl_type': idl_type,
83 'is_constructor': is_constructor_attribute(attribute),
82 'is_getter_raises_exception': has_extended_attribute(attribute, ('Getter RaisesException', 'RaisesException')), 84 'is_getter_raises_exception': has_extended_attribute(attribute, ('Getter RaisesException', 'RaisesException')),
83 'is_keep_alive_for_gc': is_keep_alive_for_gc(attribute), 85 'is_keep_alive_for_gc': is_keep_alive_for_gc(attribute),
84 'is_nullable': attribute.is_nullable, 86 'is_nullable': attribute.is_nullable,
85 'is_read_only': attribute.is_read_only, 87 'is_read_only': attribute.is_read_only,
86 'is_replaceable': 'Replaceable' in attribute.extended_attributes, 88 'is_replaceable': 'Replaceable' in attribute.extended_attributes,
87 'is_setter_raises_exception': has_extended_attribute(attribute, ('Raises Exception', 'SetterRaisesException')), 89 'is_setter_raises_exception': has_extended_attribute(attribute, ('Raises Exception', 'SetterRaisesException')),
88 'is_static': attribute.is_static, 90 'is_static': attribute.is_static,
89 'name': attribute.name, 91 'name': attribute.name,
90 'per_context_enabled_function_name': v8_utilities.per_context_enabled_fu nction_name(attribute), # [PerContextEnabled] 92 'per_context_enabled_function_name': v8_utilities.per_context_enabled_fu nction_name(attribute), # [PerContextEnabled]
91 'property_attributes': property_attributes(attribute), 93 'property_attributes': property_attributes(attribute),
92 'setter_callback_name': setter_callback_name(interface, attribute), 94 'setter_callback_name': setter_callback_name(interface, attribute),
93 'setter_callback_name_for_main_world': setter_callback_name_for_main_wor ld(interface, attribute), 95 'setter_callback_name_for_main_world': setter_callback_name_for_main_wor ld(interface, attribute),
94 'v8_type': v8_types.v8_type(idl_type), 96 'v8_type': v8_types.v8_type(idl_type),
95 'runtime_enabled_function_name': v8_utilities.runtime_enabled_function_n ame(attribute), # [RuntimeEnabled] 97 'runtime_enabled_function_name': v8_utilities.runtime_enabled_function_n ame(attribute), # [RuntimeEnabled]
96 'world_suffixes': ['', 'ForMainWorld'] if 'PerWorldBindings' in extended _attributes else [''], # [PerWorldBindings] 98 'world_suffixes': ['', 'ForMainWorld'] if 'PerWorldBindings' in extended _attributes else [''], # [PerWorldBindings]
99 'wrapper_type_info': wrapper_type_info(attribute),
97 } 100 }
101 if is_constructor_attribute(attribute):
102 includes.update(v8_types.includes_for_type(idl_type))
103 return contents, includes
98 if not has_custom_getter: 104 if not has_custom_getter:
99 generate_getter(interface, attribute, contents) 105 generate_getter(interface, attribute, contents)
100 if not attribute.is_read_only and not has_custom_setter: 106 if not attribute.is_read_only and not has_custom_setter:
101 generate_setter(interface, attribute, contents) 107 generate_setter(interface, attribute, contents)
102 108
103 return contents 109 return contents
104 110
105 111
112 # Getter
113
106 def generate_getter(interface, attribute, contents): 114 def generate_getter(interface, attribute, contents):
107 idl_type = attribute.data_type 115 idl_type = attribute.data_type
108 v8_types.add_includes_for_type(idl_type) 116 v8_types.add_includes_for_type(idl_type)
109 extended_attributes = attribute.extended_attributes 117 extended_attributes = attribute.extended_attributes
110 118
111 cpp_value = getter_expression(interface, attribute, contents) 119 cpp_value = getter_expression(interface, attribute, contents)
112 # Normally we can inline the function call into the return statement to 120 # Normally we can inline the function call into the return statement to
113 # avoid the overhead of using a Ref<> temporary, but for some cases 121 # avoid the overhead of using a Ref<> temporary, but for some cases
114 # (nullable types, EventHandler, [CachedAttribute], or if there are 122 # (nullable types, EventHandler, [CachedAttribute], or if there are
115 # exceptions), we need to use a local variable. 123 # exceptions), we need to use a local variable.
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
208 not( 216 not(
209 # Node lifetime is managed by object grouping. 217 # Node lifetime is managed by object grouping.
210 v8_types.is_dom_node_type(idl_type) or 218 v8_types.is_dom_node_type(idl_type) or
211 # A self-reference is unnecessary. 219 # A self-reference is unnecessary.
212 attribute.name == 'self' or 220 attribute.name == 'self' or
213 # FIXME: Remove these hard-coded hacks. 221 # FIXME: Remove these hard-coded hacks.
214 idl_type in ['EventHandler', 'Promise', 'Window'] or 222 idl_type in ['EventHandler', 'Promise', 'Window'] or
215 idl_type.startswith('HTML')))) 223 idl_type.startswith('HTML'))))
216 224
217 225
226 # Setter
227
218 def generate_setter(interface, attribute, contents): 228 def generate_setter(interface, attribute, contents):
219 idl_type = attribute.data_type 229 idl_type = attribute.data_type
220 extended_attributes = attribute.extended_attributes 230 extended_attributes = attribute.extended_attributes
221 if v8_types.is_interface_type(idl_type) and not v8_types.array_type(idl_type ): 231 if v8_types.is_interface_type(idl_type) and not v8_types.array_type(idl_type ):
222 cpp_value = 'WTF::getPtr(cppValue)' 232 cpp_value = 'WTF::getPtr(cppValue)'
223 else: 233 else:
224 cpp_value = 'cppValue' 234 cpp_value = 'cppValue'
225 is_reflect = 'Reflect' in extended_attributes 235 is_reflect = 'Reflect' in extended_attributes
226 if is_reflect: 236 if is_reflect:
227 includes.add('core/dom/custom/CustomElementCallbackDispatcher.h') 237 includes.add('core/dom/custom/CustomElementCallbackDispatcher.h')
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
291 includes.add('%s.h' % namespace) 301 includes.add('%s.h' % namespace)
292 return '%s::%sAttr' % (namespace, content_attribute_name) 302 return '%s::%sAttr' % (namespace, content_attribute_name)
293 303
294 304
295 def scoped_name(interface, attribute, base_name): 305 def scoped_name(interface, attribute, base_name):
296 if attribute.is_static: 306 if attribute.is_static:
297 return '%s::%s' % (interface.name, base_name) 307 return '%s::%s' % (interface.name, base_name)
298 return 'imp->%s' % base_name 308 return 'imp->%s' % base_name
299 309
300 310
311 # Attribute configuration
312
301 def getter_callback_name(interface, attribute): 313 def getter_callback_name(interface, attribute):
314 if attribute.data_type.endswith('Constructor'):
315 return '{0}V8Internal::{0}ConstructorGetter'.format(cpp_name(interface))
302 return '%sV8Internal::%sAttributeGetterCallback' % (cpp_name(interface), att ribute.name) 316 return '%sV8Internal::%sAttributeGetterCallback' % (cpp_name(interface), att ribute.name)
303 317
304 318
305 # [Replaceable] 319 # [Replaceable]
306 def setter_callback_name(interface, attribute): 320 def setter_callback_name(interface, attribute):
307 cpp_class_name = cpp_name(interface) 321 cpp_class_name = cpp_name(interface)
308 if 'Replaceable' in attribute.extended_attributes: 322 if ('Replaceable' in attribute.extended_attributes or
323 attribute.data_type.endswith('Constructor')):
324 # FIXME: rename to ForceSetAttributeOnThisCallback, since also used for Constructors
309 return '{0}V8Internal::{0}ReplaceableAttributeSetterCallback'.format(cpp _class_name) 325 return '{0}V8Internal::{0}ReplaceableAttributeSetterCallback'.format(cpp _class_name)
310 # FIXME: support [PutForwards] 326 # FIXME: support [PutForwards]
311 if attribute.is_read_only: 327 if attribute.is_read_only:
312 return '0' 328 return '0'
313 return '%sV8Internal::%sAttributeSetterCallback' % (cpp_class_name, attribut e.name) 329 return '%sV8Internal::%sAttributeSetterCallback' % (cpp_class_name, attribut e.name)
314 330
315 331
332 # [PerWorldBindings]
333 def getter_callback_name_for_main_world(interface, attribute):
334 if 'PerWorldBindings' not in attribute.extended_attributes:
335 return '0'
336 return '%sV8Internal::%sAttributeGetterCallbackForMainWorld' % (cpp_name(int erface), attribute.name)
337
338
339 def setter_callback_name_for_main_world(interface, attribute):
340 if ('PerWorldBindings' not in attribute.extended_attributes or
341 attribute.is_read_only):
342 return '0'
343 return '%sV8Internal::%sAttributeSetterCallbackForMainWorld' % (cpp_name(int erface), attribute.name)
344
345
346 def wrapper_type_info(attribute):
347 if not is_constructor_attribute(attribute):
348 return '0'
349 return '&V8%s::info' % v8_types.constructor_type(attribute.data_type)
350
351
316 # [DoNotCheckSecurity], [DoNotCheckSecurityOnGetter], [DoNotCheckSecurityOnSette r], [Unforgeable] 352 # [DoNotCheckSecurity], [DoNotCheckSecurityOnGetter], [DoNotCheckSecurityOnSette r], [Unforgeable]
317 def access_control_list(attribute): 353 def access_control_list(attribute):
318 extended_attributes = attribute.extended_attributes 354 extended_attributes = attribute.extended_attributes
319 access_control = [] 355 access_control = []
320 if 'DoNotCheckSecurity' in extended_attributes: 356 if 'DoNotCheckSecurity' in extended_attributes:
321 access_control.append('v8::ALL_CAN_READ') 357 access_control.append('v8::ALL_CAN_READ')
322 if not attribute.is_read_only: 358 if not attribute.is_read_only:
323 access_control.append('v8::ALL_CAN_WRITE') 359 access_control.append('v8::ALL_CAN_WRITE')
324 if 'DoNotCheckSecurityOnSetter' in extended_attributes: 360 if 'DoNotCheckSecurityOnSetter' in extended_attributes:
325 access_control.append('v8::ALL_CAN_WRITE') 361 access_control.append('v8::ALL_CAN_WRITE')
326 if 'DoNotCheckSecurityOnGetter' in extended_attributes: 362 if 'DoNotCheckSecurityOnGetter' in extended_attributes:
327 access_control.append('v8::ALL_CAN_READ') 363 access_control.append('v8::ALL_CAN_READ')
328 if 'Unforgeable' in extended_attributes: 364 if 'Unforgeable' in extended_attributes:
329 access_control.append('v8::PROHIBITS_OVERWRITING') 365 access_control.append('v8::PROHIBITS_OVERWRITING')
330 return access_control or ['v8::DEFAULT'] 366 return access_control or ['v8::DEFAULT']
331 367
332 368
333 # [NotEnumerable], [Unforgeable] 369 # [NotEnumerable], [Unforgeable]
334 def property_attributes(attribute): 370 def property_attributes(attribute):
335 extended_attributes = attribute.extended_attributes 371 extended_attributes = attribute.extended_attributes
336 property_attributes_list = [] 372 property_attributes_list = []
337 if 'NotEnumerable' in extended_attributes: 373 if ('NotEnumerable' in extended_attributes or
374 is_constructor_attribute(attribute)):
338 property_attributes_list.append('v8::DontEnum') 375 property_attributes_list.append('v8::DontEnum')
339 if 'Unforgeable' in extended_attributes: 376 if 'Unforgeable' in extended_attributes:
340 property_attributes_list.append('v8::DontDelete') 377 property_attributes_list.append('v8::DontDelete')
341 return property_attributes_list or ['v8::None'] 378 return property_attributes_list or ['v8::None']
342 379
343 380
344 # [PerWorldBindings] 381 def is_constructor_attribute(attribute):
345 def getter_callback_name_for_main_world(interface, attribute): 382 return attribute.data_type.endswith('Constructor')
346 if 'PerWorldBindings' not in attribute.extended_attributes:
347 return '0'
348 return '%sV8Internal::%sAttributeGetterCallbackForMainWorld' % (cpp_name(int erface), attribute.name)
349
350
351 def setter_callback_name_for_main_world(interface, attribute):
352 if ('PerWorldBindings' not in attribute.extended_attributes or
353 attribute.is_read_only):
354 return '0'
355 return '%sV8Internal::%sAttributeSetterCallbackForMainWorld' % (cpp_name(int erface), attribute.name)
OLDNEW
« no previous file with comments | « Source/bindings/scripts/code_generator_v8.pm ('k') | Source/bindings/scripts/unstable/v8_types.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698