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

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

Issue 1132243004: IDL: Determine maximum distinguishing argument index runtime, if needed (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 5 years, 7 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
« no previous file with comments | « no previous file | Source/bindings/templates/interface.cpp » ('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 540 matching lines...) Expand 10 before | Expand all | Expand 10 after
551 # determined as follows: 551 # determined as follows:
552 # 1. Let S be the effective overload set for regular operations (if the 552 # 1. Let S be the effective overload set for regular operations (if the
553 # operation is a regular operation) or for static operations (if the 553 # operation is a regular operation) or for static operations (if the
554 # operation is a static operation) with identifier id on interface I and 554 # operation is a static operation) with identifier id on interface I and
555 # with argument count 0. 555 # with argument count 0.
556 # 2. Return the length of the shortest argument list of the entries in S . 556 # 2. Return the length of the shortest argument list of the entries in S .
557 # FIXME: This calculation doesn't take into account whether runtime 557 # FIXME: This calculation doesn't take into account whether runtime
558 # enabled overloads are actually enabled, so length may be incorrect. 558 # enabled overloads are actually enabled, so length may be incorrect.
559 # E.g., [RuntimeEnabled=Foo] void f(); void f(long x); 559 # E.g., [RuntimeEnabled=Foo] void f(); void f(long x);
560 # should have length 1 if Foo is not enabled, but length 0 if it is. 560 # should have length 1 if Foo is not enabled, but length 0 if it is.
561 method['length'] = (method['overloads']['minarg'] if 'overloads' in meth od else 561 method['length'] = (method['overloads']['length'] if 'overloads' in meth od else
562 method['number_of_required_arguments']) 562 method['number_of_required_arguments'])
563 563
564 context.update({ 564 context.update({
565 'conditionally_enabled_methods': conditionally_enabled_methods, 565 'conditionally_enabled_methods': conditionally_enabled_methods,
566 'custom_registration_methods': custom_registration_methods, 566 'custom_registration_methods': custom_registration_methods,
567 'has_origin_safe_method_setter': any( 567 'has_origin_safe_method_setter': any(
568 method['is_check_security_for_frame'] and not method['is_read_only'] 568 method['is_check_security_for_frame'] and not method['is_read_only']
569 for method in methods), 569 for method in methods),
570 'has_private_script': any(attribute['is_implemented_in_private_script'] for attribute in attributes) or 570 'has_private_script': any(attribute['is_implemented_in_private_script'] for attribute in attributes) or
571 any(method['is_implemented_in_private_script'] for method in methods ), 571 any(method['is_implemented_in_private_script'] for method in methods ),
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
655 and returns dict of overall overload template values. 655 and returns dict of overall overload template values.
656 """ 656 """
657 assert len(overloads) > 1 # only apply to overloaded names 657 assert len(overloads) > 1 # only apply to overloaded names
658 for index, method in enumerate(overloads, 1): 658 for index, method in enumerate(overloads, 1):
659 method['overload_index'] = index 659 method['overload_index'] = index
660 660
661 effective_overloads_by_length = effective_overload_set_by_length(overloads) 661 effective_overloads_by_length = effective_overload_set_by_length(overloads)
662 lengths = [length for length, _ in effective_overloads_by_length] 662 lengths = [length for length, _ in effective_overloads_by_length]
663 name = overloads[0].get('name', '<constructor>') 663 name = overloads[0].get('name', '<constructor>')
664 664
665 # Check if all overloads with the shortest acceptable arguments list are 665 runtime_determined_lengths = None
666 # runtime enabled, in which case we need to have a runtime determined 666 function_length = lengths[0]
667 # Function.length. The exception is if all overloads are controlled by the 667 runtime_determined_maxargs = None
668 # same runtime enabled feature, in which case there would be no function 668 maxarg = lengths[-1]
669 # object at all if it is not enabled. 669
670 shortest_overloads = effective_overloads_by_length[0][1] 670 # The special case handling below is not needed if all overloads are
671 if (all(method.get('runtime_enabled_function') 671 # runtime enabled by the same feature.
672 for method, _, _ in shortest_overloads) and 672 if not common_value(overloads, 'runtime_enabled_function'):
673 not common_value(overloads, 'runtime_enabled_function')): 673 # Check if all overloads with the shortest acceptable arguments list are
674 # Generate a list of (length, runtime_enabled_functions) tuples. 674 # runtime enabled, in which case we need to have a runtime determined
675 runtime_determined_lengths = [] 675 # Function.length.
676 for length, effective_overloads in effective_overloads_by_length: 676 shortest_overloads = effective_overloads_by_length[0][1]
677 runtime_enabled_functions = set( 677 if (all(method.get('runtime_enabled_function')
678 method['runtime_enabled_function'] 678 for method, _, _ in shortest_overloads)):
679 for method, _, _ in effective_overloads 679 # Generate a list of (length, runtime_enabled_functions) tuples.
680 if method.get('runtime_enabled_function')) 680 runtime_determined_lengths = []
681 if not runtime_enabled_functions: 681 for length, effective_overloads in effective_overloads_by_length:
682 # This "length" is unconditionally enabled, so stop here. 682 runtime_enabled_functions = set(
683 runtime_determined_lengths.append((length, [None])) 683 method['runtime_enabled_function']
684 break 684 for method, _, _ in effective_overloads
685 runtime_determined_lengths.append( 685 if method.get('runtime_enabled_function'))
686 (length, sorted(runtime_enabled_functions))) 686 if not runtime_enabled_functions:
687 length = ('%sV8Internal::%sMethodLength()' 687 # This "length" is unconditionally enabled, so stop here.
688 % (cpp_name_or_partial(interface), name)) 688 runtime_determined_lengths.append((length, [None]))
689 else: 689 break
690 runtime_determined_lengths = None 690 runtime_determined_lengths.append(
691 length = lengths[0] 691 (length, sorted(runtime_enabled_functions)))
692 function_length = ('%sV8Internal::%sMethodLength()'
693 % (cpp_name_or_partial(interface), name))
694
695 # Check if all overloads with the longest required arguments list are
696 # runtime enabled, in which case we need to have a runtime determined
697 # maximum distinguishing argument index.
698 longest_overloads = effective_overloads_by_length[-1][1]
699 if (not common_value(overloads, 'runtime_enabled_function') and
700 all(method.get('runtime_enabled_function')
701 for method, _, _ in longest_overloads)):
702 # Generate a list of (length, runtime_enabled_functions) tuples.
703 runtime_determined_maxargs = []
704 for length, effective_overloads in reversed(effective_overloads_by_l ength):
705 runtime_enabled_functions = set(
706 method['runtime_enabled_function']
707 for method, _, _ in effective_overloads
708 if method.get('runtime_enabled_function'))
709 if not runtime_enabled_functions:
710 # This "length" is unconditionally enabled, so stop here.
711 runtime_determined_maxargs.append((length, [None]))
712 break
713 runtime_determined_maxargs.append(
714 (length, sorted(runtime_enabled_functions)))
715 maxarg = ('%sV8Internal::%sMethodMaxArg()'
716 % (cpp_name_or_partial(interface), name))
692 717
693 # Check and fail if overloads disagree on any of the extended attributes 718 # Check and fail if overloads disagree on any of the extended attributes
694 # that affect how the method should be registered. 719 # that affect how the method should be registered.
695 # Skip the check for overloaded constructors, since they don't support any 720 # Skip the check for overloaded constructors, since they don't support any
696 # of the extended attributes in question. 721 # of the extended attributes in question.
697 if not overloads[0].get('is_constructor'): 722 if not overloads[0].get('is_constructor'):
698 overload_extended_attributes = [ 723 overload_extended_attributes = [
699 method['custom_registration_extended_attributes'] 724 method['custom_registration_extended_attributes']
700 for method in overloads] 725 for method in overloads]
701 for extended_attribute in v8_methods.CUSTOM_REGISTRATION_EXTENDED_ATTRIB UTES: 726 for extended_attribute in v8_methods.CUSTOM_REGISTRATION_EXTENDED_ATTRIB UTES:
(...skipping 19 matching lines...) Expand all
721 has_overload_not_visible = True 746 has_overload_not_visible = True
722 747
723 # If some overloads are not visible and others are visible, 748 # If some overloads are not visible and others are visible,
724 # the method is overloaded between core and modules. 749 # the method is overloaded between core and modules.
725 has_partial_overloads = has_overload_visible and has_overload_not_visible 750 has_partial_overloads = has_overload_visible and has_overload_not_visible
726 751
727 return { 752 return {
728 'deprecate_all_as': common_value(overloads, 'deprecate_as'), # [Depreca teAs] 753 'deprecate_all_as': common_value(overloads, 'deprecate_as'), # [Depreca teAs]
729 'exposed_test_all': common_value(overloads, 'exposed_test'), # [Exposed ] 754 'exposed_test_all': common_value(overloads, 'exposed_test'), # [Exposed ]
730 'has_custom_registration_all': common_value(overloads, 'has_custom_regis tration'), 755 'has_custom_registration_all': common_value(overloads, 'has_custom_regis tration'),
731 'length': length, 756 'length': function_length,
732 'length_tests_methods': length_tests_methods(effective_overloads_by_leng th), 757 'length_tests_methods': length_tests_methods(effective_overloads_by_leng th),
733 # 1. Let maxarg be the length of the longest type list of the 758 # 1. Let maxarg be the length of the longest type list of the
734 # entries in S. 759 # entries in S.
735 'maxarg': lengths[-1], 760 'maxarg': maxarg,
736 'measure_all_as': common_value(overloads, 'measure_as'), # [MeasureAs] 761 'measure_all_as': common_value(overloads, 'measure_as'), # [MeasureAs]
737 'minarg': lengths[0],
738 'returns_promise_all': promise_overload_count > 0, 762 'returns_promise_all': promise_overload_count > 0,
739 'runtime_determined_lengths': runtime_determined_lengths, 763 'runtime_determined_lengths': runtime_determined_lengths,
764 'runtime_determined_maxargs': runtime_determined_maxargs,
740 'runtime_enabled_function_all': common_value(overloads, 'runtime_enabled _function'), # [RuntimeEnabled] 765 'runtime_enabled_function_all': common_value(overloads, 'runtime_enabled _function'), # [RuntimeEnabled]
741 'valid_arities': lengths 766 'valid_arities': lengths
742 # Only need to report valid arities if there is a gap in the 767 # Only need to report valid arities if there is a gap in the
743 # sequence of possible lengths, otherwise invalid length means 768 # sequence of possible lengths, otherwise invalid length means
744 # "not enough arguments". 769 # "not enough arguments".
745 if lengths[-1] - lengths[0] != len(lengths) - 1 else None, 770 if lengths[-1] - lengths[0] != len(lengths) - 1 else None,
746 'visible': has_overload_visible, 771 'visible': has_overload_visible,
747 'has_partial_overloads': has_partial_overloads, 772 'has_partial_overloads': has_partial_overloads,
748 } 773 }
749 774
(...skipping 583 matching lines...) Expand 10 before | Expand all | Expand 10 after
1333 1358
1334 extended_attributes = deleter.extended_attributes 1359 extended_attributes = deleter.extended_attributes
1335 idl_type = deleter.idl_type 1360 idl_type = deleter.idl_type
1336 is_call_with_script_state = v8_utilities.has_extended_attribute_value(delete r, 'CallWith', 'ScriptState') 1361 is_call_with_script_state = v8_utilities.has_extended_attribute_value(delete r, 'CallWith', 'ScriptState')
1337 return { 1362 return {
1338 'is_call_with_script_state': is_call_with_script_state, 1363 'is_call_with_script_state': is_call_with_script_state,
1339 'is_custom': 'Custom' in extended_attributes, 1364 'is_custom': 'Custom' in extended_attributes,
1340 'is_raises_exception': 'RaisesException' in extended_attributes, 1365 'is_raises_exception': 'RaisesException' in extended_attributes,
1341 'name': cpp_name(deleter), 1366 'name': cpp_name(deleter),
1342 } 1367 }
OLDNEW
« no previous file with comments | « no previous file | Source/bindings/templates/interface.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698