| Index: Source/bindings/scripts/v8_constructors.py | 
| diff --git a/Source/bindings/scripts/v8_constructors.py b/Source/bindings/scripts/v8_constructors.py | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..a3de285a2b786a5b5b89041edb897bd6ab741516 | 
| --- /dev/null | 
| +++ b/Source/bindings/scripts/v8_constructors.py | 
| @@ -0,0 +1,162 @@ | 
| +# Copyright (C) 2013 Google Inc. All rights reserved. | 
| +# | 
| +# Redistribution and use in source and binary forms, with or without | 
| +# modification, are permitted provided that the following conditions are | 
| +# met: | 
| +# | 
| +#     * Redistributions of source code must retain the above copyright | 
| +# notice, this list of conditions and the following disclaimer. | 
| +#     * Redistributions in binary form must reproduce the above | 
| +# copyright notice, this list of conditions and the following disclaimer | 
| +# in the documentation and/or other materials provided with the | 
| +# distribution. | 
| +#     * Neither the name of Google Inc. nor the names of its | 
| +# contributors may be used to endorse or promote products derived from | 
| +# this software without specific prior written permission. | 
| +# | 
| +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 
| +# 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 
| +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 
| +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 
| +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
| +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 
| +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
| +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
| +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
| +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
| +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
| + | 
| +"""Generate template values for constructors. | 
| + | 
| +FIXME: rename: "template parameters" is easily confused with "function parameters" | 
| +Also, "parameter*s*", not "parameter". | 
| +""" | 
| + | 
| +from v8_functions import get_function_mandatory_parameters, get_parameter_check_parameters | 
| +from v8_includes import * | 
| +from v8_types import * | 
| +from v8_utilities import implemented_as_cpp_name | 
| + | 
| + | 
| +NAMED_PARAMETER_INCLUDES = [ | 
| +    'V8Document.h', | 
| +    'bindings/v8/V8ObjectConstructor.h', | 
| +] | 
| + | 
| + | 
| +def generate_constructor_contents(interface): | 
| +    includes = [] | 
| + | 
| +    constructor_raises_exception = 'ConstructorRaisesException' in interface.extended_attributes | 
| +    if constructor_raises_exception: | 
| +        includes.append('bindings/v8/ExceptionState.h') | 
| + | 
| +    has_named_constructor = 'NamedConstructor' in interface.extended_attributes | 
| +    if has_named_constructor: | 
| +        named_constructor_parameter, named_constructor_includes = generate_named_constructor(interface) | 
| +        includes += named_constructor_includes | 
| +    else: | 
| +        named_constructor_parameter = {} | 
| + | 
| +    constructor_parameters, constructor_includes = generate_constructors(interface) | 
| +    includes += constructor_includes | 
| + | 
| +    is_constructor_template_of_event = is_constructor_template(interface, 'Event') | 
| +    if is_constructor_template_of_event: | 
| +        includes.append('bindings/v8/Dictionary.h') | 
| + | 
| +    is_constructor_template_of_typed_array = is_constructor_template(interface, 'TypedArray') | 
| + | 
| +    constructable = is_constructable(interface) | 
| +    if constructable: | 
| +        includes.append('bindings/v8/V8ObjectConstructor.h') | 
| + | 
| +    template_parameters = { | 
| +        'is_constructable': constructable, | 
| +        'named_constructor': named_constructor_parameter, | 
| +        'constructor_raises_exception': constructor_raises_exception, | 
| +        'constructor_call_with': interface.extended_attributes.get('ConstructorCallWith'), | 
| +        'constructors': constructor_parameters, | 
| +        'has_custom_constructor': has_custom_constructor(interface), | 
| +        'has_named_constructor': has_named_constructor, | 
| +        'has_constructor': 'Constructor' in interface.extended_attributes, | 
| +        'is_constructor_template_of_event': is_constructor_template_of_event, | 
| +        'is_constructor_template_of_typed_array': is_constructor_template_of_typed_array, | 
| +    } | 
| +    return template_parameters, includes | 
| + | 
| + | 
| +def generate_constructors(interface): | 
| +    # FIXME: clearer with a list comprehension + nested function to handle includes | 
| +    constructors = [] | 
| +    includes = [] | 
| +    for constructor in interface.constructors: | 
| +        if len(interface.constructors) == 1: | 
| +            constructor_contents, constructor_includes = generate_constructor(interface, constructor) | 
| +            constructors.append(constructor_contents) | 
| +            includes += constructor_includes | 
| +        else: | 
| +            # TODO | 
| +            pass | 
| +    return constructors, includes | 
| + | 
| + | 
| +def generate_named_constructor(interface): | 
| +    named_constructor = interface.constructors[0] | 
| +    parameter_check_parameters, parameter_check_includes, replacements = get_parameter_check_parameters(interface, named_constructor) | 
| +    includes = NAMED_PARAMETER_INCLUDES + parameter_check_includes | 
| + | 
| +    argument_list = ['document'] | 
| +    for argument in named_constructor.arguments: | 
| +        argument_name = argument.name | 
| +        if argument_name in replacements: | 
| +            argument_name = replacements[argument_name] | 
| +        argument_list.append(argument_name) | 
| + | 
| +    constructor_raises_exception = 'ConstructorRaisesException' in interface.extended_attributes | 
| +    if constructor_raises_exception: | 
| +        argument_list.append('ec') | 
| + | 
| +    argument_string = ', '.join(argument_list) | 
| +    named_constructor_parameter = { | 
| +        'argument_string': argument_string, | 
| +        'parameters': parameter_check_parameters, | 
| +    } | 
| +    return named_constructor_parameter, includes | 
| + | 
| + | 
| +def generate_constructor(interface, constructor): | 
| +    includes = [] | 
| +    cpp_class_name = implemented_as_cpp_name(interface) | 
| +    v8_class_name = get_v8_class_name(interface) | 
| +    overloaded_index_string = '' | 
| +    if constructor.overloaded_index > 0: | 
| +        overloaded_index_string = constructor.overloaded_index | 
| +    # print '####### [ctor]', len(constructor.arguments) | 
| + | 
| +    # FIXME: Currently [Constructor(...)] does not yet support optional arguments without [Default=...] | 
| +#         parameter_check_string, _, replacements) = GenerateParametersCheck($function, $interface, '') | 
| +    parameter_check_parameters, parameter_check_includes, replacements = get_parameter_check_parameters(interface, constructor) | 
| +    includes += parameter_check_includes | 
| + | 
| +    argument_list = [] | 
| +    if interface.extended_attributes.get('ConstructorCallWith') == 'ScriptExecutionContext': | 
| +        argument_list.append('context') | 
| +    for parameter in constructor.arguments: | 
| +        parameter_name = parameter.name | 
| +        if parameter_name in replacements: | 
| +            parameter_name = replacements[parameter_name] | 
| +        argument_list.append(parameter_name) | 
| + | 
| +    if 'ConstructorRaisesException' in interface.extended_attributes: | 
| +        argument_list.append('es') | 
| +    argument_string = ', '.join(argument_list) | 
| + | 
| +    parameter = { | 
| +        'argument_string': argument_string, | 
| +        'mandatory_parameters': get_function_mandatory_parameters(constructor), | 
| +        'parameters': parameter_check_parameters, | 
| +        'overloaded_index': constructor.overloaded_index, | 
| +        'overloaded_index_string': overloaded_index_string, | 
| +    } | 
| +    return parameter, includes | 
|  |