OLD | NEW |
1 # Copyright (C) 2013 Google Inc. All rights reserved. | 1 # Copyright (C) 2013 Google Inc. All rights reserved. |
2 # | 2 # |
3 # Redistribution and use in source and binary forms, with or without | 3 # Redistribution and use in source and binary forms, with or without |
4 # modification, are permitted provided that the following conditions are | 4 # modification, are permitted provided that the following conditions are |
5 # met: | 5 # met: |
6 # | 6 # |
7 # * Redistributions of source code must retain the above copyright | 7 # * Redistributions of source code must retain the above copyright |
8 # notice, this list of conditions and the following disclaimer. | 8 # notice, this list of conditions and the following disclaimer. |
9 # * Redistributions in binary form must reproduce the above | 9 # * Redistributions in binary form must reproduce the above |
10 # copyright notice, this list of conditions and the following disclaimer | 10 # copyright notice, this list of conditions and the following disclaimer |
(...skipping 506 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
517 return 0 | 517 return 0 |
518 return min(constructor['number_of_required_arguments'] | 518 return min(constructor['number_of_required_arguments'] |
519 for constructor in constructors) | 519 for constructor in constructors) |
520 | 520 |
521 | 521 |
522 ################################################################################ | 522 ################################################################################ |
523 # Special operations (methods) | 523 # Special operations (methods) |
524 # http://heycam.github.io/webidl/#idl-special-operations | 524 # http://heycam.github.io/webidl/#idl-special-operations |
525 ################################################################################ | 525 ################################################################################ |
526 | 526 |
527 def property_getter(getter): | 527 def property_getter(getter, cpp_arguments): |
528 def is_null_expression(idl_type): | 528 def is_null_expression(idl_type): |
| 529 if v8_types.is_union_type(idl_type): |
| 530 return ' && '.join('!result%sEnabled' % i |
| 531 for i, _ in |
| 532 enumerate(idl_type.union_member_types)) |
529 if idl_type == 'DOMString': | 533 if idl_type == 'DOMString': |
530 return 'element.isNull()' | 534 return 'result.isNull()' |
531 if is_interface_type(idl_type): | 535 if is_interface_type(idl_type): |
532 return '!element' | 536 return '!result' |
533 return '' | 537 return '' |
534 | 538 |
535 def union_arguments(idl_type): | |
536 """Return list of ['element0Enabled', 'element0', 'element1Enabled', ...
]""" | |
537 return [arg | |
538 for i in range(len(idl_type.union_member_types)) | |
539 for arg in ['element%sEnabled' % i, 'element%s' % i]] | |
540 | |
541 idl_type = getter.idl_type | 539 idl_type = getter.idl_type |
542 extended_attributes = getter.extended_attributes | 540 extended_attributes = getter.extended_attributes |
| 541 is_raises_exception = 'RaisesException' in extended_attributes |
543 | 542 |
544 is_union_type = v8_types.is_union_type(idl_type) | 543 if v8_types.is_union_type(idl_type): |
545 if is_union_type: | |
546 release = [v8_types.is_interface_type(union_member_type) | 544 release = [v8_types.is_interface_type(union_member_type) |
547 for union_member_type in idl_type.union_member_types] | 545 for union_member_type in idl_type.union_member_types] |
548 else: | 546 else: |
549 release = v8_types.is_interface_type(idl_type) | 547 release = v8_types.is_interface_type(idl_type) |
550 | 548 |
| 549 # FIXME: make more generic, so can use v8_methods.cpp_value |
| 550 cpp_method_name = 'imp->%s' % cpp_name(getter) |
| 551 |
| 552 if is_raises_exception: |
| 553 cpp_arguments.append('exceptionState') |
| 554 this_union_arguments = v8_methods.union_arguments(idl_type) |
| 555 if this_union_arguments: |
| 556 cpp_arguments.extend(this_union_arguments) |
| 557 |
| 558 cpp_value = '%s(%s)' % (cpp_method_name, ', '.join(cpp_arguments)) |
| 559 |
551 return { | 560 return { |
552 'cpp_type': v8_types.cpp_type(idl_type), | 561 'cpp_type': v8_types.cpp_type(idl_type), |
| 562 'cpp_value': cpp_value, |
553 'is_custom': | 563 'is_custom': |
554 'Custom' in extended_attributes and | 564 'Custom' in extended_attributes and |
555 (not extended_attributes['Custom'] or | 565 (not extended_attributes['Custom'] or |
556 has_extended_attribute_value(getter, 'Custom', 'PropertyGetter')), | 566 has_extended_attribute_value(getter, 'Custom', 'PropertyGetter')), |
557 'is_custom_property_enumerator': has_extended_attribute_value( | 567 'is_custom_property_enumerator': has_extended_attribute_value( |
558 getter, 'Custom', 'PropertyEnumerator'), | 568 getter, 'Custom', 'PropertyEnumerator'), |
559 'is_custom_property_query': has_extended_attribute_value( | 569 'is_custom_property_query': has_extended_attribute_value( |
560 getter, 'Custom', 'PropertyQuery'), | 570 getter, 'Custom', 'PropertyQuery'), |
561 'is_enumerable': 'NotEnumerable' not in extended_attributes, | 571 'is_enumerable': 'NotEnumerable' not in extended_attributes, |
562 'is_null_expression': is_null_expression(idl_type), | 572 'is_null_expression': is_null_expression(idl_type), |
563 'is_raises_exception': 'RaisesException' in extended_attributes, | 573 'is_raises_exception': is_raises_exception, |
564 'name': cpp_name(getter), | 574 'name': cpp_name(getter), |
565 'union_arguments': union_arguments(idl_type) if is_union_type else None, | 575 'union_arguments': v8_methods.union_arguments(idl_type), |
566 'v8_set_return_value': v8_types.v8_set_return_value(idl_type, 'element',
extended_attributes=extended_attributes, script_wrappable='collection', release
=release), | 576 'v8_set_return_value': v8_types.v8_set_return_value(idl_type, 'result',
extended_attributes=extended_attributes, script_wrappable='imp', release=release
), |
567 } | 577 } |
568 | 578 |
569 | 579 |
570 def property_setter(setter): | 580 def property_setter(setter): |
571 idl_type = setter.arguments[1].idl_type | 581 idl_type = setter.arguments[1].idl_type |
572 extended_attributes = setter.extended_attributes | 582 extended_attributes = setter.extended_attributes |
573 is_raises_exception = 'RaisesException' in extended_attributes | 583 is_raises_exception = 'RaisesException' in extended_attributes |
574 return { | 584 return { |
575 'has_strict_type_checking': | 585 'has_strict_type_checking': |
576 'StrictTypeChecking' in extended_attributes and | 586 'StrictTypeChecking' in extended_attributes and |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
611 # getter TYPE [OPTIONAL_IDENTIFIER](unsigned long ARG1) | 621 # getter TYPE [OPTIONAL_IDENTIFIER](unsigned long ARG1) |
612 getter = next( | 622 getter = next( |
613 method | 623 method |
614 for method in interface.operations | 624 for method in interface.operations |
615 if ('getter' in method.specials and | 625 if ('getter' in method.specials and |
616 len(method.arguments) == 1 and | 626 len(method.arguments) == 1 and |
617 method.arguments[0].idl_type == 'unsigned long')) | 627 method.arguments[0].idl_type == 'unsigned long')) |
618 except StopIteration: | 628 except StopIteration: |
619 return None | 629 return None |
620 | 630 |
621 return property_getter(getter) | 631 return property_getter(getter, ['index']) |
622 | 632 |
623 | 633 |
624 def indexed_property_setter(interface): | 634 def indexed_property_setter(interface): |
625 try: | 635 try: |
626 # Find indexed property setter, if present; has form: | 636 # Find indexed property setter, if present; has form: |
627 # setter RETURN_TYPE [OPTIONAL_IDENTIFIER](unsigned long ARG1, ARG_TYPE
ARG2) | 637 # setter RETURN_TYPE [OPTIONAL_IDENTIFIER](unsigned long ARG1, ARG_TYPE
ARG2) |
628 setter = next( | 638 setter = next( |
629 method | 639 method |
630 for method in interface.operations | 640 for method in interface.operations |
631 if ('setter' in method.specials and | 641 if ('setter' in method.specials and |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
664 # getter TYPE [OPTIONAL_IDENTIFIER](DOMString ARG1) | 674 # getter TYPE [OPTIONAL_IDENTIFIER](DOMString ARG1) |
665 getter = next( | 675 getter = next( |
666 method | 676 method |
667 for method in interface.operations | 677 for method in interface.operations |
668 if ('getter' in method.specials and | 678 if ('getter' in method.specials and |
669 len(method.arguments) == 1 and | 679 len(method.arguments) == 1 and |
670 method.arguments[0].idl_type == 'DOMString')) | 680 method.arguments[0].idl_type == 'DOMString')) |
671 except StopIteration: | 681 except StopIteration: |
672 return None | 682 return None |
673 | 683 |
674 return property_getter(getter) | 684 getter.name = getter.name or 'anonymousNamedGetter' |
| 685 return property_getter(getter, ['propertyName']) |
675 | 686 |
676 | 687 |
677 def named_property_setter(interface): | 688 def named_property_setter(interface): |
678 try: | 689 try: |
679 # Find named property setter, if present; has form: | 690 # Find named property setter, if present; has form: |
680 # setter RETURN_TYPE [OPTIONAL_IDENTIFIER](DOMString ARG1, ARG_TYPE ARG2
) | 691 # setter RETURN_TYPE [OPTIONAL_IDENTIFIER](DOMString ARG1, ARG_TYPE ARG2
) |
681 setter = next( | 692 setter = next( |
682 method | 693 method |
683 for method in interface.operations | 694 for method in interface.operations |
684 if ('setter' in method.specials and | 695 if ('setter' in method.specials and |
(...skipping 12 matching lines...) Expand all Loading... |
697 deleter = next( | 708 deleter = next( |
698 method | 709 method |
699 for method in interface.operations | 710 for method in interface.operations |
700 if ('deleter' in method.specials and | 711 if ('deleter' in method.specials and |
701 len(method.arguments) == 1 and | 712 len(method.arguments) == 1 and |
702 method.arguments[0].idl_type == 'DOMString')) | 713 method.arguments[0].idl_type == 'DOMString')) |
703 except StopIteration: | 714 except StopIteration: |
704 return None | 715 return None |
705 | 716 |
706 return property_deleter(deleter) | 717 return property_deleter(deleter) |
OLD | NEW |