OLD | NEW |
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 19 matching lines...) Expand all Loading... |
30 """Generate template values for an interface. | 30 """Generate template values for an interface. |
31 | 31 |
32 Design doc: http://www.chromium.org/developers/design-documents/idl-compiler | 32 Design doc: http://www.chromium.org/developers/design-documents/idl-compiler |
33 """ | 33 """ |
34 | 34 |
35 from collections import defaultdict | 35 from collections import defaultdict |
36 import itertools | 36 import itertools |
37 from operator import itemgetter | 37 from operator import itemgetter |
38 | 38 |
39 import idl_definitions | 39 import idl_definitions |
40 from idl_definitions import IdlOperation | 40 from idl_definitions import IdlOperation, IdlArgument |
41 import idl_types | 41 import idl_types |
42 from idl_types import IdlType, inherits_interface | 42 from idl_types import IdlType, inherits_interface |
43 import v8_attributes | 43 import v8_attributes |
44 from v8_globals import includes | 44 from v8_globals import includes |
45 import v8_methods | 45 import v8_methods |
46 import v8_types | 46 import v8_types |
47 from v8_types import cpp_ptr_type, cpp_template_type | 47 from v8_types import cpp_ptr_type, cpp_template_type |
48 import v8_utilities | 48 import v8_utilities |
49 from v8_utilities import (cpp_name_or_partial, capitalize, conditional_string, c
pp_name, gc_type, | 49 from v8_utilities import (cpp_name_or_partial, capitalize, conditional_string, c
pp_name, gc_type, |
50 has_extended_attribute_value, runtime_enabled_function
_name, | 50 has_extended_attribute_value, runtime_enabled_function
_name, |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
325 def generated_method(return_type, name, arguments=None, extended_attributes=
None): | 325 def generated_method(return_type, name, arguments=None, extended_attributes=
None): |
326 operation = IdlOperation(interface.idl_name) | 326 operation = IdlOperation(interface.idl_name) |
327 operation.idl_type = return_type | 327 operation.idl_type = return_type |
328 operation.name = name | 328 operation.name = name |
329 if arguments: | 329 if arguments: |
330 operation.arguments = arguments | 330 operation.arguments = arguments |
331 if extended_attributes: | 331 if extended_attributes: |
332 operation.extended_attributes.update(extended_attributes) | 332 operation.extended_attributes.update(extended_attributes) |
333 return v8_methods.method_context(interface, operation) | 333 return v8_methods.method_context(interface, operation) |
334 | 334 |
| 335 def generated_argument(idl_type, name, is_optional=False, extended_attribute
s=None): |
| 336 argument = IdlArgument(interface.idl_name) |
| 337 argument.idl_type = idl_type |
| 338 argument.name = name |
| 339 argument.is_optional = is_optional |
| 340 if extended_attributes: |
| 341 argument.extended_attributes.update(extended_attributes) |
| 342 return argument |
| 343 |
335 # [Iterable], iterable<>, maplike<> and setlike<> | 344 # [Iterable], iterable<>, maplike<> and setlike<> |
336 iterator_method = None | 345 iterator_method = None |
337 # FIXME: support Iterable in partial interfaces. However, we don't | 346 # FIXME: support Iterable in partial interfaces. However, we don't |
338 # need to support iterator overloads between interface and | 347 # need to support iterator overloads between interface and |
339 # partial interface definitions. | 348 # partial interface definitions. |
340 # http://heycam.github.io/webidl/#idl-overloading | 349 # http://heycam.github.io/webidl/#idl-overloading |
341 if (not interface.is_partial | 350 if (not interface.is_partial |
342 and (interface.iterable or interface.maplike or interface.setlike | 351 and (interface.iterable or interface.maplike or interface.setlike |
343 or 'Iterable' in extended_attributes)): | 352 or 'Iterable' in extended_attributes)): |
344 | 353 |
345 used_extended_attributes = {} | 354 used_extended_attributes = {} |
346 | 355 |
347 if interface.iterable: | 356 if interface.iterable: |
348 used_extended_attributes.update(interface.iterable.extended_attribut
es) | 357 used_extended_attributes.update(interface.iterable.extended_attribut
es) |
349 elif interface.maplike: | 358 elif interface.maplike: |
350 used_extended_attributes.update(interface.maplike.extended_attribute
s) | 359 used_extended_attributes.update(interface.maplike.extended_attribute
s) |
351 elif interface.setlike: | 360 elif interface.setlike: |
352 used_extended_attributes.update(interface.setlike.extended_attribute
s) | 361 used_extended_attributes.update(interface.setlike.extended_attribute
s) |
353 | 362 |
354 if 'RaisesException' in used_extended_attributes: | 363 if 'RaisesException' in used_extended_attributes: |
355 raise ValueError('[RaisesException] is implied for iterable<>/maplik
e<>/setlike<>') | 364 raise ValueError('[RaisesException] is implied for iterable<>/maplik
e<>/setlike<>') |
356 if 'CallWith' in used_extended_attributes: | 365 if 'CallWith' in used_extended_attributes: |
357 raise ValueError('[CallWith=ScriptState] is implied for iterable<>/m
aplike<>/setlike<>') | 366 raise ValueError('[CallWith=ScriptState] is implied for iterable<>/m
aplike<>/setlike<>') |
358 | 367 |
359 used_extended_attributes.update({ | 368 used_extended_attributes.update({ |
360 'RaisesException': None, | 369 'RaisesException': None, |
361 'CallWith': 'ScriptState', | 370 'CallWith': 'ScriptState', |
362 }) | 371 }) |
363 | 372 |
| 373 forEach_extended_attributes = used_extended_attributes.copy() |
| 374 forEach_extended_attributes.update({ |
| 375 'CallWith': ['ScriptState', 'ThisValue'], |
| 376 }) |
| 377 |
364 def generated_iterator_method(name): | 378 def generated_iterator_method(name): |
365 return generated_method( | 379 return generated_method( |
366 return_type=IdlType('Iterator'), | 380 return_type=IdlType('Iterator'), |
367 name=name, | 381 name=name, |
368 extended_attributes=used_extended_attributes) | 382 extended_attributes=used_extended_attributes) |
369 | 383 |
370 iterator_method = generated_iterator_method('iterator') | 384 iterator_method = generated_iterator_method('iterator') |
371 | 385 |
372 if interface.iterable or interface.maplike or interface.setlike: | 386 if interface.iterable or interface.maplike or interface.setlike: |
373 methods.extend([ | 387 methods.extend([ |
374 generated_iterator_method('keys'), | 388 generated_iterator_method('keys'), |
375 generated_iterator_method('values'), | 389 generated_iterator_method('values'), |
376 generated_iterator_method('entries'), | 390 generated_iterator_method('entries'), |
| 391 |
| 392 # void forEach(Function callback, [Default=Undefined] optional a
ny thisArg) |
| 393 generated_method(IdlType('void'), 'forEach', |
| 394 arguments=[generated_argument(IdlType('Function
'), 'callback'), |
| 395 generated_argument(IdlType('any'), '
thisArg', |
| 396 is_optional=True, |
| 397 extended_attribut
es={'Default': 'Undefined'})], |
| 398 extended_attributes=forEach_extended_attributes
), |
377 ]) | 399 ]) |
378 | 400 |
379 # FIXME: maplike<> and setlike<> should also imply the presence of a | 401 # FIXME: maplike<> and setlike<> should also imply the presence of a |
380 # subset of keys(), values(), entries(), forEach(), has(), get(), add(), | 402 # subset of keys(), values(), entries(), forEach(), has(), get(), add(), |
381 # set(), delete() and clear(), and a 'size' attribute. | 403 # set(), delete() and clear(), and a 'size' attribute. |
382 | 404 |
383 # Stringifier | 405 # Stringifier |
384 if interface.stringifier: | 406 if interface.stringifier: |
385 stringifier = interface.stringifier | 407 stringifier = interface.stringifier |
386 stringifier_ext_attrs = stringifier.extended_attributes.copy() | 408 stringifier_ext_attrs = stringifier.extended_attributes.copy() |
(...skipping 826 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1213 if str(idl_type) != 'boolean': | 1235 if str(idl_type) != 'boolean': |
1214 raise Exception( | 1236 raise Exception( |
1215 'Only deleters with boolean type are allowed, but type is "%s"' % | 1237 'Only deleters with boolean type are allowed, but type is "%s"' % |
1216 idl_type) | 1238 idl_type) |
1217 extended_attributes = deleter.extended_attributes | 1239 extended_attributes = deleter.extended_attributes |
1218 return { | 1240 return { |
1219 'is_custom': 'Custom' in extended_attributes, | 1241 'is_custom': 'Custom' in extended_attributes, |
1220 'is_raises_exception': 'RaisesException' in extended_attributes, | 1242 'is_raises_exception': 'RaisesException' in extended_attributes, |
1221 'name': cpp_name(deleter), | 1243 'name': cpp_name(deleter), |
1222 } | 1244 } |
OLD | NEW |