| OLD | NEW | 
|---|
| (Empty) |  | 
|  | 1 # Copyright (C) 2013 Google Inc. All rights reserved. | 
|  | 2 # | 
|  | 3 # Redistribution and use in source and binary forms, with or without | 
|  | 4 # modification, are permitted provided that the following conditions are | 
|  | 5 # met: | 
|  | 6 # | 
|  | 7 #     * Redistributions of source code must retain the above copyright | 
|  | 8 # notice, this list of conditions and the following disclaimer. | 
|  | 9 #     * Redistributions in binary form must reproduce the above | 
|  | 10 # copyright notice, this list of conditions and the following disclaimer | 
|  | 11 # in the documentation and/or other materials provided with the | 
|  | 12 # distribution. | 
|  | 13 #     * Neither the name of Google Inc. nor the names of its | 
|  | 14 # contributors may be used to endorse or promote products derived from | 
|  | 15 # this software without specific prior written permission. | 
|  | 16 # | 
|  | 17 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 
|  | 18 # 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 
|  | 19 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 
|  | 20 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 
|  | 21 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
|  | 22 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 
|  | 23 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
|  | 24 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
|  | 25 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
|  | 26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
|  | 27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
|  | 28 | 
|  | 29 from v8_types import get_is_null_expression, get_native_type, has_custom_impleme
     ntation, is_union_type | 
|  | 30 from v8_utilities import get_raises_exception, implemented_as_cpp_name | 
|  | 31 from v8_values import get_js_value_to_native_statement, get_native_to_js_value_s
     tatement, get_pass_owner_expression | 
|  | 32 | 
|  | 33 | 
|  | 34 # GenerateMethodCall in perl | 
|  | 35 def get_function_call_statements(return_type, variable_name, function_expression
     , first_argument, raises_exceptions=False): | 
|  | 36     arguments = [first_argument] | 
|  | 37     if raises_exceptions: | 
|  | 38         arguments.append('es') | 
|  | 39     if is_union_type(return_type): | 
|  | 40         code = '' | 
|  | 41         for i, union_member_type in enumerate(return_type.union_member_types): | 
|  | 42             native_type = get_native_type(union_member_type) | 
|  | 43             union_member_number = i | 
|  | 44             union_member_variable = '%s%d' % (variable_name, union_member_number
     ) | 
|  | 45             union_member_enabled_variable = '%s%dEnabled' % (variable_name, unio
     n_member_number) | 
|  | 46             union_member_native_value = get_pass_owner_expression(union_member_t
     ype, union_member_variable) | 
|  | 47             code += '    bool %s = false;\n' % union_member_enabled_variable | 
|  | 48             code += '    %s %s;\n' % (native_type, union_member_variable) | 
|  | 49             arguments.append(union_member_enabled_variable) | 
|  | 50             arguments.append(union_member_variable) | 
|  | 51         code += '    %s(%s);' % (function_expression, ', '.join(arguments)) | 
|  | 52         return code | 
|  | 53     else: | 
|  | 54         native_type = get_native_type(return_type) | 
|  | 55         return '    %s %s = %s(%s);' % (native_type, variable_name, function_exp
     ression, ', '.join(arguments)) | 
|  | 56 | 
|  | 57 | 
|  | 58 def get_indexed_property_getter_parameter(interface): | 
|  | 59     cpp_class_name = implemented_as_cpp_name(interface) | 
|  | 60     indexed_getter_function = get_indexed_getter_operation(interface) | 
|  | 61     includes = [] | 
|  | 62     callback_name = '0' | 
|  | 63     function_call = '' | 
|  | 64     return_type_is_union = '' | 
|  | 65     return_js_value_statement = '' | 
|  | 66     is_null_expression = '' | 
|  | 67     raises_exceptions = False | 
|  | 68     is_custom = False | 
|  | 69     not_enumerable = False | 
|  | 70 | 
|  | 71     if indexed_getter_function: | 
|  | 72 #         js_to_native_statement, js_value_to_native_includes = get_js_value_to_
     native_statement(parameter.data_type, parameter.extended_attributes, js_value, p
     arameter.name, 'args.GetIsolate()') | 
|  | 73 #     my $methodCallCode = GenerateMethodCall($returnType, 'element', 'collectio
     n->${methodName}', 'index', $raisesExceptions) | 
|  | 74 #         function_call_parameter, function_call_includes = get_function_call_pa
     rameter(indexed_getter_function) | 
|  | 75 #         includes += function_call_includes | 
|  | 76 | 
|  | 77         is_custom = 'Custom' in indexed_getter_function.extended_attributes | 
|  | 78         raises_exceptions = get_raises_exception(indexed_getter_function) | 
|  | 79         function_call = get_function_call_statements(indexed_getter_function.dat
     a_type, 'element', 'collection->' + implemented_as_cpp_name(indexed_getter_funct
     ion), 'index', raises_exceptions=raises_exceptions) | 
|  | 80         return_type_is_union = False | 
|  | 81         native_value = get_pass_owner_expression(indexed_getter_function.data_ty
     pe, 'element') | 
|  | 82         return_js_value_statement, return_js_value_includes = get_native_to_js_v
     alue_statement(indexed_getter_function.data_type, indexed_getter_function.extend
     ed_attributes, native_value, creation_context='info.Holder()', isolate='info.Get
     Isolate()', callback_info='info', script_wrappable='collection', used_as_return_
     value=True) | 
|  | 83         includes += return_js_value_includes | 
|  | 84         is_null_expression = get_is_null_expression(indexed_getter_function.data
     _type, 'element') | 
|  | 85         callback_name = '%sV8Internal::indexedPropertyGetterCallback' % cpp_clas
     s_name | 
|  | 86         not_enumerable = 'NotEnumerable' in indexed_getter_function.extended_att
     ributes | 
|  | 87 | 
|  | 88     parameter = { | 
|  | 89         'enabled': indexed_getter_function, | 
|  | 90         'callback_name': callback_name, | 
|  | 91         'is_custom': is_custom, | 
|  | 92         'function_call': function_call, | 
|  | 93 #             'function_call_parameter': function_call_parameter, | 
|  | 94         'return_type_is_union': return_type_is_union, | 
|  | 95         'return_js_value_statement': return_js_value_statement, | 
|  | 96         'is_null_expression': is_null_expression, | 
|  | 97         'raises_exceptions': raises_exceptions, | 
|  | 98         'not_enumerable': not_enumerable, | 
|  | 99     } | 
|  | 100     return parameter, includes | 
|  | 101 | 
|  | 102 | 
|  | 103 def get_indexed_property_setter_parameter(interface): | 
|  | 104     cpp_class_name = implemented_as_cpp_name(interface) | 
|  | 105     indexed_setter_function = get_indexed_setter_operation(interface) | 
|  | 106     includes = [] | 
|  | 107     callback_name = '0' | 
|  | 108     is_custom = False | 
|  | 109     condition_and_statements = [] | 
|  | 110     raises_exceptions = False | 
|  | 111     js_to_native_statement = '' | 
|  | 112 | 
|  | 113     if indexed_setter_function: | 
|  | 114         method_name = implemented_as_cpp_name(indexed_setter_function) | 
|  | 115         callback_name = '%sV8Internal::indexedPropertySetterCallback' % cpp_clas
     s_name | 
|  | 116         is_custom = 'Custom' in indexed_setter_function.extended_attributes | 
|  | 117         raises_exceptions = 'RaisesException' in indexed_setter_function.extende
     d_attributes | 
|  | 118         treat_null_as = indexed_setter_function.arguments[1].extended_attributes
     .get('TreatNullAs') | 
|  | 119         treat_undefined_as = indexed_setter_function.arguments[1].extended_attri
     butes.get('TreatUndefinedAs') | 
|  | 120         js_value = 'value' | 
|  | 121         native_variable_name = 'propertyValue' | 
|  | 122         js_to_native_statement, js_to_native_includes = get_js_value_to_native_s
     tatement(indexed_setter_function.arguments[1].data_type, indexed_setter_function
     .extended_attributes, js_value, native_variable_name, 'info.GetIsolate()') | 
|  | 123         if not is_custom: | 
|  | 124             includes += js_to_native_includes | 
|  | 125 | 
|  | 126         extra_arguments = [] | 
|  | 127         if raises_exceptions: | 
|  | 128             extra_arguments = ['es'] | 
|  | 129         if treat_null_as and treat_null_as != 'NullString': | 
|  | 130             arguments = ['index'] | 
|  | 131             if raises_exceptions: | 
|  | 132                 arguments += extra_arguments | 
|  | 133             condition_and_statements.append({'condition': 'value->IsNull()', 'st
     atement': 'collection->%s(%s);' % (treat_null_as, ', '.join(arguments))}) | 
|  | 134         if treat_undefined_as and treat_undefined_as != 'NullString': | 
|  | 135             arguments = ['index'] | 
|  | 136             if raises_exceptions: | 
|  | 137                 arguments += extra_arguments | 
|  | 138             condition_and_statements.append({'condition': 'value->IsUndefined()'
     , 'statement': 'collection->%s(%s);' % (treat_undefined_as, ', '.join(arguments)
     )}) | 
|  | 139         arguments = ['index', 'propertyValue'] | 
|  | 140         if raises_exceptions: | 
|  | 141             arguments += extra_arguments | 
|  | 142         condition_and_statements.append({'condition': '', 'statement': 'collecti
     on->%s(%s);' % (method_name, ', '.join(arguments))}) | 
|  | 143     parameter = { | 
|  | 144         'enabled': indexed_setter_function, | 
|  | 145         'callback_name': callback_name, | 
|  | 146         'is_custom': is_custom, | 
|  | 147         'condition_and_statements': condition_and_statements, | 
|  | 148         'raises_exceptions': raises_exceptions, | 
|  | 149         'js_to_native_statement': js_to_native_statement, | 
|  | 150     } | 
|  | 151     return parameter, includes | 
|  | 152 | 
|  | 153 | 
|  | 154 def get_indexed_property_deleter_parameter(interface): | 
|  | 155     cpp_class_name = implemented_as_cpp_name(interface) | 
|  | 156     indexed_deleter_function = get_indexed_deleter_operation(interface) | 
|  | 157     includes = [] | 
|  | 158     callback_name = '0' | 
|  | 159     is_custom = False | 
|  | 160     if indexed_deleter_function: | 
|  | 161         callback_name = '%sV8Internal::indexedPropertyDeleterCallback' % cpp_cla
     ss_name | 
|  | 162         is_custom = 'Custom' in indexed_deleter_function.extended_attributes | 
|  | 163     parameter = { | 
|  | 164         'enabled': indexed_deleter_function, | 
|  | 165         'callback_name': callback_name, | 
|  | 166         'is_custom': is_custom, | 
|  | 167     } | 
|  | 168     return parameter, includes | 
|  | 169 | 
|  | 170 | 
|  | 171 def get_named_property_getter_parameter(interface): | 
|  | 172     cpp_class_name = implemented_as_cpp_name(interface) | 
|  | 173     named_getter_function = get_named_getter_operation(interface) | 
|  | 174     includes = [] | 
|  | 175     callback_name = '0' | 
|  | 176     function_call = '' | 
|  | 177     return_type_is_union = '' | 
|  | 178     return_js_value_statement = '' | 
|  | 179     is_null_expression = '' | 
|  | 180     raises_exceptions = False | 
|  | 181     is_custom = False | 
|  | 182     not_enumerable = False | 
|  | 183     return_js_value_code = '' | 
|  | 184     is_null_expression = '' | 
|  | 185     raises_exceptions = False | 
|  | 186     override_builtins = False | 
|  | 187     is_return_type_union = False | 
|  | 188 | 
|  | 189     if named_getter_function: | 
|  | 190         is_return_type_union = is_union_type(named_getter_function.data_type) | 
|  | 191         override_builtins = 'OverrideBuiltins' in named_getter_function.extended
     _attributes | 
|  | 192         raises_exceptions = 'RaisesException' in named_getter_function.extended_
     attributes | 
|  | 193         is_custom = 'Custom' in named_getter_function.extended_attributes | 
|  | 194         callback_name = '%sV8Internal::namedPropertyGetterCallback' % cpp_class_
     name | 
|  | 195         not_enumerable = 'NotEnumerable' in named_getter_function.extended_attri
     butes | 
|  | 196         function_call = get_function_call_statements(named_getter_function.data_
     type, 'element', 'collection->' + implemented_as_cpp_name(named_getter_function)
     , 'propertyName', raises_exceptions=raises_exceptions) | 
|  | 197         is_null_expression = get_is_null_expression(named_getter_function.data_t
     ype, 'element') | 
|  | 198         native_value = get_pass_owner_expression(named_getter_function.data_type
     , 'element') | 
|  | 199         return_js_value_code, return_js_value_includes = get_native_to_js_value_
     statement(named_getter_function.data_type, named_getter_function.extended_attrib
     utes, native_value, creation_context='info.Holder()', script_wrappable='collecti
     on', isolate='info.GetIsolate()', callback_info='info', used_as_return_value=Tru
     e, indent='    ') | 
|  | 200         if not is_custom: | 
|  | 201             includes += return_js_value_includes | 
|  | 202 | 
|  | 203     parameter = { | 
|  | 204         'enabled': named_getter_function, | 
|  | 205         'callback_name': callback_name, | 
|  | 206         'not_enumerable': not_enumerable, | 
|  | 207         'is_custom': is_custom, | 
|  | 208         'override_builtins': override_builtins, | 
|  | 209         'function_call': function_call, | 
|  | 210         'is_null_expression': is_null_expression, | 
|  | 211         'return_js_value_code': return_js_value_code, | 
|  | 212         'is_return_type_union': is_return_type_union, | 
|  | 213     } | 
|  | 214     return parameter, includes | 
|  | 215 | 
|  | 216 | 
|  | 217 def get_named_property_setter_parameter(interface): | 
|  | 218     cpp_class_name = implemented_as_cpp_name(interface) | 
|  | 219     named_setter_function = get_named_setter_operation(interface) | 
|  | 220     includes = [] | 
|  | 221     callback_name = '0' | 
|  | 222     is_custom = False | 
|  | 223     if named_setter_function: | 
|  | 224         is_custom = 'Custom' in named_setter_function.extended_attributes | 
|  | 225         callback_name = '%sV8Internal::namedPropertySetterCallback' % cpp_class_
     name | 
|  | 226     parameter = { | 
|  | 227         'enabled': named_setter_function, | 
|  | 228         'callback_name': callback_name, | 
|  | 229         'is_custom': is_custom, | 
|  | 230     } | 
|  | 231     return parameter, includes | 
|  | 232 | 
|  | 233 | 
|  | 234 def get_named_property_deleter_parameter(interface): | 
|  | 235     cpp_class_name = implemented_as_cpp_name(interface) | 
|  | 236     named_deleter_function = get_named_deleter_operation(interface) | 
|  | 237     includes = [] | 
|  | 238     callback_name = '0' | 
|  | 239     is_custom = False | 
|  | 240     if named_deleter_function: | 
|  | 241         is_custom = 'Custom' in named_deleter_function.extended_attributes | 
|  | 242         callback_name = '%sV8Internal::namedPropertyDeleterCallback' % cpp_class
     _name | 
|  | 243     parameter = { | 
|  | 244         'enabled': named_deleter_function, | 
|  | 245         'callback_name': callback_name, | 
|  | 246         'is_custom': is_custom, | 
|  | 247     } | 
|  | 248     return parameter, includes | 
|  | 249 | 
|  | 250 | 
|  | 251 def get_special_accessors_parameter(interface): | 
|  | 252     includes = [] | 
|  | 253     cpp_class_name = implemented_as_cpp_name(interface) | 
|  | 254 | 
|  | 255     indexed_getter_parameter, indexed_getter_includes = get_indexed_property_get
     ter_parameter(interface) | 
|  | 256     includes += indexed_getter_includes | 
|  | 257     indexed_setter_parameter, indexed_setter_includes = get_indexed_property_set
     ter_parameter(interface) | 
|  | 258     includes += indexed_setter_includes | 
|  | 259     indexed_deleter_parameter, indexed_deleter_includes = get_indexed_property_d
     eleter_parameter(interface) | 
|  | 260     includes += indexed_deleter_includes | 
|  | 261 | 
|  | 262     named_getter_parameter, named_getter_includes = get_named_property_getter_pa
     rameter(interface) | 
|  | 263     includes += named_getter_includes | 
|  | 264     named_setter_parameter, named_setter_includes = get_named_property_setter_pa
     rameter(interface) | 
|  | 265     includes += named_setter_includes | 
|  | 266     named_deleter_parameter, named_deleter_includes = get_named_property_deleter
     _parameter(interface) | 
|  | 267     includes += named_deleter_includes | 
|  | 268 | 
|  | 269     has_indexed_enumerator = indexed_getter_parameter['enabled'] | 
|  | 270     has_indexed_query = False | 
|  | 271     if indexed_getter_parameter['not_enumerable']: | 
|  | 272         has_indexed_enumerator = False | 
|  | 273     has_named_enumerator = named_getter_parameter['enabled'] | 
|  | 274     if named_getter_parameter['not_enumerable']: | 
|  | 275         has_named_enumerator = False | 
|  | 276     has_named_query = has_named_enumerator | 
|  | 277 | 
|  | 278     indexed_enumerator_parameter = { | 
|  | 279         'enabled': has_indexed_enumerator, | 
|  | 280         'callback_name': has_indexed_enumerator and 'indexedPropertyEnumerator<%
     s>' % cpp_class_name or '0', | 
|  | 281     } | 
|  | 282     indexed_query_parameter = { | 
|  | 283         'enabled': has_indexed_query, | 
|  | 284         'callback_name': has_indexed_query and '%sV8Internal::indexedPropertyQue
     ryCallback' % cpp_class_name or '0', | 
|  | 285     } | 
|  | 286     named_enumerator_parameter = { | 
|  | 287         'enabled': has_named_enumerator, | 
|  | 288         'callback_name': has_named_enumerator and '%sV8Internal::namedPropertyEn
     umeratorCallback' % cpp_class_name or '0', | 
|  | 289     } | 
|  | 290     named_query_parameter = { | 
|  | 291         'enabled': has_named_query, | 
|  | 292         'callback_name': has_named_query and '%sV8Internal::namedPropertyQueryCa
     llback' % cpp_class_name or '0', | 
|  | 293     } | 
|  | 294 | 
|  | 295     set_on = 'Instance' | 
|  | 296     if interface.name == 'Window': | 
|  | 297         set_on = 'Prototype' | 
|  | 298 | 
|  | 299     parameter = { | 
|  | 300         'set_on': set_on, | 
|  | 301         'indexed': { | 
|  | 302             'getter': indexed_getter_parameter, | 
|  | 303             'setter': indexed_setter_parameter, | 
|  | 304             'deleter': indexed_deleter_parameter, | 
|  | 305             'enumerator': indexed_enumerator_parameter, | 
|  | 306             'query': indexed_query_parameter, | 
|  | 307         }, | 
|  | 308         'named': { | 
|  | 309             'getter': named_getter_parameter, | 
|  | 310             'setter': named_setter_parameter, | 
|  | 311             'deleter': named_deleter_parameter, | 
|  | 312             'enumerator': named_enumerator_parameter, | 
|  | 313             'query': named_query_parameter, | 
|  | 314         }, | 
|  | 315     } | 
|  | 316     return parameter, includes | 
|  | 317 | 
|  | 318 | 
|  | 319 def get_special_accessor_operation_for_type(interface, special, first_parameter_
     type, number_of_parameters): | 
|  | 320     for operation in interface.operations: | 
|  | 321         if (special in operation.specials and | 
|  | 322             len(operation.arguments) == number_of_parameters and | 
|  | 323             operation.arguments[0].data_type == first_parameter_type): | 
|  | 324             return operation | 
|  | 325     return None | 
|  | 326 | 
|  | 327 | 
|  | 328 def get_indexed_getter_operation(interface): | 
|  | 329     return get_special_accessor_operation_for_type(interface, 'getter', 'unsigne
     d long', 1) | 
|  | 330 | 
|  | 331 | 
|  | 332 def get_indexed_setter_operation(interface): | 
|  | 333     return get_special_accessor_operation_for_type(interface, 'setter', 'unsigne
     d long', 2) | 
|  | 334 | 
|  | 335 | 
|  | 336 def get_indexed_deleter_operation(interface): | 
|  | 337     return get_special_accessor_operation_for_type(interface, 'deleter', 'unsign
     ed long', 1) | 
|  | 338 | 
|  | 339 | 
|  | 340 def get_named_getter_operation(interface): | 
|  | 341     return get_special_accessor_operation_for_type(interface, 'getter', 'DOMStri
     ng', 1) | 
|  | 342 | 
|  | 343 | 
|  | 344 def get_named_setter_operation(interface): | 
|  | 345     return get_special_accessor_operation_for_type(interface, 'setter', 'DOMStri
     ng', 2) | 
|  | 346 | 
|  | 347 | 
|  | 348 def get_named_deleter_operation(interface): | 
|  | 349     return get_special_accessor_operation_for_type(interface, 'deleter', 'DOMStr
     ing', 1) | 
|  | 350 | 
|  | 351 | 
|  | 352 def has_custom_accessors(interface): | 
|  | 353     return { | 
|  | 354         'has_custom_indexed_getter': has_custom_implementation(get_indexed_gette
     r_operation(interface)), | 
|  | 355         'has_custom_indexed_setter': has_custom_implementation(get_indexed_sette
     r_operation(interface)), | 
|  | 356         'has_custom_indexed_deleter': has_custom_implementation(get_indexed_dele
     ter_operation(interface)), | 
|  | 357         'has_custom_named_getter': has_custom_implementation(get_named_getter_op
     eration(interface)), | 
|  | 358         'has_custom_named_setter': has_custom_implementation(get_named_setter_op
     eration(interface)), | 
|  | 359         'has_custom_named_deleter': has_custom_implementation(get_named_deleter_
     operation(interface)), | 
|  | 360     } | 
| OLD | NEW | 
|---|