OLD | NEW |
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 Loading... |
39 from operator import itemgetter, or_ | 39 from operator import itemgetter, or_ |
40 | 40 |
41 from idl_definitions import IdlOperation, IdlArgument | 41 from idl_definitions import IdlOperation, IdlArgument |
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 import v8_utilities | 47 import v8_utilities |
48 from v8_utilities import (cpp_name_or_partial, cpp_name, has_extended_attribute_
value, | 48 from v8_utilities import (cpp_name_or_partial, cpp_name, has_extended_attribute_
value, |
49 runtime_enabled_function_name, is_legacy_interface_typ
e_checking) | 49 runtime_enabled_feature_name, is_legacy_interface_type
_checking) |
50 | 50 |
51 | 51 |
52 INTERFACE_H_INCLUDES = frozenset([ | 52 INTERFACE_H_INCLUDES = frozenset([ |
53 'bindings/core/v8/ScriptWrappable.h', | 53 'bindings/core/v8/ScriptWrappable.h', |
54 'bindings/core/v8/ToV8.h', | 54 'bindings/core/v8/ToV8.h', |
55 'bindings/core/v8/V8Binding.h', | 55 'bindings/core/v8/V8Binding.h', |
56 'bindings/core/v8/V8DOMWrapper.h', | 56 'bindings/core/v8/V8DOMWrapper.h', |
57 'bindings/core/v8/WrapperTypeInfo.h', | 57 'bindings/core/v8/WrapperTypeInfo.h', |
58 'platform/heap/Handle.h', | 58 'platform/heap/Handle.h', |
59 ]) | 59 ]) |
60 INTERFACE_CPP_INCLUDES = frozenset([ | 60 INTERFACE_CPP_INCLUDES = frozenset([ |
61 'bindings/core/v8/ExceptionState.h', | 61 'bindings/core/v8/ExceptionState.h', |
62 'bindings/core/v8/GeneratedCodeHelper.h', | 62 'bindings/core/v8/GeneratedCodeHelper.h', |
63 'bindings/core/v8/V8DOMConfiguration.h', | 63 'bindings/core/v8/V8DOMConfiguration.h', |
64 'bindings/core/v8/V8ObjectConstructor.h', | 64 'bindings/core/v8/V8ObjectConstructor.h', |
65 'core/dom/Document.h', | 65 'core/dom/Document.h', |
66 'wtf/GetPtr.h', | 66 'wtf/GetPtr.h', |
67 'wtf/RefPtr.h', | 67 'wtf/RefPtr.h', |
68 ]) | 68 ]) |
69 | 69 |
70 | 70 |
71 def filter_has_constant_configuration(constants): | 71 def filter_has_constant_configuration(constants): |
72 return [constant for constant in constants if | 72 return [constant for constant in constants if |
73 not constant['measure_as'] and | 73 not constant['measure_as'] and |
74 not constant['deprecate_as'] and | 74 not constant['deprecate_as'] and |
75 not constant['runtime_enabled_function'] and | 75 not constant['runtime_enabled_feature_name'] and |
76 not constant['origin_trial_feature_name']] | 76 not constant['origin_trial_feature_name']] |
77 | 77 |
78 | 78 |
79 def filter_has_special_getter(constants): | 79 def filter_has_special_getter(constants): |
80 return [constant for constant in constants if | 80 return [constant for constant in constants if |
81 constant['measure_as'] or | 81 constant['measure_as'] or |
82 constant['deprecate_as']] | 82 constant['deprecate_as']] |
83 | 83 |
84 | 84 |
85 def filter_runtime_enabled(constants): | 85 def filter_runtime_enabled(constants): |
86 return [constant for constant in constants if | 86 return [constant for constant in constants if |
87 constant['runtime_enabled_function']] | 87 constant['runtime_enabled_feature_name']] |
88 | 88 |
89 | 89 |
90 def filter_origin_trial_enabled(constants): | 90 def filter_origin_trial_enabled(constants): |
91 return [constant for constant in constants if | 91 return [constant for constant in constants if |
92 constant['origin_trial_feature_name']] | 92 constant['origin_trial_feature_name']] |
93 | 93 |
94 | 94 |
95 def constant_filters(): | 95 def constant_filters(): |
96 return {'has_constant_configuration': filter_has_constant_configuration, | 96 return {'has_constant_configuration': filter_has_constant_configuration, |
97 'has_special_getter': filter_has_special_getter, | 97 'has_special_getter': filter_has_special_getter, |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
276 'is_immutable_prototype': is_immutable_prototype, | 276 'is_immutable_prototype': is_immutable_prototype, |
277 'is_node': inherits_interface(interface.name, 'Node'), | 277 'is_node': inherits_interface(interface.name, 'Node'), |
278 'is_partial': interface.is_partial, | 278 'is_partial': interface.is_partial, |
279 'is_typed_array_type': is_typed_array_type, | 279 'is_typed_array_type': is_typed_array_type, |
280 'lifetime': 'Dependent' if (has_visit_dom_wrapper or is_dependent_lifeti
me) else 'Independent', | 280 'lifetime': 'Dependent' if (has_visit_dom_wrapper or is_dependent_lifeti
me) else 'Independent', |
281 'measure_as': v8_utilities.measure_as(interface, None), # [MeasureAs] | 281 'measure_as': v8_utilities.measure_as(interface, None), # [MeasureAs] |
282 'origin_trial_enabled_function': v8_utilities.origin_trial_enabled_funct
ion_name(interface), | 282 'origin_trial_enabled_function': v8_utilities.origin_trial_enabled_funct
ion_name(interface), |
283 'parent_interface': parent_interface, | 283 'parent_interface': parent_interface, |
284 'pass_cpp_type': cpp_name(interface) + '*', | 284 'pass_cpp_type': cpp_name(interface) + '*', |
285 'active_scriptwrappable': active_scriptwrappable, | 285 'active_scriptwrappable': active_scriptwrappable, |
286 'runtime_enabled_function': runtime_enabled_function_name(interface), #
[RuntimeEnabled] | 286 'runtime_enabled_feature_name': runtime_enabled_feature_name(interface),
# [RuntimeEnabled] |
287 'set_wrapper_reference_from': set_wrapper_reference_from, | 287 'set_wrapper_reference_from': set_wrapper_reference_from, |
288 'set_wrapper_reference_to': set_wrapper_reference_to, | 288 'set_wrapper_reference_to': set_wrapper_reference_to, |
289 'v8_class': v8_class_name, | 289 'v8_class': v8_class_name, |
290 'v8_class_or_partial': v8_class_name_or_partial, | 290 'v8_class_or_partial': v8_class_name_or_partial, |
291 'wrapper_class_id': wrapper_class_id, | 291 'wrapper_class_id': wrapper_class_id, |
292 } | 292 } |
293 | 293 |
294 # Constructors | 294 # Constructors |
295 constructors = [constructor_context(interface, constructor) | 295 constructors = [constructor_context(interface, constructor) |
296 for constructor in interface.constructors | 296 for constructor in interface.constructors |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
330 includes.add('core/frame/LocalDOMWindow.h') | 330 includes.add('core/frame/LocalDOMWindow.h') |
331 elif 'Measure' in extended_attributes or 'MeasureAs' in extended_attributes: | 331 elif 'Measure' in extended_attributes or 'MeasureAs' in extended_attributes: |
332 if not interface.is_partial: | 332 if not interface.is_partial: |
333 raise Exception('[Measure] or [MeasureAs] specified for interface wi
thout a constructor: ' | 333 raise Exception('[Measure] or [MeasureAs] specified for interface wi
thout a constructor: ' |
334 '%s' % interface.name) | 334 '%s' % interface.name) |
335 | 335 |
336 # [Unscopable] attributes and methods | 336 # [Unscopable] attributes and methods |
337 unscopables = [] | 337 unscopables = [] |
338 for attribute in interface.attributes: | 338 for attribute in interface.attributes: |
339 if 'Unscopable' in attribute.extended_attributes: | 339 if 'Unscopable' in attribute.extended_attributes: |
340 unscopables.append((attribute.name, v8_utilities.runtime_enabled_fun
ction_name(attribute))) | 340 unscopables.append((attribute.name, runtime_enabled_feature_name(att
ribute))) |
341 for method in interface.operations: | 341 for method in interface.operations: |
342 if 'Unscopable' in method.extended_attributes: | 342 if 'Unscopable' in method.extended_attributes: |
343 unscopables.append((method.name, v8_utilities.runtime_enabled_functi
on_name(method))) | 343 unscopables.append((method.name, runtime_enabled_feature_name(method
))) |
344 | 344 |
345 # [CEReactions] | 345 # [CEReactions] |
346 setter_or_deleters = ( | 346 setter_or_deleters = ( |
347 interface.indexed_property_setter, | 347 interface.indexed_property_setter, |
348 interface.indexed_property_deleter, | 348 interface.indexed_property_deleter, |
349 interface.named_property_setter, | 349 interface.named_property_setter, |
350 interface.named_property_deleter, | 350 interface.named_property_deleter, |
351 ) | 351 ) |
352 has_ce_reactions = any(setter_or_deleter and 'CEReactions' in setter_or_dele
ter.extended_attributes | 352 has_ce_reactions = any(setter_or_deleter and 'CEReactions' in setter_or_dele
ter.extended_attributes |
353 for setter_or_deleter in setter_or_deleters) | 353 for setter_or_deleter in setter_or_deleters) |
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
714 return { | 714 return { |
715 'cpp_class': extended_attributes.get('PartialInterfaceImplementedAs'), | 715 'cpp_class': extended_attributes.get('PartialInterfaceImplementedAs'), |
716 'deprecate_as': v8_utilities.deprecate_as(constant), # [DeprecateAs] | 716 'deprecate_as': v8_utilities.deprecate_as(constant), # [DeprecateAs] |
717 'idl_type': constant.idl_type.name, | 717 'idl_type': constant.idl_type.name, |
718 'measure_as': v8_utilities.measure_as(constant, interface), # [MeasureA
s] | 718 'measure_as': v8_utilities.measure_as(constant, interface), # [MeasureA
s] |
719 'name': constant.name, | 719 'name': constant.name, |
720 'origin_trial_enabled_function': v8_utilities.origin_trial_enabled_funct
ion_name(constant), # [OriginTrialEnabled] | 720 'origin_trial_enabled_function': v8_utilities.origin_trial_enabled_funct
ion_name(constant), # [OriginTrialEnabled] |
721 'origin_trial_feature_name': v8_utilities.origin_trial_feature_name(cons
tant), # [OriginTrialEnabled] | 721 'origin_trial_feature_name': v8_utilities.origin_trial_feature_name(cons
tant), # [OriginTrialEnabled] |
722 # FIXME: use 'reflected_name' as correct 'name' | 722 # FIXME: use 'reflected_name' as correct 'name' |
723 'reflected_name': extended_attributes.get('Reflect', reflected_name(cons
tant.name)), | 723 'reflected_name': extended_attributes.get('Reflect', reflected_name(cons
tant.name)), |
724 'runtime_enabled_function': runtime_enabled_function_name(constant), #
[RuntimeEnabled] | 724 'runtime_enabled_feature_name': runtime_enabled_feature_name(constant),
# [RuntimeEnabled] |
725 'runtime_feature_name': v8_utilities.runtime_feature_name(constant), #
[RuntimeEnabled] | |
726 'value': constant.value, | 725 'value': constant.value, |
727 } | 726 } |
728 | 727 |
729 | 728 |
730 ################################################################################ | 729 ################################################################################ |
731 # Overloads | 730 # Overloads |
732 ################################################################################ | 731 ################################################################################ |
733 | 732 |
734 def compute_method_overloads_context(interface, methods): | 733 def compute_method_overloads_context(interface, methods): |
735 # Regular methods | 734 # Regular methods |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
793 lengths = [length for length, _ in effective_overloads_by_length] | 792 lengths = [length for length, _ in effective_overloads_by_length] |
794 name = overloads[0].get('name', '<constructor>') | 793 name = overloads[0].get('name', '<constructor>') |
795 | 794 |
796 runtime_determined_lengths = None | 795 runtime_determined_lengths = None |
797 function_length = lengths[0] | 796 function_length = lengths[0] |
798 runtime_determined_maxargs = None | 797 runtime_determined_maxargs = None |
799 maxarg = lengths[-1] | 798 maxarg = lengths[-1] |
800 | 799 |
801 # The special case handling below is not needed if all overloads are | 800 # The special case handling below is not needed if all overloads are |
802 # runtime enabled by the same feature. | 801 # runtime enabled by the same feature. |
803 if not common_value(overloads, 'runtime_enabled_function'): | 802 if not common_value(overloads, 'runtime_enabled_feature_name'): |
804 # Check if all overloads with the shortest acceptable arguments list are | 803 # Check if all overloads with the shortest acceptable arguments list are |
805 # runtime enabled, in which case we need to have a runtime determined | 804 # runtime enabled, in which case we need to have a runtime determined |
806 # Function.length. | 805 # Function.length. |
807 shortest_overloads = effective_overloads_by_length[0][1] | 806 shortest_overloads = effective_overloads_by_length[0][1] |
808 if (all(method.get('runtime_enabled_function') | 807 if (all(method.get('runtime_enabled_feature_name') |
809 for method, _, _ in shortest_overloads)): | 808 for method, _, _ in shortest_overloads)): |
810 # Generate a list of (length, runtime_enabled_functions) tuples. | 809 # Generate a list of (length, runtime_enabled_feature_names) tuples. |
811 runtime_determined_lengths = [] | 810 runtime_determined_lengths = [] |
812 for length, effective_overloads in effective_overloads_by_length: | 811 for length, effective_overloads in effective_overloads_by_length: |
813 runtime_enabled_functions = set( | 812 runtime_enabled_feature_names = set( |
814 method['runtime_enabled_function'] | 813 method['runtime_enabled_feature_name'] |
815 for method, _, _ in effective_overloads | 814 for method, _, _ in effective_overloads |
816 if method.get('runtime_enabled_function')) | 815 if method.get('runtime_enabled_feature_name')) |
817 if not runtime_enabled_functions: | 816 if not runtime_enabled_feature_names: |
818 # This "length" is unconditionally enabled, so stop here. | 817 # This "length" is unconditionally enabled, so stop here. |
819 runtime_determined_lengths.append((length, [None])) | 818 runtime_determined_lengths.append((length, [None])) |
820 break | 819 break |
821 runtime_determined_lengths.append( | 820 runtime_determined_lengths.append( |
822 (length, sorted(runtime_enabled_functions))) | 821 (length, sorted(runtime_enabled_feature_names))) |
823 function_length = ('%sV8Internal::%sMethodLength()' | 822 function_length = ('%sV8Internal::%sMethodLength()' |
824 % (cpp_name_or_partial(interface), name)) | 823 % (cpp_name_or_partial(interface), name)) |
825 | 824 |
826 # Check if all overloads with the longest required arguments list are | 825 # Check if all overloads with the longest required arguments list are |
827 # runtime enabled, in which case we need to have a runtime determined | 826 # runtime enabled, in which case we need to have a runtime determined |
828 # maximum distinguishing argument index. | 827 # maximum distinguishing argument index. |
829 longest_overloads = effective_overloads_by_length[-1][1] | 828 longest_overloads = effective_overloads_by_length[-1][1] |
830 if (not common_value(overloads, 'runtime_enabled_function') and | 829 if (not common_value(overloads, 'runtime_enabled_feature_name') and |
831 all(method.get('runtime_enabled_function') | 830 all(method.get('runtime_enabled_feature_name') |
832 for method, _, _ in longest_overloads)): | 831 for method, _, _ in longest_overloads)): |
833 # Generate a list of (length, runtime_enabled_functions) tuples. | 832 # Generate a list of (length, runtime_enabled_feature_name) tuples. |
834 runtime_determined_maxargs = [] | 833 runtime_determined_maxargs = [] |
835 for length, effective_overloads in reversed(effective_overloads_by_l
ength): | 834 for length, effective_overloads in reversed(effective_overloads_by_l
ength): |
836 runtime_enabled_functions = set( | 835 runtime_enabled_feature_names = set( |
837 method['runtime_enabled_function'] | 836 method['runtime_enabled_feature_name'] |
838 for method, _, _ in effective_overloads | 837 for method, _, _ in effective_overloads |
839 if method.get('runtime_enabled_function')) | 838 if method.get('runtime_enabled_feature_name')) |
840 if not runtime_enabled_functions: | 839 if not runtime_enabled_feature_names: |
841 # This "length" is unconditionally enabled, so stop here. | 840 # This "length" is unconditionally enabled, so stop here. |
842 runtime_determined_maxargs.append((length, [None])) | 841 runtime_determined_maxargs.append((length, [None])) |
843 break | 842 break |
844 runtime_determined_maxargs.append( | 843 runtime_determined_maxargs.append( |
845 (length, sorted(runtime_enabled_functions))) | 844 (length, sorted(runtime_enabled_feature_names))) |
846 maxarg = ('%sV8Internal::%sMethodMaxArg()' | 845 maxarg = ('%sV8Internal::%sMethodMaxArg()' |
847 % (cpp_name_or_partial(interface), name)) | 846 % (cpp_name_or_partial(interface), name)) |
848 | 847 |
849 # Check and fail if overloads disagree about whether the return type | 848 # Check and fail if overloads disagree about whether the return type |
850 # is a Promise or not. | 849 # is a Promise or not. |
851 promise_overload_count = sum(1 for method in overloads if method.get('return
s_promise')) | 850 promise_overload_count = sum(1 for method in overloads if method.get('return
s_promise')) |
852 if promise_overload_count not in (0, len(overloads)): | 851 if promise_overload_count not in (0, len(overloads)): |
853 raise ValueError('Overloads of %s have conflicting Promise/non-Promise t
ypes' | 852 raise ValueError('Overloads of %s have conflicting Promise/non-Promise t
ypes' |
854 % (name)) | 853 % (name)) |
855 | 854 |
(...skipping 16 matching lines...) Expand all Loading... |
872 'exposed_test_all': common_value(overloads, 'exposed_test'), # [Exposed
] | 871 'exposed_test_all': common_value(overloads, 'exposed_test'), # [Exposed
] |
873 'length': function_length, | 872 'length': function_length, |
874 'length_tests_methods': length_tests_methods(effective_overloads_by_leng
th), | 873 'length_tests_methods': length_tests_methods(effective_overloads_by_leng
th), |
875 # 1. Let maxarg be the length of the longest type list of the | 874 # 1. Let maxarg be the length of the longest type list of the |
876 # entries in S. | 875 # entries in S. |
877 'maxarg': maxarg, | 876 'maxarg': maxarg, |
878 'measure_all_as': common_value(overloads, 'measure_as'), # [MeasureAs] | 877 'measure_all_as': common_value(overloads, 'measure_as'), # [MeasureAs] |
879 'returns_promise_all': promise_overload_count > 0, | 878 'returns_promise_all': promise_overload_count > 0, |
880 'runtime_determined_lengths': runtime_determined_lengths, | 879 'runtime_determined_lengths': runtime_determined_lengths, |
881 'runtime_determined_maxargs': runtime_determined_maxargs, | 880 'runtime_determined_maxargs': runtime_determined_maxargs, |
882 'runtime_enabled_function_all': common_value(overloads, 'runtime_enabled
_function'), # [RuntimeEnabled] | 881 'runtime_enabled_all': common_value(overloads, 'runtime_enabled_feature_
name'), # [RuntimeEnabled] |
883 'secure_context_test_all': common_value(overloads, 'secure_context_test'
), # [SecureContext] | 882 'secure_context_test_all': common_value(overloads, 'secure_context_test'
), # [SecureContext] |
884 'valid_arities': (lengths | 883 'valid_arities': (lengths |
885 # Only need to report valid arities if there is a gap
in the | 884 # Only need to report valid arities if there is a gap
in the |
886 # sequence of possible lengths, otherwise invalid leng
th means | 885 # sequence of possible lengths, otherwise invalid leng
th means |
887 # "not enough arguments". | 886 # "not enough arguments". |
888 if lengths[-1] - lengths[0] != len(lengths) - 1 else N
one), | 887 if lengths[-1] - lengths[0] != len(lengths) - 1 else N
one), |
889 'visible': has_overload_visible, | 888 'visible': has_overload_visible, |
890 'has_partial_overloads': has_partial_overloads, | 889 'has_partial_overloads': has_partial_overloads, |
891 } | 890 } |
892 | 891 |
(...skipping 604 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1497 extended_attributes = deleter.extended_attributes | 1496 extended_attributes = deleter.extended_attributes |
1498 is_call_with_script_state = v8_utilities.has_extended_attribute_value(delete
r, 'CallWith', 'ScriptState') | 1497 is_call_with_script_state = v8_utilities.has_extended_attribute_value(delete
r, 'CallWith', 'ScriptState') |
1499 is_ce_reactions = 'CEReactions' in extended_attributes | 1498 is_ce_reactions = 'CEReactions' in extended_attributes |
1500 return { | 1499 return { |
1501 'is_call_with_script_state': is_call_with_script_state, | 1500 'is_call_with_script_state': is_call_with_script_state, |
1502 'is_ce_reactions': is_ce_reactions, | 1501 'is_ce_reactions': is_ce_reactions, |
1503 'is_custom': 'Custom' in extended_attributes, | 1502 'is_custom': 'Custom' in extended_attributes, |
1504 'is_raises_exception': 'RaisesException' in extended_attributes, | 1503 'is_raises_exception': 'RaisesException' in extended_attributes, |
1505 'name': cpp_name(deleter), | 1504 'name': cpp_name(deleter), |
1506 } | 1505 } |
OLD | NEW |