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 356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
367 conditional_enabled_attributes = v8_attributes.filter_conditionally_enabled( attributes) | 367 conditional_enabled_attributes = v8_attributes.filter_conditionally_enabled( attributes) |
368 has_conditional_attributes_on_prototype = any( # pylint: disable=invalid-na me | 368 has_conditional_attributes_on_prototype = any( # pylint: disable=invalid-na me |
369 attribute['on_prototype'] for attribute in conditional_enabled_attribute s) | 369 attribute['on_prototype'] for attribute in conditional_enabled_attribute s) |
370 context.update({ | 370 context.update({ |
371 'has_conditional_attributes_on_prototype': | 371 'has_conditional_attributes_on_prototype': |
372 has_conditional_attributes_on_prototype, | 372 has_conditional_attributes_on_prototype, |
373 'conditionally_enabled_attributes': conditional_enabled_attributes, | 373 'conditionally_enabled_attributes': conditional_enabled_attributes, |
374 }) | 374 }) |
375 | 375 |
376 # Methods | 376 # Methods |
377 methods, iterator_method = methods_context(interface) | 377 methods, iterator_method, iterator_method_alias = methods_context(interface) |
378 context.update({ | 378 context.update({ |
379 'has_origin_safe_method_setter': any(method['is_cross_origin'] and not m ethod['is_unforgeable'] | 379 'has_origin_safe_method_setter': any(method['is_cross_origin'] and not m ethod['is_unforgeable'] |
380 for method in methods), | 380 for method in methods), |
381 'iterator_method': iterator_method, | 381 'iterator_method': iterator_method, |
382 'iterator_method_alias': iterator_method_alias, | |
382 'methods': methods, | 383 'methods': methods, |
383 'conditionally_enabled_methods': v8_methods.filter_conditionally_enabled (methods, interface.is_partial), | 384 'conditionally_enabled_methods': v8_methods.filter_conditionally_enabled (methods, interface.is_partial), |
384 }) | 385 }) |
385 | 386 |
386 # Window.idl in Blink has indexed properties, but the spec says Window | 387 # Window.idl in Blink has indexed properties, but the spec says Window |
387 # interface doesn't have indexed properties, instead the WindowProxy exotic | 388 # interface doesn't have indexed properties, instead the WindowProxy exotic |
388 # object has indexed properties. Thus, Window interface must not support | 389 # object has indexed properties. Thus, Window interface must not support |
389 # iterators. | 390 # iterators. |
390 has_array_iterator = (not interface.is_partial and | 391 has_array_iterator = (not interface.is_partial and |
391 interface.has_indexed_elements and | 392 interface.has_indexed_elements and |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
500 return attributes | 501 return attributes |
501 | 502 |
502 | 503 |
503 def methods_context(interface): | 504 def methods_context(interface): |
504 """Creates a list of Jinja template contexts for methods of an interface. | 505 """Creates a list of Jinja template contexts for methods of an interface. |
505 | 506 |
506 Args: | 507 Args: |
507 interface: An interface to create contexts for | 508 interface: An interface to create contexts for |
508 | 509 |
509 Returns: | 510 Returns: |
510 A list of method contexts, and an iterator context if available or None | 511 A list of method contexts, an iterator context if available or None, |
512 and string that can also be used to refer to the @@iterator symbol or | |
513 None. | |
511 """ | 514 """ |
512 | 515 |
513 methods = [] | 516 methods = [] |
514 | 517 |
515 if interface.original_interface: | 518 if interface.original_interface: |
516 methods.extend([v8_methods.method_context(interface, operation, is_visib le=False) | 519 methods.extend([v8_methods.method_context(interface, operation, is_visib le=False) |
517 for operation in interface.original_interface.operations | 520 for operation in interface.original_interface.operations |
518 if operation.name]) | 521 if operation.name]) |
519 methods.extend([v8_methods.method_context(interface, method) | 522 methods.extend([v8_methods.method_context(interface, method) |
520 for method in interface.operations | 523 for method in interface.operations |
(...skipping 24 matching lines...) Expand all Loading... | |
545 argument.idl_type = idl_type | 548 argument.idl_type = idl_type |
546 argument.name = name | 549 argument.name = name |
547 argument.is_optional = is_optional | 550 argument.is_optional = is_optional |
548 if extended_attributes: | 551 if extended_attributes: |
549 argument.extended_attributes.update(extended_attributes) | 552 argument.extended_attributes.update(extended_attributes) |
550 return argument | 553 return argument |
551 | 554 |
552 # iterable<>, maplike<> and setlike<> | 555 # iterable<>, maplike<> and setlike<> |
553 iterator_method = None | 556 iterator_method = None |
554 | 557 |
558 # Depending on the declaration, @@iterator may be a synonym for e.g. | |
559 # 'entries' or 'values'. | |
560 iterator_method_alias = None | |
561 | |
555 # FIXME: support Iterable in partial interfaces. However, we don't | 562 # FIXME: support Iterable in partial interfaces. However, we don't |
556 # need to support iterator overloads between interface and | 563 # need to support iterator overloads between interface and |
557 # partial interface definitions. | 564 # partial interface definitions. |
558 # http://heycam.github.io/webidl/#idl-overloading | 565 # http://heycam.github.io/webidl/#idl-overloading |
559 if (not interface.is_partial and ( | 566 if (not interface.is_partial and ( |
560 interface.iterable or interface.maplike or interface.setlike or | 567 interface.iterable or interface.maplike or interface.setlike or |
561 interface.has_indexed_elements)): | 568 interface.has_indexed_elements)): |
562 | 569 |
563 used_extended_attributes = {} | 570 used_extended_attributes = {} |
564 | 571 |
(...skipping 30 matching lines...) Expand all Loading... | |
595 iterator_method = generated_iterator_method('iterator', implemented_ as='GetIterator') | 602 iterator_method = generated_iterator_method('iterator', implemented_ as='GetIterator') |
596 | 603 |
597 if interface.iterable or interface.maplike or interface.setlike: | 604 if interface.iterable or interface.maplike or interface.setlike: |
598 non_overridable_methods = [] | 605 non_overridable_methods = [] |
599 overridable_methods = [] | 606 overridable_methods = [] |
600 | 607 |
601 is_value_iterator = interface.iterable and interface.iterable.key_ty pe is None | 608 is_value_iterator = interface.iterable and interface.iterable.key_ty pe is None |
602 | 609 |
603 # For value iterators, the |entries|, |forEach|, |keys| and |values| are originally set | 610 # For value iterators, the |entries|, |forEach|, |keys| and |values| are originally set |
604 # to corresponding properties in %ArrayPrototype%. | 611 # to corresponding properties in %ArrayPrototype%. |
612 # For pair iterators and maplike declarations, |entries| is an alias for @@iterator | |
613 # itself. For setlike declarations, |values| is an alias for @@itera tor. | |
605 if not is_value_iterator: | 614 if not is_value_iterator: |
615 if not interface.setlike: | |
616 iterator_method_alias = 'entries' | |
617 entries_or_values_method = generated_iterator_method('values ') | |
618 else: | |
619 iterator_method_alias = 'values' | |
620 entries_or_values_method = generated_iterator_method('entrie s') | |
621 | |
606 non_overridable_methods.extend([ | 622 non_overridable_methods.extend([ |
607 generated_iterator_method('keys'), | 623 generated_iterator_method('keys'), |
608 generated_iterator_method('values'), | 624 entries_or_values_method, |
609 generated_iterator_method('entries'), | |
610 | 625 |
611 # void forEach(Function callback, [Default=Undefined] option al any thisArg) | 626 # void forEach(Function callback, [Default=Undefined] option al any thisArg) |
612 generated_method(IdlType('void'), 'forEach', | 627 generated_method(IdlType('void'), 'forEach', |
613 arguments=[generated_argument(IdlType('Func tion'), 'callback'), | 628 arguments=[generated_argument(IdlType('Func tion'), 'callback'), |
614 generated_argument(IdlType('any' ), 'thisArg', | 629 generated_argument(IdlType('any' ), 'thisArg', |
615 is_optional=T rue, | 630 is_optional=T rue, |
616 extended_attr ibutes={'Default': 'Undefined'})], | 631 extended_attr ibutes={'Default': 'Undefined'})], |
617 extended_attributes=forEach_extended_attrib utes), | 632 extended_attributes=forEach_extended_attrib utes), |
618 ]) | 633 ]) |
619 | 634 |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
726 # operation is a static operation) with identifier id on interface I and | 741 # operation is a static operation) with identifier id on interface I and |
727 # with argument count 0. | 742 # with argument count 0. |
728 # 2. Return the length of the shortest argument list of the entries in S . | 743 # 2. Return the length of the shortest argument list of the entries in S . |
729 # FIXME: This calculation doesn't take into account whether runtime | 744 # FIXME: This calculation doesn't take into account whether runtime |
730 # enabled overloads are actually enabled, so length may be incorrect. | 745 # enabled overloads are actually enabled, so length may be incorrect. |
731 # E.g., [RuntimeEnabled=Foo] void f(); void f(long x); | 746 # E.g., [RuntimeEnabled=Foo] void f(); void f(long x); |
732 # should have length 1 if Foo is not enabled, but length 0 if it is. | 747 # should have length 1 if Foo is not enabled, but length 0 if it is. |
733 method['length'] = (method['overloads']['length'] if 'overloads' in meth od else | 748 method['length'] = (method['overloads']['length'] if 'overloads' in meth od else |
734 method['number_of_required_arguments']) | 749 method['number_of_required_arguments']) |
735 | 750 |
736 return methods, iterator_method | 751 return methods, iterator_method, iterator_method_alias |
bashi
2017/05/21 23:27:48
nit: I'd prefer to use a dict here.
Raphael Kubo da Costa (rakuco)
2017/05/22 09:29:52
Makes total sense :) Done in patch v3, which I'll
| |
737 | 752 |
738 | 753 |
739 def reflected_name(constant_name): | 754 def reflected_name(constant_name): |
740 """Returns the name to use for the matching constant name in blink code. | 755 """Returns the name to use for the matching constant name in blink code. |
741 | 756 |
742 Given an all-uppercase 'CONSTANT_NAME', returns a camel-case | 757 Given an all-uppercase 'CONSTANT_NAME', returns a camel-case |
743 'kConstantName'. | 758 'kConstantName'. |
744 """ | 759 """ |
745 # Check for SHOUTY_CASE constants | 760 # Check for SHOUTY_CASE constants |
746 if constant_name.upper() != constant_name: | 761 if constant_name.upper() != constant_name: |
(...skipping 667 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1414 extended_attributes = deleter.extended_attributes | 1429 extended_attributes = deleter.extended_attributes |
1415 is_call_with_script_state = v8_utilities.has_extended_attribute_value(delete r, 'CallWith', 'ScriptState') | 1430 is_call_with_script_state = v8_utilities.has_extended_attribute_value(delete r, 'CallWith', 'ScriptState') |
1416 is_ce_reactions = 'CEReactions' in extended_attributes | 1431 is_ce_reactions = 'CEReactions' in extended_attributes |
1417 return { | 1432 return { |
1418 'is_call_with_script_state': is_call_with_script_state, | 1433 'is_call_with_script_state': is_call_with_script_state, |
1419 'is_ce_reactions': is_ce_reactions, | 1434 'is_ce_reactions': is_ce_reactions, |
1420 'is_custom': 'Custom' in extended_attributes, | 1435 'is_custom': 'Custom' in extended_attributes, |
1421 'is_raises_exception': 'RaisesException' in extended_attributes, | 1436 'is_raises_exception': 'RaisesException' in extended_attributes, |
1422 'name': cpp_name(deleter), | 1437 'name': cpp_name(deleter), |
1423 } | 1438 } |
OLD | NEW |