| Index: Source/bindings/scripts/v8_interface.py
|
| diff --git a/Source/bindings/scripts/v8_interface.py b/Source/bindings/scripts/v8_interface.py
|
| index 8c14d6c9b819c7cbf605154e4c23470fbe9aadac..2b3513706897dbe8436a9f4b6225ce661ea9c2a0 100644
|
| --- a/Source/bindings/scripts/v8_interface.py
|
| +++ b/Source/bindings/scripts/v8_interface.py
|
| @@ -558,7 +558,7 @@ def interface_context(interface):
|
| # enabled overloads are actually enabled, so length may be incorrect.
|
| # E.g., [RuntimeEnabled=Foo] void f(); void f(long x);
|
| # should have length 1 if Foo is not enabled, but length 0 if it is.
|
| - method['length'] = (method['overloads']['minarg'] if 'overloads' in method else
|
| + method['length'] = (method['overloads']['length'] if 'overloads' in method else
|
| method['number_of_required_arguments'])
|
|
|
| context.update({
|
| @@ -662,33 +662,58 @@ def overloads_context(interface, overloads):
|
| lengths = [length for length, _ in effective_overloads_by_length]
|
| name = overloads[0].get('name', '<constructor>')
|
|
|
| - # Check if all overloads with the shortest acceptable arguments list are
|
| - # runtime enabled, in which case we need to have a runtime determined
|
| - # Function.length. The exception is if all overloads are controlled by the
|
| - # same runtime enabled feature, in which case there would be no function
|
| - # object at all if it is not enabled.
|
| - shortest_overloads = effective_overloads_by_length[0][1]
|
| - if (all(method.get('runtime_enabled_function')
|
| - for method, _, _ in shortest_overloads) and
|
| - not common_value(overloads, 'runtime_enabled_function')):
|
| - # Generate a list of (length, runtime_enabled_functions) tuples.
|
| - runtime_determined_lengths = []
|
| - for length, effective_overloads in effective_overloads_by_length:
|
| - runtime_enabled_functions = set(
|
| - method['runtime_enabled_function']
|
| - for method, _, _ in effective_overloads
|
| - if method.get('runtime_enabled_function'))
|
| - if not runtime_enabled_functions:
|
| - # This "length" is unconditionally enabled, so stop here.
|
| - runtime_determined_lengths.append((length, [None]))
|
| - break
|
| - runtime_determined_lengths.append(
|
| - (length, sorted(runtime_enabled_functions)))
|
| - length = ('%sV8Internal::%sMethodLength()'
|
| - % (cpp_name_or_partial(interface), name))
|
| - else:
|
| - runtime_determined_lengths = None
|
| - length = lengths[0]
|
| + runtime_determined_lengths = None
|
| + function_length = lengths[0]
|
| + runtime_determined_maxargs = None
|
| + maxarg = lengths[-1]
|
| +
|
| + # The special case handling below is not needed if all overloads are
|
| + # runtime enabled by the same feature.
|
| + if not common_value(overloads, 'runtime_enabled_function'):
|
| + # Check if all overloads with the shortest acceptable arguments list are
|
| + # runtime enabled, in which case we need to have a runtime determined
|
| + # Function.length.
|
| + shortest_overloads = effective_overloads_by_length[0][1]
|
| + if (all(method.get('runtime_enabled_function')
|
| + for method, _, _ in shortest_overloads)):
|
| + # Generate a list of (length, runtime_enabled_functions) tuples.
|
| + runtime_determined_lengths = []
|
| + for length, effective_overloads in effective_overloads_by_length:
|
| + runtime_enabled_functions = set(
|
| + method['runtime_enabled_function']
|
| + for method, _, _ in effective_overloads
|
| + if method.get('runtime_enabled_function'))
|
| + if not runtime_enabled_functions:
|
| + # This "length" is unconditionally enabled, so stop here.
|
| + runtime_determined_lengths.append((length, [None]))
|
| + break
|
| + runtime_determined_lengths.append(
|
| + (length, sorted(runtime_enabled_functions)))
|
| + function_length = ('%sV8Internal::%sMethodLength()'
|
| + % (cpp_name_or_partial(interface), name))
|
| +
|
| + # Check if all overloads with the longest required arguments list are
|
| + # runtime enabled, in which case we need to have a runtime determined
|
| + # maximum distinguishing argument index.
|
| + longest_overloads = effective_overloads_by_length[-1][1]
|
| + if (not common_value(overloads, 'runtime_enabled_function') and
|
| + all(method.get('runtime_enabled_function')
|
| + for method, _, _ in longest_overloads)):
|
| + # Generate a list of (length, runtime_enabled_functions) tuples.
|
| + runtime_determined_maxargs = []
|
| + for length, effective_overloads in reversed(effective_overloads_by_length):
|
| + runtime_enabled_functions = set(
|
| + method['runtime_enabled_function']
|
| + for method, _, _ in effective_overloads
|
| + if method.get('runtime_enabled_function'))
|
| + if not runtime_enabled_functions:
|
| + # This "length" is unconditionally enabled, so stop here.
|
| + runtime_determined_maxargs.append((length, [None]))
|
| + break
|
| + runtime_determined_maxargs.append(
|
| + (length, sorted(runtime_enabled_functions)))
|
| + maxarg = ('%sV8Internal::%sMethodMaxArg()'
|
| + % (cpp_name_or_partial(interface), name))
|
|
|
| # Check and fail if overloads disagree on any of the extended attributes
|
| # that affect how the method should be registered.
|
| @@ -728,15 +753,15 @@ def overloads_context(interface, overloads):
|
| 'deprecate_all_as': common_value(overloads, 'deprecate_as'), # [DeprecateAs]
|
| 'exposed_test_all': common_value(overloads, 'exposed_test'), # [Exposed]
|
| 'has_custom_registration_all': common_value(overloads, 'has_custom_registration'),
|
| - 'length': length,
|
| + 'length': function_length,
|
| 'length_tests_methods': length_tests_methods(effective_overloads_by_length),
|
| # 1. Let maxarg be the length of the longest type list of the
|
| # entries in S.
|
| - 'maxarg': lengths[-1],
|
| + 'maxarg': maxarg,
|
| 'measure_all_as': common_value(overloads, 'measure_as'), # [MeasureAs]
|
| - 'minarg': lengths[0],
|
| 'returns_promise_all': promise_overload_count > 0,
|
| 'runtime_determined_lengths': runtime_determined_lengths,
|
| + 'runtime_determined_maxargs': runtime_determined_maxargs,
|
| 'runtime_enabled_function_all': common_value(overloads, 'runtime_enabled_function'), # [RuntimeEnabled]
|
| 'valid_arities': lengths
|
| # Only need to report valid arities if there is a gap in the
|
|
|