| 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 |
| 11 import systembase | 11 import systembase |
| 12 from generator import * | 12 from generator import * |
| 13 from systemhtml import HtmlSystemShared | |
| 14 | 13 |
| 15 | 14 |
| 16 class NativeImplementationSystem(systembase.System): | 15 class NativeImplementationSystem(systembase.System): |
| 17 | 16 |
| 18 def __init__(self, context, auxiliary_dir): | 17 def __init__(self, context, auxiliary_dir): |
| 19 super(NativeImplementationSystem, self).__init__(context) | 18 super(NativeImplementationSystem, self).__init__(context) |
| 20 self._auxiliary_dir = auxiliary_dir | 19 self._auxiliary_dir = auxiliary_dir |
| 21 self._cpp_header_files = [] | 20 self._cpp_header_files = [] |
| 22 self._cpp_impl_files = [] | 21 self._cpp_impl_files = [] |
| 23 self._html_system = HtmlSystemShared(self._database) | |
| 24 | 22 |
| 25 def ImplementationGenerator(self, interface): | 23 def ImplementationGenerator(self, interface): |
| 26 return NativeImplementationGenerator(self, interface) | 24 return NativeImplementationGenerator(self, interface) |
| 27 | 25 |
| 28 def ProcessCallback(self, interface, info): | 26 def ProcessCallback(self, interface, info): |
| 29 self._interface = interface | 27 self._interface = interface |
| 30 | 28 |
| 31 if IsPureInterface(self._interface.id): | 29 if IsPureInterface(self._interface.id): |
| 32 return None | 30 return None |
| 33 | 31 |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 160 Args: | 158 Args: |
| 161 system: The NativeImplementationSystem. | 159 system: The NativeImplementationSystem. |
| 162 interface: an IDLInterface instance. It is assumed that all types have | 160 interface: an IDLInterface instance. It is assumed that all types have |
| 163 been converted to Dart types (e.g. int, String), unless they are in | 161 been converted to Dart types (e.g. int, String), unless they are in |
| 164 the same package as the interface. | 162 the same package as the interface. |
| 165 """ | 163 """ |
| 166 super(NativeImplementationGenerator, self).__init__( | 164 super(NativeImplementationGenerator, self).__init__( |
| 167 system._database, interface) | 165 system._database, interface) |
| 168 self._system = system | 166 self._system = system |
| 169 self._current_secondary_parent = None | 167 self._current_secondary_parent = None |
| 170 self._html_system = self._system._html_system | 168 self._html_interface_name = system._type_registry.InterfaceName(self._interf
ace.id) |
| 171 self._html_interface_name = self._html_system._html_renames.get( | |
| 172 self._interface.id, self._interface.id) | |
| 173 | 169 |
| 174 def HasImplementation(self): | 170 def HasImplementation(self): |
| 175 return not IsPureInterface(self._interface.id) | 171 return not IsPureInterface(self._interface.id) |
| 176 | 172 |
| 177 def ImplementationClassName(self): | 173 def ImplementationClassName(self): |
| 178 return self._ImplClassName(self._interface.id) | 174 return self._ImplClassName(self._interface.id) |
| 179 | 175 |
| 180 def FilePathForDartImplementation(self): | 176 def FilePathForDartImplementation(self): |
| 181 return os.path.join(self._system._output_dir, 'dart', | 177 return os.path.join(self._system._output_dir, 'dart', |
| 182 '%sImplementation.dart' % self._interface.id) | 178 '%sImplementation.dart' % self._interface.id) |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 313 | 309 |
| 314 self._GenerateNativeCallback(callback_name='constructorCallback', | 310 self._GenerateNativeCallback(callback_name='constructorCallback', |
| 315 parameter_definitions=parameter_definitions_emitter.Fragments(), | 311 parameter_definitions=parameter_definitions_emitter.Fragments(), |
| 316 needs_receiver=False, invocation=invocation, | 312 needs_receiver=False, invocation=invocation, |
| 317 raises_exceptions=raises_exceptions, | 313 raises_exceptions=raises_exceptions, |
| 318 runtime_check=runtime_check) | 314 runtime_check=runtime_check) |
| 319 | 315 |
| 320 def _ImplClassName(self, interface_name): | 316 def _ImplClassName(self, interface_name): |
| 321 return '_%sImpl' % interface_name | 317 return '_%sImpl' % interface_name |
| 322 | 318 |
| 323 def _DartType(self, idl_type): | |
| 324 return self._html_system.DartType(idl_type) | |
| 325 | |
| 326 def _BaseClassName(self): | 319 def _BaseClassName(self): |
| 327 root_class = 'NativeFieldWrapperClass1' | 320 root_class = 'NativeFieldWrapperClass1' |
| 328 | 321 |
| 329 if not self._interface.parents: | 322 if not self._interface.parents: |
| 330 return root_class | 323 return root_class |
| 331 | 324 |
| 332 supertype = self._interface.parents[0].type.id | 325 supertype = self._interface.parents[0].type.id |
| 333 | 326 |
| 334 if IsPureInterface(supertype): # The class is a root. | 327 if IsPureInterface(supertype): # The class is a root. |
| 335 return root_class | 328 return root_class |
| (...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 637 'Callback', True) | 630 'Callback', True) |
| 638 | 631 |
| 639 def _HasNativeIndexSetter(self): | 632 def _HasNativeIndexSetter(self): |
| 640 return 'CustomIndexedSetter' in self._interface.ext_attrs | 633 return 'CustomIndexedSetter' in self._interface.ext_attrs |
| 641 | 634 |
| 642 def _EmitNativeIndexSetter(self, element_type): | 635 def _EmitNativeIndexSetter(self, element_type): |
| 643 dart_declaration = 'void operator[]=(int index, %s value)' % element_type | 636 dart_declaration = 'void operator[]=(int index, %s value)' % element_type |
| 644 self._GenerateNativeBinding('numericIndexSetter', 3, dart_declaration, | 637 self._GenerateNativeBinding('numericIndexSetter', 3, dart_declaration, |
| 645 'Callback', True) | 638 'Callback', True) |
| 646 | 639 |
| 647 def _AddOperation(self, info): | 640 def AddOperation(self, info, html_name): |
| 648 """ | 641 """ |
| 649 Arguments: | 642 Arguments: |
| 650 info: An OperationInfo object. | 643 info: An OperationInfo object. |
| 651 """ | 644 """ |
| 652 | 645 |
| 653 operation = info.operations[0] | 646 operation = info.operations[0] |
| 654 | 647 |
| 655 if 'CheckSecurityForNode' in operation.ext_attrs: | 648 if 'CheckSecurityForNode' in operation.ext_attrs: |
| 656 # FIXME: exclude from interface as well. | 649 # FIXME: exclude from interface as well. |
| 657 return | 650 return |
| 658 | 651 |
| 659 html_name = self._html_system.RenameInHtmlLibrary( | |
| 660 self._interface.id, info.name, implementation_class=True) | |
| 661 | |
| 662 if not html_name and info.name == 'item': | |
| 663 # FIXME: item should be renamed to operator[], not removed. | |
| 664 html_name = '_item' | |
| 665 | |
| 666 if not html_name: | |
| 667 return | |
| 668 | |
| 669 is_custom = 'Custom' in operation.ext_attrs | 652 is_custom = 'Custom' in operation.ext_attrs |
| 670 has_optional_arguments = any(_IsArgumentOptionalInWebCore(argument) for argu
ment in operation.arguments) | 653 has_optional_arguments = any(_IsArgumentOptionalInWebCore(argument) for argu
ment in operation.arguments) |
| 671 needs_dispatcher = not is_custom and (len(info.operations) > 1 or has_option
al_arguments) | 654 needs_dispatcher = not is_custom and (len(info.operations) > 1 or has_option
al_arguments) |
| 672 | 655 |
| 673 if not needs_dispatcher: | 656 if not needs_dispatcher: |
| 674 type_renamer = self._DartType | 657 type_renamer = self._DartType |
| 675 default_value = 'null' | 658 default_value = 'null' |
| 676 else: | 659 else: |
| 677 type_renamer = lambda x: 'Dynamic' | 660 type_renamer = lambda x: 'Dynamic' |
| 678 default_value = '_null' | 661 default_value = '_null' |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 747 GenerateChecksAndCall(operation, len(operation.arguments)) | 730 GenerateChecksAndCall(operation, len(operation.arguments)) |
| 748 body.Emit(' throw "Incorrect number or type of arguments";\n'); | 731 body.Emit(' throw "Incorrect number or type of arguments";\n'); |
| 749 else: | 732 else: |
| 750 operation = operations[0] | 733 operation = operations[0] |
| 751 for position, argument in list(enumerate(operation.arguments))[::-1]: | 734 for position, argument in list(enumerate(operation.arguments))[::-1]: |
| 752 if _IsArgumentOptionalInWebCore(argument): | 735 if _IsArgumentOptionalInWebCore(argument): |
| 753 check = '%s === _null' % argument_names[position] | 736 check = '%s === _null' % argument_names[position] |
| 754 GenerateCall(operation, position, [check]) | 737 GenerateCall(operation, position, [check]) |
| 755 GenerateCall(operation, len(operation.arguments), []) | 738 GenerateCall(operation, len(operation.arguments), []) |
| 756 | 739 |
| 757 def AddOperation(self, info): | |
| 758 self._AddOperation(info) | |
| 759 | |
| 760 def AddStaticOperation(self, info): | |
| 761 self._AddOperation(info) | |
| 762 | |
| 763 def SecondaryContext(self, interface): | 740 def SecondaryContext(self, interface): |
| 764 pass | 741 pass |
| 765 | 742 |
| 766 def _GenerateOperationNativeCallback(self, operation, arguments, cpp_callback_
name): | 743 def _GenerateOperationNativeCallback(self, operation, arguments, cpp_callback_
name): |
| 767 webcore_function_name = operation.ext_attrs.get('ImplementedAs', operation.i
d) | 744 webcore_function_name = operation.ext_attrs.get('ImplementedAs', operation.i
d) |
| 768 | 745 |
| 769 parameter_definitions_emitter = emitter.Emitter() | 746 parameter_definitions_emitter = emitter.Emitter() |
| 770 cpp_arguments = [] | 747 cpp_arguments = [] |
| 771 raises_exceptions = self._GenerateCallWithHandling( | 748 raises_exceptions = self._GenerateCallWithHandling( |
| 772 operation, parameter_definitions_emitter, cpp_arguments) | 749 operation, parameter_definitions_emitter, cpp_arguments) |
| (...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 966 | 943 |
| 967 def _IsArgumentOptionalInWebCore(argument): | 944 def _IsArgumentOptionalInWebCore(argument): |
| 968 return IsOptional(argument) and not 'Callback' in argument.ext_attrs | 945 return IsOptional(argument) and not 'Callback' in argument.ext_attrs |
| 969 | 946 |
| 970 def _ToWebKitName(name): | 947 def _ToWebKitName(name): |
| 971 name = name[0].lower() + name[1:] | 948 name = name[0].lower() + name[1:] |
| 972 name = re.sub(r'^(hTML|uRL|jS|xML|xSLT)', lambda s: s.group(1).lower(), | 949 name = re.sub(r'^(hTML|uRL|jS|xML|xSLT)', lambda s: s.group(1).lower(), |
| 973 name) | 950 name) |
| 974 return re.sub(r'^(create|exclusive)', lambda s: 'is' + s.group(1).capitalize()
, | 951 return re.sub(r'^(create|exclusive)', lambda s: 'is' + s.group(1).capitalize()
, |
| 975 name) | 952 name) |
| OLD | NEW |