| Index: Source/bindings/scripts/v8_methods.py
|
| diff --git a/Source/bindings/scripts/v8_methods.py b/Source/bindings/scripts/v8_methods.py
|
| index 6f8378d24fd8ec381513a5af52b3d70b4707b6e9..4b79eb64dd696aa2cec205e46b5f2d2f1defa2d6 100644
|
| --- a/Source/bindings/scripts/v8_methods.py
|
| +++ b/Source/bindings/scripts/v8_methods.py
|
| @@ -67,6 +67,21 @@ def argument_needs_try_catch(argument):
|
| (base_type == 'DOMString' and not argument.is_variadic))
|
|
|
|
|
| +def argument_is_explicit_optional(method, index):
|
| + argument = method.arguments[index]
|
| + if not(argument.is_optional and
|
| + not argument.default_value and
|
| + not 'Default' in argument.extended_attributes):
|
| + # Argument itself is not optional, or has a default value.
|
| + return False
|
| + for following in method.arguments[index + 1:]:
|
| + if (following.default_value or
|
| + 'Default' in following.extended_attributes):
|
| + # A following argument has a default value.
|
| + return True
|
| + return False
|
| +
|
| +
|
| def generate_method(interface, method):
|
| arguments = method.arguments
|
| extended_attributes = method.extended_attributes
|
| @@ -203,6 +218,7 @@ def generate_argument(interface, method, argument, index):
|
| 'index': index,
|
| 'is_clamp': 'Clamp' in extended_attributes,
|
| 'is_callback_interface': idl_type.is_callback_interface,
|
| + 'is_explicit_optional': argument_is_explicit_optional(method, index),
|
| 'is_nullable': idl_type.is_nullable,
|
| 'is_optional': argument.is_optional,
|
| 'is_variadic_wrapper_type': is_variadic_wrapper_type,
|
| @@ -220,7 +236,8 @@ def generate_argument(interface, method, argument, index):
|
| ################################################################################
|
|
|
| def cpp_value(interface, method, number_of_arguments):
|
| - def cpp_argument(argument):
|
| + def cpp_argument(index):
|
| + argument = method.arguments[index]
|
| idl_type = argument.idl_type
|
| if idl_type.name == 'EventListener':
|
| if (interface.name == 'EventTarget' and
|
| @@ -233,10 +250,11 @@ def cpp_value(interface, method, number_of_arguments):
|
| idl_type.name in ['NodeFilter', 'XPathNSResolver']):
|
| # FIXME: remove this special case
|
| return '%s.release()' % argument.name
|
| + if argument_is_explicit_optional(method, index):
|
| + return 'makeOptional({name}, {name}Missing)'.format(
|
| + name=argument.name)
|
| return argument.name
|
|
|
| - # Truncate omitted optional arguments
|
| - arguments = method.arguments[:number_of_arguments]
|
| cpp_arguments = v8_utilities.call_with_arguments(method)
|
| # Members of IDL partial interface definitions are implemented in C++ as
|
| # static member functions, which for instance members (non-static members)
|
| @@ -244,7 +262,8 @@ def cpp_value(interface, method, number_of_arguments):
|
| if ('PartialInterfaceImplementedAs' in method.extended_attributes and
|
| not method.is_static):
|
| cpp_arguments.append('*impl')
|
| - cpp_arguments.extend(cpp_argument(argument) for argument in arguments)
|
| + cpp_arguments.extend(cpp_argument(index)
|
| + for index in range(number_of_arguments))
|
| this_union_arguments = method.idl_type and method.idl_type.union_arguments
|
| if this_union_arguments:
|
| cpp_arguments.extend(this_union_arguments)
|
|
|