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

Side by Side Diff: bindings/scripts/v8_interface.py

Issue 959933002: Move IDLs to 39 roll (Closed) Base URL: https://dart.googlecode.com/svn/third_party/WebCore
Patch Set: Created 5 years, 10 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
« no previous file with comments | « bindings/scripts/v8_dictionary.py ('k') | bindings/scripts/v8_methods.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # Copyright (C) 2013 Google Inc. All rights reserved. 1 # Copyright (C) 2013 Google Inc. All rights reserved.
2 # coding=utf-8 2 # coding=utf-8
3 # 3 #
4 # Redistribution and use in source and binary forms, with or without 4 # Redistribution and use in source and binary forms, with or without
5 # modification, are permitted provided that the following conditions are 5 # modification, are permitted provided that the following conditions are
6 # met: 6 # met:
7 # 7 #
8 # * Redistributions of source code must retain the above copyright 8 # * Redistributions of source code must retain the above copyright
9 # notice, this list of conditions and the following disclaimer. 9 # notice, this list of conditions and the following disclaimer.
10 # * Redistributions in binary form must reproduce the above 10 # * Redistributions in binary form must reproduce the above
(...skipping 28 matching lines...) Expand all
39 import idl_definitions 39 import idl_definitions
40 from idl_definitions import IdlOperation 40 from idl_definitions import IdlOperation
41 import idl_types 41 import idl_types
42 from idl_types import IdlType, inherits_interface 42 from idl_types import IdlType, inherits_interface
43 import v8_attributes 43 import v8_attributes
44 from v8_globals import includes 44 from v8_globals import includes
45 import v8_methods 45 import v8_methods
46 import v8_types 46 import v8_types
47 from v8_types import cpp_ptr_type, cpp_template_type 47 from v8_types import cpp_ptr_type, cpp_template_type
48 import v8_utilities 48 import v8_utilities
49 from v8_utilities import capitalize, conditional_string, cpp_name, gc_type, has_ extended_attribute_value, runtime_enabled_function_name 49 from v8_utilities import (capitalize, conditional_string, cpp_name, gc_type,
50 has_extended_attribute_value, runtime_enabled_function _name,
51 extended_attribute_value_as_list)
50 52
51 53
52 INTERFACE_H_INCLUDES = frozenset([ 54 INTERFACE_H_INCLUDES = frozenset([
53 'bindings/common/ScriptWrappable.h', 55 'bindings/common/ScriptWrappable.h',
54 'bindings/core/v8/V8Binding.h', 56 'bindings/core/v8/V8Binding.h',
55 'bindings/core/v8/V8DOMWrapper.h', 57 'bindings/core/v8/V8DOMWrapper.h',
56 'bindings/core/v8/WrapperTypeInfo.h', 58 'bindings/core/v8/WrapperTypeInfo.h',
57 'platform/heap/Handle.h', 59 'platform/heap/Handle.h',
58 ]) 60 ])
59 INTERFACE_CPP_INCLUDES = frozenset([ 61 INTERFACE_CPP_INCLUDES = frozenset([
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 is_active_dom_object = 'ActiveDOMObject' in extended_attributes 96 is_active_dom_object = 'ActiveDOMObject' in extended_attributes
95 97
96 # [CheckSecurity] 98 # [CheckSecurity]
97 is_check_security = 'CheckSecurity' in extended_attributes 99 is_check_security = 'CheckSecurity' in extended_attributes
98 if is_check_security: 100 if is_check_security:
99 includes.add('bindings/common/BindingSecurity.h') 101 includes.add('bindings/common/BindingSecurity.h')
100 102
101 # [DependentLifetime] 103 # [DependentLifetime]
102 is_dependent_lifetime = 'DependentLifetime' in extended_attributes 104 is_dependent_lifetime = 'DependentLifetime' in extended_attributes
103 105
106 # [Iterable]
107 iterator_method = None
108 if 'Iterable' in extended_attributes:
109 iterator_operation = IdlOperation(interface.idl_name)
110 iterator_operation.name = 'iterator'
111 iterator_operation.idl_type = IdlType('Iterator')
112 iterator_operation.extended_attributes['RaisesException'] = None
113 iterator_operation.extended_attributes['CallWith'] = 'ScriptState'
114 iterator_method = v8_methods.method_context(interface,
115 iterator_operation)
116
104 # [MeasureAs] 117 # [MeasureAs]
105 is_measure_as = 'MeasureAs' in extended_attributes 118 is_measure_as = 'MeasureAs' in extended_attributes
106 if is_measure_as: 119 if is_measure_as:
107 includes.add('core/frame/UseCounter.h') 120 includes.add('core/frame/UseCounter.h')
108 121
109 # [SetWrapperReferenceFrom] 122 # [SetWrapperReferenceFrom]
110 reachable_node_function = extended_attributes.get('SetWrapperReferenceFrom') 123 reachable_node_function = extended_attributes.get('SetWrapperReferenceFrom')
111 if reachable_node_function: 124 if reachable_node_function:
112 includes.update(['bindings/core/v8/V8GCController.h', 125 includes.update(['bindings/core/v8/V8GCController.h',
113 'core/dom/Element.h']) 126 'core/dom/Element.h'])
114 127
115 # [SetWrapperReferenceTo] 128 # [SetWrapperReferenceTo]
116 set_wrapper_reference_to_list = [{ 129 set_wrapper_reference_to_list = [{
117 'name': argument.name, 130 'name': argument.name,
118 # FIXME: properly should be: 131 # FIXME: properly should be:
119 # 'cpp_type': argument.idl_type.cpp_type_args(raw_type=True), 132 # 'cpp_type': argument.idl_type.cpp_type_args(raw_type=True),
120 # (if type is non-wrapper type like NodeFilter, normally RefPtr) 133 # (if type is non-wrapper type like NodeFilter, normally RefPtr)
121 # Raw pointers faster though, and NodeFilter hacky anyway. 134 # Raw pointers faster though, and NodeFilter hacky anyway.
122 'cpp_type': argument.idl_type.implemented_as + '*', 135 'cpp_type': argument.idl_type.implemented_as + '*',
123 'idl_type': argument.idl_type, 136 'idl_type': argument.idl_type,
124 'v8_type': v8_types.v8_type(argument.idl_type.name), 137 'v8_type': v8_types.v8_type(argument.idl_type.name),
125 } for argument in extended_attributes.get('SetWrapperReferenceTo', [])] 138 } for argument in extended_attributes.get('SetWrapperReferenceTo', [])]
126 for set_wrapper_reference_to in set_wrapper_reference_to_list: 139 for set_wrapper_reference_to in set_wrapper_reference_to_list:
127 set_wrapper_reference_to['idl_type'].add_includes_for_type() 140 set_wrapper_reference_to['idl_type'].add_includes_for_type()
128 141
142 # [NotScriptWrappable]
143 is_script_wrappable = 'NotScriptWrappable' not in extended_attributes
144
129 # [SpecialWrapFor] 145 # [SpecialWrapFor]
130 if 'SpecialWrapFor' in extended_attributes: 146 if 'SpecialWrapFor' in extended_attributes:
131 special_wrap_for = extended_attributes['SpecialWrapFor'].split('|') 147 special_wrap_for = extended_attribute_value_as_list(interface, 'SpecialW rapFor')
132 else: 148 else:
133 special_wrap_for = [] 149 special_wrap_for = []
134 for special_wrap_interface in special_wrap_for: 150 for special_wrap_interface in special_wrap_for:
135 v8_types.add_includes_for_interface(special_wrap_interface) 151 v8_types.add_includes_for_interface(special_wrap_interface)
136 152
137 # [Custom=Wrap], [SetWrapperReferenceFrom] 153 # [Custom=Wrap], [SetWrapperReferenceFrom]
138 has_visit_dom_wrapper = ( 154 has_visit_dom_wrapper = (
139 has_extended_attribute_value(interface, 'Custom', 'VisitDOMWrapper') or 155 has_extended_attribute_value(interface, 'Custom', 'VisitDOMWrapper') or
140 reachable_node_function or 156 reachable_node_function or
141 set_wrapper_reference_to_list) 157 set_wrapper_reference_to_list)
142 158
143 this_gc_type = gc_type(interface) 159 this_gc_type = gc_type(interface)
144 160
161 wrapper_class_id = ('NodeClassId' if inherits_interface(interface.name, 'Nod e') else 'ObjectClassId')
162
145 context = { 163 context = {
146 'conditional_string': conditional_string(interface), # [Conditional] 164 'conditional_string': conditional_string(interface), # [Conditional]
147 'cpp_class': cpp_name(interface), 165 'cpp_class': cpp_name(interface),
148 'gc_type': this_gc_type, 166 'gc_type': this_gc_type,
167 # FIXME: Remove 'EventTarget' special handling, http://crbug.com/383699
168 'has_access_check_callbacks': (is_check_security and
169 interface.name != 'Window' and
170 interface.name != 'EventTarget'),
149 'has_custom_legacy_call_as_function': has_extended_attribute_value(inter face, 'Custom', 'LegacyCallAsFunction'), # [Custom=LegacyCallAsFunction] 171 'has_custom_legacy_call_as_function': has_extended_attribute_value(inter face, 'Custom', 'LegacyCallAsFunction'), # [Custom=LegacyCallAsFunction]
150 'has_custom_to_v8': has_extended_attribute_value(interface, 'Custom', 'T oV8'), # [Custom=ToV8] 172 'has_custom_to_v8': has_extended_attribute_value(interface, 'Custom', 'T oV8'), # [Custom=ToV8]
151 'has_custom_wrap': has_extended_attribute_value(interface, 'Custom', 'Wr ap'), # [Custom=Wrap] 173 'has_custom_wrap': has_extended_attribute_value(interface, 'Custom', 'Wr ap'), # [Custom=Wrap]
152 'has_visit_dom_wrapper': has_visit_dom_wrapper, 174 'has_visit_dom_wrapper': has_visit_dom_wrapper,
153 'header_includes': header_includes, 175 'header_includes': header_includes,
154 'interface_name': interface.name, 176 'interface_name': interface.name,
155 'is_active_dom_object': is_active_dom_object, 177 'is_active_dom_object': is_active_dom_object,
156 'is_audio_buffer': is_audio_buffer, 178 'is_audio_buffer': is_audio_buffer,
157 'is_check_security': is_check_security, 179 'is_check_security': is_check_security,
158 'is_dependent_lifetime': is_dependent_lifetime, 180 'is_dependent_lifetime': is_dependent_lifetime,
159 'is_document': is_document, 181 'is_document': is_document,
160 'is_event_target': inherits_interface(interface.name, 'EventTarget'), 182 'is_event_target': inherits_interface(interface.name, 'EventTarget'),
161 'is_exception': interface.is_exception, 183 'is_exception': interface.is_exception,
162 'is_node': inherits_interface(interface.name, 'Node'), 184 'is_node': inherits_interface(interface.name, 'Node'),
185 'is_script_wrappable': is_script_wrappable,
186 'iterator_method': iterator_method,
187 'lifetime': 'Dependent'
188 if (has_visit_dom_wrapper or
189 is_active_dom_object or
190 is_dependent_lifetime)
191 else 'Independent',
163 'measure_as': v8_utilities.measure_as(interface), # [MeasureAs] 192 'measure_as': v8_utilities.measure_as(interface), # [MeasureAs]
164 'parent_interface': parent_interface, 193 'parent_interface': parent_interface,
165 'pass_cpp_type': cpp_template_type( 194 'pass_cpp_type': cpp_template_type(
166 cpp_ptr_type('PassRefPtr', 'RawPtr', this_gc_type), 195 cpp_ptr_type('PassRefPtr', 'RawPtr', this_gc_type),
167 cpp_name(interface)), 196 cpp_name(interface)),
168 'reachable_node_function': reachable_node_function, 197 'reachable_node_function': reachable_node_function,
169 'runtime_enabled_function': runtime_enabled_function_name(interface), # [RuntimeEnabled] 198 'runtime_enabled_function': runtime_enabled_function_name(interface), # [RuntimeEnabled]
170 'set_wrapper_reference_to_list': set_wrapper_reference_to_list, 199 'set_wrapper_reference_to_list': set_wrapper_reference_to_list,
171 'special_wrap_for': special_wrap_for, 200 'special_wrap_for': special_wrap_for,
172 'v8_class': v8_utilities.v8_class_name(interface), 201 'v8_class': v8_utilities.v8_class_name(interface),
173 'wrapper_configuration': 'WrapperConfiguration::Dependent' 202 'wrapper_class_id': wrapper_class_id,
174 if (has_visit_dom_wrapper or
175 is_active_dom_object or
176 is_dependent_lifetime)
177 else 'WrapperConfiguration::Independent',
178 } 203 }
179 204
180 # Constructors 205 # Constructors
181 constructors = [constructor_context(interface, constructor) 206 constructors = [constructor_context(interface, constructor)
182 for constructor in interface.constructors 207 for constructor in interface.constructors
183 # FIXME: shouldn't put named constructors with constructors 208 # FIXME: shouldn't put named constructors with constructors
184 # (currently needed for Perl compatibility) 209 # (currently needed for Perl compatibility)
185 # Handle named constructors separately 210 # Handle named constructors separately
186 if constructor.name == 'Constructor'] 211 if constructor.name == 'Constructor']
187 if len(constructors) > 1: 212 if len(constructors) > 1:
(...skipping 26 matching lines...) Expand all
214 'any_type_attributes': any_type_attributes, 239 'any_type_attributes': any_type_attributes,
215 'constructors': constructors, 240 'constructors': constructors,
216 'has_custom_constructor': bool(custom_constructors), 241 'has_custom_constructor': bool(custom_constructors),
217 'has_event_constructor': has_event_constructor, 242 'has_event_constructor': has_event_constructor,
218 'interface_length': 243 'interface_length':
219 interface_length(interface, constructors + custom_constructors), 244 interface_length(interface, constructors + custom_constructors),
220 'is_constructor_raises_exception': extended_attributes.get('RaisesExcept ion') == 'Constructor', # [RaisesException=Constructor] 245 'is_constructor_raises_exception': extended_attributes.get('RaisesExcept ion') == 'Constructor', # [RaisesException=Constructor]
221 'named_constructor': named_constructor, 246 'named_constructor': named_constructor,
222 }) 247 })
223 248
249 constants = [constant_context(constant) for constant in interface.constants]
250
251 special_getter_constants = []
252 runtime_enabled_constants = []
253 constant_configuration_constants = []
254
255 for constant in constants:
256 if constant['measure_as'] or constant['deprecate_as']:
257 special_getter_constants.append(constant)
258 continue
259 if constant['runtime_enabled_function']:
260 runtime_enabled_constants.append(constant)
261 continue
262 constant_configuration_constants.append(constant)
263
224 # Constants 264 # Constants
225 context.update({ 265 context.update({
226 'constants': [constant_context(constant) 266 'constant_configuration_constants': constant_configuration_constants,
227 for constant in interface.constants], 267 'constants': constants,
228 'do_not_check_constants': 'DoNotCheckConstants' in extended_attributes, 268 'do_not_check_constants': 'DoNotCheckConstants' in extended_attributes,
269 'has_constant_configuration': any(
270 not constant['runtime_enabled_function']
271 for constant in constants),
272 'runtime_enabled_constants': runtime_enabled_constants,
273 'special_getter_constants': special_getter_constants,
229 }) 274 })
230 275
231 # Attributes 276 # Attributes
232 attributes = [v8_attributes.attribute_context(interface, attribute) 277 attributes = [v8_attributes.attribute_context(interface, attribute)
233 for attribute in interface.attributes 278 for attribute in interface.attributes
234 if not v8_utilities.dart_custom_method(attribute.extended_attr ibutes)] 279 if not v8_utilities.dart_custom_method(attribute.extended_attr ibutes)]
235 context.update({ 280 context.update({
236 'attributes': attributes, 281 'attributes': attributes,
237 'has_accessors': any(attribute['is_expose_js_accessors'] and attribute[' should_be_exposed_to_script'] for attribute in attributes), 282 'has_accessors': any(attribute['is_expose_js_accessors'] and attribute[' should_be_exposed_to_script'] for attribute in attributes),
238 'has_attribute_configuration': any( 283 'has_attribute_configuration': any(
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
332 'named_property_getter': named_property_getter(interface), 377 'named_property_getter': named_property_getter(interface),
333 'named_property_setter': named_property_setter(interface), 378 'named_property_setter': named_property_setter(interface),
334 'named_property_deleter': named_property_deleter(interface), 379 'named_property_deleter': named_property_deleter(interface),
335 }) 380 })
336 381
337 return context 382 return context
338 383
339 384
340 # [DeprecateAs], [Reflect], [RuntimeEnabled] 385 # [DeprecateAs], [Reflect], [RuntimeEnabled]
341 def constant_context(constant): 386 def constant_context(constant):
342 # (Blink-only) string literals are unquoted in tokenizer, must be re-quoted
343 # in C++.
344 if constant.idl_type.name == 'String':
345 value = '"%s"' % constant.value
346 else:
347 value = constant.value
348
349 extended_attributes = constant.extended_attributes 387 extended_attributes = constant.extended_attributes
350 return { 388 return {
351 'cpp_class': extended_attributes.get('PartialInterfaceImplementedAs'), 389 'cpp_class': extended_attributes.get('PartialInterfaceImplementedAs'),
390 'deprecate_as': v8_utilities.deprecate_as(constant), # [DeprecateAs]
352 'idl_type': constant.idl_type.name, 391 'idl_type': constant.idl_type.name,
392 'measure_as': v8_utilities.measure_as(constant), # [MeasureAs]
353 'name': constant.name, 393 'name': constant.name,
354 # FIXME: use 'reflected_name' as correct 'name' 394 # FIXME: use 'reflected_name' as correct 'name'
355 'reflected_name': extended_attributes.get('Reflect', constant.name), 395 'reflected_name': extended_attributes.get('Reflect', constant.name),
356 'runtime_enabled_function': runtime_enabled_function_name(constant), 396 'runtime_enabled_function': runtime_enabled_function_name(constant),
357 'value': value, 397 'value': constant.value,
358 } 398 }
359 399
360 400
361 ################################################################################ 401 ################################################################################
362 # Overloads 402 # Overloads
363 ################################################################################ 403 ################################################################################
364 404
365 def compute_method_overloads_context(methods): 405 def compute_method_overloads_context(methods):
366 # Regular methods 406 # Regular methods
367 compute_method_overloads_context_by_type([method for method in methods 407 compute_method_overloads_context_by_type([method for method in methods
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
435 # of the extended attributes in question. 475 # of the extended attributes in question.
436 if not overloads[0].get('is_constructor'): 476 if not overloads[0].get('is_constructor'):
437 overload_extended_attributes = [ 477 overload_extended_attributes = [
438 method['custom_registration_extended_attributes'] 478 method['custom_registration_extended_attributes']
439 for method in overloads] 479 for method in overloads]
440 for extended_attribute in v8_methods.CUSTOM_REGISTRATION_EXTENDED_ATTRIB UTES: 480 for extended_attribute in v8_methods.CUSTOM_REGISTRATION_EXTENDED_ATTRIB UTES:
441 if common_key(overload_extended_attributes, extended_attribute) is N one: 481 if common_key(overload_extended_attributes, extended_attribute) is N one:
442 raise ValueError('Overloads of %s have conflicting extended attr ibute %s' 482 raise ValueError('Overloads of %s have conflicting extended attr ibute %s'
443 % (name, extended_attribute)) 483 % (name, extended_attribute))
444 484
485 # Check and fail if overloads disagree about whether the return type
486 # is a Promise or not.
487 promise_overload_count = sum(1 for method in overloads if method.get('idl_ty pe') == 'Promise')
488 if promise_overload_count not in (0, len(overloads)):
489 raise ValueError('Overloads of %s have conflicting Promise/non-Promise t ypes'
490 % (name))
491
445 return { 492 return {
446 'deprecate_all_as': common_value(overloads, 'deprecate_as'), # [Depreca teAs] 493 'deprecate_all_as': common_value(overloads, 'deprecate_as'), # [Depreca teAs]
447 'exposed_test_all': common_value(overloads, 'exposed_test'), # [Exposed ] 494 'exposed_test_all': common_value(overloads, 'exposed_test'), # [Exposed ]
448 'has_custom_registration_all': common_value(overloads, 'has_custom_regis tration'), 495 'has_custom_registration_all': common_value(overloads, 'has_custom_regis tration'),
449 'length_tests_methods': length_tests_methods(effective_overloads_by_leng th), 496 'length_tests_methods': length_tests_methods(effective_overloads_by_leng th),
450 # 1. Let maxarg be the length of the longest type list of the 497 # 1. Let maxarg be the length of the longest type list of the
451 # entries in S. 498 # entries in S.
452 'maxarg': lengths[-1], 499 'maxarg': lengths[-1],
453 'measure_all_as': common_value(overloads, 'measure_as'), # [MeasureAs] 500 'measure_all_as': common_value(overloads, 'measure_as'), # [MeasureAs]
454 'minarg': lengths[0], 501 'minarg': lengths[0],
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
729 test = 'V8{idl_type}::hasInstance({cpp_value}, info.GetIsolate())'.forma t(idl_type=idl_type.base_type, cpp_value=cpp_value) 776 test = 'V8{idl_type}::hasInstance({cpp_value}, info.GetIsolate())'.forma t(idl_type=idl_type.base_type, cpp_value=cpp_value)
730 yield test, method 777 yield test, method
731 778
732 # 8. Otherwise: if V is any kind of object except for a native Date object, 779 # 8. Otherwise: if V is any kind of object except for a native Date object,
733 # a native RegExp object, and there is an entry in S that has one of the 780 # a native RegExp object, and there is an entry in S that has one of the
734 # following types at position i of its type list, 781 # following types at position i of its type list,
735 # • an array type 782 # • an array type
736 # • a sequence type 783 # • a sequence type
737 # ... 784 # ...
738 # • a dictionary 785 # • a dictionary
739 try: 786 #
740 # FIXME: IDL dictionary not implemented, so use Blink Dictionary 787 # FIXME:
741 # http://crbug.com/321462 788 # We don't strictly follow the algorithm here. The algorithm says "remove
742 idl_type, method = next((idl_type, method) 789 # all other entries" if there is "one entry" matching, but we yield all
743 for idl_type, method in idl_types_methods 790 # entries to support following constructors:
744 if (idl_type.native_array_element_type or 791 # [constructor(sequence<DOMString> arg), constructor(Dictionary arg)]
745 idl_type.name == 'Dictionary')) 792 # interface I { ... }
793 # (Need to check array types before objects because an array is an object)
794 for idl_type, method in idl_types_methods:
746 if idl_type.native_array_element_type: 795 if idl_type.native_array_element_type:
747 # (We test for Array instead of generic Object to type-check.) 796 # (We test for Array instead of generic Object to type-check.)
748 # FIXME: test for Object during resolution, then have type check for 797 # FIXME: test for Object during resolution, then have type check for
749 # Array in overloaded method: http://crbug.com/262383 798 # Array in overloaded method: http://crbug.com/262383
750 test = '%s->IsArray()' % cpp_value 799 yield '%s->IsArray()' % cpp_value, method
751 else: 800 for idl_type, method in idl_types_methods:
801 if idl_type.is_dictionary or idl_type.name == 'Dictionary':
752 # FIXME: should be '{1}->IsObject() && !{1}->IsDate() && !{1}->IsReg Exp()'.format(cpp_value) 802 # FIXME: should be '{1}->IsObject() && !{1}->IsDate() && !{1}->IsReg Exp()'.format(cpp_value)
753 # FIXME: the IsDate and IsRegExp checks can be skipped if we've 803 # FIXME: the IsDate and IsRegExp checks can be skipped if we've
754 # already generated tests for them. 804 # already generated tests for them.
755 test = '%s->IsObject()' % cpp_value 805 yield '%s->IsObject()' % cpp_value, method
756 yield test, method
757 except StopIteration:
758 pass
759 806
760 # (Check for exact type matches before performing automatic type conversion; 807 # (Check for exact type matches before performing automatic type conversion;
761 # only needed if distinguishing between primitive types.) 808 # only needed if distinguishing between primitive types.)
762 if len([idl_type.is_primitive_type for idl_type in idl_types]) > 1: 809 if len([idl_type.is_primitive_type for idl_type in idl_types]) > 1:
763 # (Only needed if match in step 11, otherwise redundant.) 810 # (Only needed if match in step 11, otherwise redundant.)
764 if any(idl_type.is_string_type or idl_type.is_enum 811 if any(idl_type.is_string_type or idl_type.is_enum
765 for idl_type in idl_types): 812 for idl_type in idl_types):
766 # 10. Otherwise: if V is a Number value, and there is an entry in S 813 # 10. Otherwise: if V is a Number value, and there is an entry in S
767 # that has one of the following types at position i of its type 814 # that has one of the following types at position i of its type
768 # list, 815 # list,
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
851 l.sort(key=key) 898 l.sort(key=key)
852 return ((k, list(g)) for k, g in itertools.groupby(l, key)) 899 return ((k, list(g)) for k, g in itertools.groupby(l, key))
853 900
854 901
855 ################################################################################ 902 ################################################################################
856 # Constructors 903 # Constructors
857 ################################################################################ 904 ################################################################################
858 905
859 # [Constructor] 906 # [Constructor]
860 def constructor_context(interface, constructor): 907 def constructor_context(interface, constructor):
861 arguments_need_try_catch = any(v8_methods.argument_needs_try_catch(argument, return_promise=False)
862 for argument in constructor.arguments)
863
864 # [RaisesException=Constructor] 908 # [RaisesException=Constructor]
865 is_constructor_raises_exception = \ 909 is_constructor_raises_exception = \
866 interface.extended_attributes.get('RaisesException') == 'Constructor' 910 interface.extended_attributes.get('RaisesException') == 'Constructor'
867 911
868 return { 912 return {
869 'arguments': [v8_methods.argument_context(interface, constructor, argume nt, index) 913 'arguments': [v8_methods.argument_context(interface, constructor, argume nt, index)
870 for index, argument in enumerate(constructor.arguments)], 914 for index, argument in enumerate(constructor.arguments)],
871 'arguments_need_try_catch': arguments_need_try_catch,
872 'cpp_type': cpp_template_type( 915 'cpp_type': cpp_template_type(
873 cpp_ptr_type('RefPtr', 'RawPtr', gc_type(interface)), 916 cpp_ptr_type('RefPtr', 'RawPtr', gc_type(interface)),
874 cpp_name(interface)), 917 cpp_name(interface)),
875 'cpp_value': v8_methods.cpp_value( 918 'cpp_value': v8_methods.cpp_value(
876 interface, constructor, len(constructor.arguments)), 919 interface, constructor, len(constructor.arguments)),
877 'has_exception_state': 920 'has_exception_state':
878 is_constructor_raises_exception or 921 is_constructor_raises_exception or
879 any(argument for argument in constructor.arguments 922 any(argument for argument in constructor.arguments
880 if argument.idl_type.name == 'SerializedScriptValue' or 923 if argument.idl_type.name == 'SerializedScriptValue' or
881 argument.idl_type.may_raise_exception_on_conversion), 924 argument.idl_type.v8_conversion_needs_exception_state),
882 'is_call_with_document': 925 'is_call_with_document':
883 # [ConstructorCallWith=Document] 926 # [ConstructorCallWith=Document]
884 has_extended_attribute_value(interface, 927 has_extended_attribute_value(interface,
885 'ConstructorCallWith', 'Document'), 928 'ConstructorCallWith', 'Document'),
886 'is_call_with_execution_context': 929 'is_call_with_execution_context':
887 # [ConstructorCallWith=ExecutionContext] 930 # [ConstructorCallWith=ExecutionContext]
888 has_extended_attribute_value(interface, 931 has_extended_attribute_value(interface,
889 'ConstructorCallWith', 'ExecutionContext'), 932 'ConstructorCallWith', 'ExecutionContext'),
890 'is_constructor': True, 933 'is_constructor': True,
891 'is_named_constructor': False, 934 'is_named_constructor': False,
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
985 def property_setter(setter): 1028 def property_setter(setter):
986 idl_type = setter.arguments[1].idl_type 1029 idl_type = setter.arguments[1].idl_type
987 extended_attributes = setter.extended_attributes 1030 extended_attributes = setter.extended_attributes
988 is_raises_exception = 'RaisesException' in extended_attributes 1031 is_raises_exception = 'RaisesException' in extended_attributes
989 return { 1032 return {
990 'has_type_checking_interface': 1033 'has_type_checking_interface':
991 has_extended_attribute_value(setter, 'TypeChecking', 'Interface') an d 1034 has_extended_attribute_value(setter, 'TypeChecking', 'Interface') an d
992 idl_type.is_wrapper_type, 1035 idl_type.is_wrapper_type,
993 'idl_type': idl_type.base_type, 1036 'idl_type': idl_type.base_type,
994 'is_custom': 'Custom' in extended_attributes, 1037 'is_custom': 'Custom' in extended_attributes,
995 'has_exception_state': is_raises_exception or 1038 'has_exception_state': (is_raises_exception or
996 idl_type.is_integer_type, 1039 idl_type.v8_conversion_needs_exception_state),
997 'is_raises_exception': is_raises_exception, 1040 'is_raises_exception': is_raises_exception,
998 'name': cpp_name(setter), 1041 'name': cpp_name(setter),
999 'v8_value_to_local_cpp_value': idl_type.v8_value_to_local_cpp_value( 1042 'v8_value_to_local_cpp_value': idl_type.v8_value_to_local_cpp_value(
1000 extended_attributes, 'v8Value', 'propertyValue'), 1043 extended_attributes, 'v8Value', 'propertyValue'),
1001 } 1044 }
1002 1045
1003 1046
1004 def property_deleter(deleter): 1047 def property_deleter(deleter):
1005 idl_type = deleter.idl_type 1048 idl_type = deleter.idl_type
1006 if str(idl_type) != 'boolean': 1049 if str(idl_type) != 'boolean':
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
1113 deleter = next( 1156 deleter = next(
1114 method 1157 method
1115 for method in interface.operations 1158 for method in interface.operations
1116 if ('deleter' in method.specials and 1159 if ('deleter' in method.specials and
1117 len(method.arguments) == 1 and 1160 len(method.arguments) == 1 and
1118 str(method.arguments[0].idl_type) == 'DOMString')) 1161 str(method.arguments[0].idl_type) == 'DOMString'))
1119 except StopIteration: 1162 except StopIteration:
1120 return None 1163 return None
1121 1164
1122 return property_deleter(deleter) 1165 return property_deleter(deleter)
OLDNEW
« no previous file with comments | « bindings/scripts/v8_dictionary.py ('k') | bindings/scripts/v8_methods.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698