OLD | NEW |
1 #!/usr/bin/python | 1 #!/usr/bin/python |
2 # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 2 # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
3 # for details. All rights reserved. Use of this source code is governed by a | 3 # for details. All rights reserved. Use of this source code is governed by a |
4 # BSD-style license that can be found in the LICENSE file. | 4 # BSD-style license that can be found in the LICENSE file. |
5 | 5 |
6 """This module provides shared functionality for the systems to generate | 6 """This module provides shared functionality for the systems to generate |
7 native binding from the IDL database.""" | 7 native binding from the IDL database.""" |
8 | 8 |
9 import emitter | 9 import emitter |
10 import os | 10 import os |
(...skipping 514 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
525 dispatch_emitter: an dispatch_emitter for the body of a block of code. | 525 dispatch_emitter: an dispatch_emitter for the body of a block of code. |
526 info: the compound information about the operation and its overloads. | 526 info: the compound information about the operation and its overloads. |
527 indent: an indentation string for generated code. | 527 indent: an indentation string for generated code. |
528 operation: the IDLOperation to call. | 528 operation: the IDLOperation to call. |
529 """ | 529 """ |
530 | 530 |
531 # FIXME: support ImplementedBy callbacks. | 531 # FIXME: support ImplementedBy callbacks. |
532 if 'ImplementedBy' in operation.ext_attrs: | 532 if 'ImplementedBy' in operation.ext_attrs: |
533 return | 533 return |
534 | 534 |
535 for op in self._interface.operations: | |
536 if op.id != operation.id or len(op.arguments) <= len(operation.arguments): | |
537 continue | |
538 next_argument = op.arguments[len(operation.arguments)] | |
539 if next_argument.is_optional and 'Callback' in next_argument.ext_attrs: | |
540 # FIXME: '[Optional, Callback]' arguments could be non-optional in | |
541 # webcore. We need to fix overloads handling to generate native | |
542 # callbacks properly. | |
543 return | |
544 | |
545 self._native_version += 1 | 535 self._native_version += 1 |
546 native_name = info.name | 536 native_name = info.name |
547 if self._native_version > 1: | 537 if self._native_version > 1: |
548 native_name = '%s_%s' % (native_name, self._native_version) | 538 native_name = '%s_%s' % (native_name, self._native_version) |
549 argument_list = ', '.join([info.arg_infos[i][0] | 539 argument_list = ', '.join([info.arg_infos[i][0] |
550 for (i, arg) in enumerate(operation.arguments)]) | 540 for (i, arg) in enumerate(operation.arguments)]) |
551 | 541 |
552 # Generate dispatcher. | 542 # Generate dispatcher. |
553 if info.type_name != 'void': | 543 if info.type_name != 'void': |
554 dispatch_emitter.Emit('$(INDENT)return _$NATIVENAME($ARGS);\n', | 544 dispatch_emitter.Emit('$(INDENT)return _$NATIVENAME($ARGS);\n', |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
729 callback = emitter.Format(template, **template_parameters) | 719 callback = emitter.Format(template, **template_parameters) |
730 | 720 |
731 self._cpp_definitions_emitter.Emit(callback) | 721 self._cpp_definitions_emitter.Emit(callback) |
732 | 722 |
733 def _GenerateParameterAdapter(self, emitter, idl_argument, index): | 723 def _GenerateParameterAdapter(self, emitter, idl_argument, index): |
734 type_info = GetIDLTypeInfo(idl_argument.type) | 724 type_info = GetIDLTypeInfo(idl_argument.type) |
735 (adapter_type, include_name) = type_info.parameter_adapter_info() | 725 (adapter_type, include_name) = type_info.parameter_adapter_info() |
736 if include_name: | 726 if include_name: |
737 self._cpp_impl_includes[include_name] = 1 | 727 self._cpp_impl_includes[include_name] = 1 |
738 flags = '' | 728 flags = '' |
739 if idl_argument.ext_attrs.get('Optionial') == 'DefaultIsNullString': | 729 if (idl_argument.ext_attrs.get('Optionial') == 'DefaultIsNullString' or |
740 flags = ', DartUtilities::ConvertNullToEmptyString' | 730 ('Optional' in idl_argument.ext_attrs and 'Callback' in idl_argument.ext
_attrs)): |
| 731 flags = ', DartUtilities::ConvertNullToDefaultValue' |
741 emitter.Emit( | 732 emitter.Emit( |
742 '\n' | 733 '\n' |
743 ' const $ADAPTER_TYPE $NAME(Dart_GetNativeArgument(args, $INDEX)$
FLAGS);\n' | 734 ' const $ADAPTER_TYPE $NAME(Dart_GetNativeArgument(args, $INDEX)$
FLAGS);\n' |
744 ' if (!$NAME.conversionSuccessful()) {\n' | 735 ' if (!$NAME.conversionSuccessful()) {\n' |
745 ' exception = $NAME.exception();\n' | 736 ' exception = $NAME.exception();\n' |
746 ' goto fail;\n' | 737 ' goto fail;\n' |
747 ' }\n', | 738 ' }\n', |
748 ADAPTER_TYPE=adapter_type, | 739 ADAPTER_TYPE=adapter_type, |
749 NAME=idl_argument.id, | 740 NAME=idl_argument.id, |
750 INDEX=index + 1, | 741 INDEX=index + 1, |
(...skipping 28 matching lines...) Expand all Loading... |
779 namespace = 'HTMLNames' | 770 namespace = 'HTMLNames' |
780 svg_exceptions = ['class', 'id', 'onabort', 'onclick', 'onerror', 'onload', | 771 svg_exceptions = ['class', 'id', 'onabort', 'onclick', 'onerror', 'onload', |
781 'onmousedown', 'onmousemove', 'onmouseout', 'onmouseover', | 772 'onmousedown', 'onmousemove', 'onmouseout', 'onmouseover', |
782 'onmouseup', 'onresize', 'onscroll', 'onunload'] | 773 'onmouseup', 'onresize', 'onscroll', 'onunload'] |
783 if self._interface.id.startswith('SVG') and not attr.id in svg_exceptions: | 774 if self._interface.id.startswith('SVG') and not attr.id in svg_exceptions: |
784 namespace = 'SVGNames' | 775 namespace = 'SVGNames' |
785 self._cpp_impl_includes[namespace] = 1 | 776 self._cpp_impl_includes[namespace] = 1 |
786 | 777 |
787 attribute_name = attr.ext_attrs['Reflect'] or attr.id.lower() | 778 attribute_name = attr.ext_attrs['Reflect'] or attr.id.lower() |
788 return 'WebCore::%s::%sAttr' % (namespace, attribute_name) | 779 return 'WebCore::%s::%sAttr' % (namespace, attribute_name) |
OLD | NEW |