| 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 from generator import * | 11 from generator import * |
| 12 from systembase import * | 12 from systembase import * |
| 13 from systemhtml import DomToHtmlEvent, DomToHtmlEvents | 13 from systemhtml import DomToHtmlEvent, DomToHtmlEvents, HtmlSystemShared |
| 14 | 14 |
| 15 class NativeImplementationSystem(System): | 15 class NativeImplementationSystem(System): |
| 16 | 16 |
| 17 def __init__(self, templates, database, html_renames, emitters, auxiliary_dir, | 17 def __init__(self, templates, database, html_database, html_renames, |
| 18 output_dir): | 18 emitters, auxiliary_dir, output_dir): |
| 19 super(NativeImplementationSystem, self).__init__( | 19 super(NativeImplementationSystem, self).__init__( |
| 20 templates, database, emitters, output_dir) | 20 templates, database, emitters, output_dir) |
| 21 | 21 |
| 22 self._html_renames = html_renames | 22 self._html_renames = html_renames |
| 23 self._auxiliary_dir = auxiliary_dir | 23 self._auxiliary_dir = auxiliary_dir |
| 24 self._dom_public_files = [] | 24 self._dom_public_files = [] |
| 25 self._dom_impl_files = [] | 25 self._dom_impl_files = [] |
| 26 self._cpp_header_files = [] | 26 self._cpp_header_files = [] |
| 27 self._cpp_impl_files = [] | 27 self._cpp_impl_files = [] |
| 28 self._html_system = HtmlSystemShared(html_database) |
| 28 | 29 |
| 29 def InterfaceGenerator(self, | 30 def InterfaceGenerator(self, |
| 30 interface, | 31 interface, |
| 31 common_prefix, | 32 common_prefix, |
| 32 super_interface_name, | 33 super_interface_name, |
| 33 source_filter): | 34 source_filter): |
| 34 interface_name = interface.id | 35 interface_name = interface.id |
| 35 | 36 |
| 36 dart_interface_path = self._FilePathForDartInterface(interface_name) | 37 dart_interface_path = self._FilePathForDartInterface(interface_name) |
| 37 self._dom_public_files.append(dart_interface_path) | 38 self._dom_public_files.append(dart_interface_path) |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 233 used to avoid static member 'overriding' in the generated Dart code. | 234 used to avoid static member 'overriding' in the generated Dart code. |
| 234 """ | 235 """ |
| 235 self._system = system | 236 self._system = system |
| 236 self._interface = interface | 237 self._interface = interface |
| 237 self._dart_impl_emitter = dart_impl_emitter | 238 self._dart_impl_emitter = dart_impl_emitter |
| 238 self._cpp_header_emitter = cpp_header_emitter | 239 self._cpp_header_emitter = cpp_header_emitter |
| 239 self._cpp_impl_emitter = cpp_impl_emitter | 240 self._cpp_impl_emitter = cpp_impl_emitter |
| 240 self._base_members = base_members | 241 self._base_members = base_members |
| 241 self._templates = templates | 242 self._templates = templates |
| 242 self._current_secondary_parent = None | 243 self._current_secondary_parent = None |
| 244 self._html_system = self._system._html_system |
| 243 | 245 |
| 244 def StartInterface(self): | 246 def StartInterface(self): |
| 245 self._interface_type_info = GetIDLTypeInfo(self._interface.id) | 247 self._interface_type_info = GetIDLTypeInfo(self._interface.id) |
| 246 self._members_emitter = emitter.Emitter() | 248 self._members_emitter = emitter.Emitter() |
| 247 self._cpp_declarations_emitter = emitter.Emitter() | 249 self._cpp_declarations_emitter = emitter.Emitter() |
| 248 self._cpp_impl_includes = set() | 250 self._cpp_impl_includes = set() |
| 249 self._cpp_definitions_emitter = emitter.Emitter() | 251 self._cpp_definitions_emitter = emitter.Emitter() |
| 250 self._cpp_resolver_emitter = emitter.Emitter() | 252 self._cpp_resolver_emitter = emitter.Emitter() |
| 251 | 253 |
| 252 self._GenerateConstructors() | 254 self._GenerateConstructors() |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 347 events_class = '_%sEventsImpl' % self._interface.id | 349 events_class = '_%sEventsImpl' % self._interface.id |
| 348 self._EmitEventGetter(events_class) | 350 self._EmitEventGetter(events_class) |
| 349 | 351 |
| 350 def HasEventAttributes(interface): | 352 def HasEventAttributes(interface): |
| 351 return any([a.type.id == 'EventListener' for a in interface.attributes]) | 353 return any([a.type.id == 'EventListener' for a in interface.attributes]) |
| 352 parent = _FindParent(self._interface, self._system._database, HasEventAttrib
utes) | 354 parent = _FindParent(self._interface, self._system._database, HasEventAttrib
utes) |
| 353 if parent: | 355 if parent: |
| 354 parent_events_class = '_%sEventsImpl' % parent.id | 356 parent_events_class = '_%sEventsImpl' % parent.id |
| 355 else: | 357 else: |
| 356 parent_events_class = '_EventsImpl' | 358 parent_events_class = '_EventsImpl' |
| 357 html_inteface = self._system._html_renames.get(self._interface.id, self._int
erface.id) | 359 |
| 360 html_inteface = self._HTMLInterfaceName(self._interface.id) |
| 358 events_members = self._dart_impl_emitter.Emit( | 361 events_members = self._dart_impl_emitter.Emit( |
| 359 '\n' | 362 '\n' |
| 360 'class $EVENTS_CLASS extends $PARENT_EVENTS_CLASS implements $EVENTS_INT
ERFACE {\n' | 363 'class $EVENTS_CLASS extends $PARENT_EVENTS_CLASS implements $EVENTS_INT
ERFACE {\n' |
| 361 ' $EVENTS_CLASS(_ptr) : super(_ptr);\n' | 364 ' $EVENTS_CLASS(_ptr) : super(_ptr);\n' |
| 362 '$!MEMBERS\n' | 365 '$!MEMBERS\n' |
| 363 '}\n', | 366 '}\n', |
| 364 EVENTS_CLASS=events_class, | 367 EVENTS_CLASS=events_class, |
| 365 PARENT_EVENTS_CLASS=parent_events_class, | 368 PARENT_EVENTS_CLASS=parent_events_class, |
| 366 EVENTS_INTERFACE='%sEvents' % html_inteface) | 369 EVENTS_INTERFACE='%sEvents' % html_inteface) |
| 367 | 370 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 423 # again. If the operations are not specified, try to inherit from the | 426 # again. If the operations are not specified, try to inherit from the |
| 424 # EventTarget implementation. | 427 # EventTarget implementation. |
| 425 # | 428 # |
| 426 # Applies to MessagePort. | 429 # Applies to MessagePort. |
| 427 if not [op for op in self._interface.operations if op.id == 'addEventListe
ner']: | 430 if not [op for op in self._interface.operations if op.id == 'addEventListe
ner']: |
| 428 return self._ImplClassName(supertype) | 431 return self._ImplClassName(supertype) |
| 429 return '_DOMWrapperBase' | 432 return '_DOMWrapperBase' |
| 430 | 433 |
| 431 return self._ImplClassName(supertype) | 434 return self._ImplClassName(supertype) |
| 432 | 435 |
| 436 def _HTMLInterfaceName(self, interface_name): |
| 437 return self._system._html_renames.get(interface_name, interface_name) |
| 438 |
| 433 def _IsConstructable(self): | 439 def _IsConstructable(self): |
| 434 # FIXME: support ConstructorTemplate. | 440 # FIXME: support ConstructorTemplate. |
| 435 return set(['CustomConstructor', 'V8CustomConstructor', 'Constructor', 'Name
dConstructor']) & set(self._interface.ext_attrs) | 441 return set(['CustomConstructor', 'V8CustomConstructor', 'Constructor', 'Name
dConstructor']) & set(self._interface.ext_attrs) |
| 436 | 442 |
| 437 def _EmitFactoryProvider(self, interface_name, constructor_info): | 443 def _EmitFactoryProvider(self, interface_name, constructor_info): |
| 438 factory_provider = '_%sFactoryProvider' % interface_name | 444 factory_provider = '_%sFactoryProvider' % interface_name |
| 439 implementation_class = '_%sFactoryProviderImpl' % interface_name | 445 implementation_class = '_%sFactoryProviderImpl' % interface_name |
| 440 implementation_function = 'create' + interface_name | 446 implementation_function = 'create' + interface_name |
| 441 native_implementation_function = '%s_constructor_Callback' % interface_name | 447 native_implementation_function = '%s_constructor_Callback' % interface_name |
| 442 | 448 |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 576 | 582 |
| 577 def AddConstant(self, constant): | 583 def AddConstant(self, constant): |
| 578 # Constants are already defined on the interface. | 584 # Constants are already defined on the interface. |
| 579 pass | 585 pass |
| 580 | 586 |
| 581 def AddAttribute(self, getter, setter): | 587 def AddAttribute(self, getter, setter): |
| 582 if 'CheckSecurityForNode' in (getter or setter).ext_attrs: | 588 if 'CheckSecurityForNode' in (getter or setter).ext_attrs: |
| 583 # FIXME: exclude from interface as well. | 589 # FIXME: exclude from interface as well. |
| 584 return | 590 return |
| 585 | 591 |
| 586 if getter: | 592 html_interface_name = self._HTMLInterfaceName(self._interface.id) |
| 587 self._AddGetter(getter) | 593 dom_name = DartDomNameOfAttribute(getter or setter) |
| 588 if setter: | 594 html_getter_name = self._html_system.RenameInHtmlLibrary( |
| 589 self._AddSetter(setter) | 595 html_interface_name, dom_name, 'get:', implementation_class=True) |
| 596 html_setter_name = self._html_system.RenameInHtmlLibrary( |
| 597 html_interface_name, dom_name, 'set:', implementation_class=True) |
| 598 |
| 599 if getter and html_getter_name: |
| 600 self._AddGetter(getter, html_getter_name) |
| 601 if setter and html_setter_name: |
| 602 self._AddSetter(setter, html_setter_name) |
| 590 | 603 |
| 591 def AddSecondaryAttribute(self, interface, getter, setter): | 604 def AddSecondaryAttribute(self, interface, getter, setter): |
| 592 self.AddAttribute(getter, setter) | 605 self.AddAttribute(getter, setter) |
| 593 | 606 |
| 594 def _AddGetter(self, attr): | 607 def _AddGetter(self, attr, html_name): |
| 595 type_info = GetIDLTypeInfo(attr.type.id) | 608 type_info = GetIDLTypeInfo(attr.type.id) |
| 596 dart_declaration = '%s get %s()' % ( | 609 dart_declaration = '%s get %s()' % (self._DartType(attr.type.id), html_name) |
| 597 self._DartType(attr.type.id), DartDomNameOfAttribute(attr)) | |
| 598 is_custom = 'Custom' in attr.ext_attrs or 'CustomGetter' in attr.ext_attrs | 610 is_custom = 'Custom' in attr.ext_attrs or 'CustomGetter' in attr.ext_attrs |
| 599 cpp_callback_name = self._GenerateNativeBinding(attr.id, 1, | 611 cpp_callback_name = self._GenerateNativeBinding(attr.id, 1, |
| 600 dart_declaration, 'Getter', is_custom) | 612 dart_declaration, 'Getter', is_custom) |
| 601 if is_custom: | 613 if is_custom: |
| 602 return | 614 return |
| 603 | 615 |
| 604 arguments = [] | 616 arguments = [] |
| 605 parameter_definitions_emitter = emitter.Emitter() | 617 parameter_definitions_emitter = emitter.Emitter() |
| 606 raises_exceptions = self._GenerateCallWithHandling(attr, parameter_definitio
ns_emitter, arguments) | 618 raises_exceptions = self._GenerateCallWithHandling(attr, parameter_definitio
ns_emitter, arguments) |
| 607 raises_exceptions = raises_exceptions or attr.get_raises | 619 raises_exceptions = raises_exceptions or attr.get_raises |
| (...skipping 20 matching lines...) Expand all Loading... |
| 628 webcore_function_name) | 640 webcore_function_name) |
| 629 if attr.type.id.startswith('SVGAnimated'): | 641 if attr.type.id.startswith('SVGAnimated'): |
| 630 webcore_function_name += 'Animated' | 642 webcore_function_name += 'Animated' |
| 631 | 643 |
| 632 function_expression = self._GenerateWebCoreFunctionExpression(webcore_functi
on_name, attr) | 644 function_expression = self._GenerateWebCoreFunctionExpression(webcore_functi
on_name, attr) |
| 633 invocation = self._GenerateWebCoreInvocation(function_expression, | 645 invocation = self._GenerateWebCoreInvocation(function_expression, |
| 634 arguments, attr.type.id, attr.ext_attrs, attr.get_raises) | 646 arguments, attr.type.id, attr.ext_attrs, attr.get_raises) |
| 635 self._GenerateNativeCallback(cpp_callback_name, parameter_definitions_emitte
r.Fragments(), | 647 self._GenerateNativeCallback(cpp_callback_name, parameter_definitions_emitte
r.Fragments(), |
| 636 True, invocation, raises_exceptions=raises_exceptions) | 648 True, invocation, raises_exceptions=raises_exceptions) |
| 637 | 649 |
| 638 def _AddSetter(self, attr): | 650 def _AddSetter(self, attr, html_name): |
| 639 type_info = GetIDLTypeInfo(attr.type.id) | 651 type_info = GetIDLTypeInfo(attr.type.id) |
| 640 dart_declaration = 'void set %s(%s)' % ( | 652 dart_declaration = 'void set %s(%s)' % (html_name, self._DartType(attr.type.
id)) |
| 641 DartDomNameOfAttribute(attr), self._DartType(attr.type.id)) | |
| 642 is_custom = set(['Custom', 'CustomSetter', 'V8CustomSetter']) & set(attr.ext
_attrs) | 653 is_custom = set(['Custom', 'CustomSetter', 'V8CustomSetter']) & set(attr.ext
_attrs) |
| 643 cpp_callback_name = self._GenerateNativeBinding(attr.id, 2, | 654 cpp_callback_name = self._GenerateNativeBinding(attr.id, 2, |
| 644 dart_declaration, 'Setter', is_custom) | 655 dart_declaration, 'Setter', is_custom) |
| 645 if is_custom: | 656 if is_custom: |
| 646 return | 657 return |
| 647 | 658 |
| 648 arguments = [] | 659 arguments = [] |
| 649 parameter_definitions_emitter = emitter.Emitter() | 660 parameter_definitions_emitter = emitter.Emitter() |
| 650 self._GenerateCallWithHandling(attr, parameter_definitions_emitter, argument
s) | 661 self._GenerateCallWithHandling(attr, parameter_definitions_emitter, argument
s) |
| 651 | 662 |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 837 def _AddOperation(self, info): | 848 def _AddOperation(self, info): |
| 838 """ | 849 """ |
| 839 Arguments: | 850 Arguments: |
| 840 info: An OperationInfo object. | 851 info: An OperationInfo object. |
| 841 """ | 852 """ |
| 842 | 853 |
| 843 if 'CheckSecurityForNode' in info.overloads[0].ext_attrs: | 854 if 'CheckSecurityForNode' in info.overloads[0].ext_attrs: |
| 844 # FIXME: exclude from interface as well. | 855 # FIXME: exclude from interface as well. |
| 845 return | 856 return |
| 846 | 857 |
| 847 parameters = info.ParametersImplementationDeclaration(self._DartType) | 858 html_interface_name = self._HTMLInterfaceName(self._interface.id) |
| 848 if 'Custom' in info.overloads[0].ext_attrs: | 859 html_name = self._html_system.RenameInHtmlLibrary( |
| 849 dart_declaration = '%s %s(%s)' % (self._DartType(info.type_name), info.nam
e, parameters) | 860 html_interface_name, info.name, implementation_class=True) |
| 850 argument_count = (0 if info.IsStatic() else 1) + len(info.param_infos) | 861 |
| 851 self._GenerateNativeBinding(info.name, argument_count, dart_declaration, | 862 if not html_name and info.name == 'item': |
| 852 'Callback', True) | 863 # FIXME: item should be renamed to operator[], not removed. |
| 864 html_name = 'item' |
| 865 |
| 866 if not html_name: |
| 853 return | 867 return |
| 854 | 868 |
| 855 modifier = '' | 869 dart_declaration = '%s%s %s(%s)' % ( |
| 856 if info.IsStatic(): | 870 'static ' if info.IsStatic() else '', |
| 857 modifier = 'static ' | 871 self._DartType(info.type_name), |
| 872 html_name or info.name, |
| 873 info.ParametersImplementationDeclaration(self._DartType)) |
| 874 |
| 875 if 'Custom' in info.overloads[0].ext_attrs: |
| 876 argument_count = (0 if info.IsStatic() else 1) + len(info.param_infos) |
| 877 self._GenerateNativeBinding(info.name , argument_count, |
| 878 dart_declaration, 'Callback', True) |
| 879 return |
| 880 |
| 858 body = self._members_emitter.Emit( | 881 body = self._members_emitter.Emit( |
| 859 '\n' | 882 '\n' |
| 860 ' $MODIFIER$TYPE $NAME($PARAMETERS) {\n' | 883 ' $DECLARATION {\n' |
| 861 '$!BODY' | 884 '$!BODY' |
| 862 ' }\n', | 885 ' }\n', |
| 863 MODIFIER=modifier, | 886 DECLARATION=dart_declaration) |
| 864 TYPE=self._DartType(info.type_name), | |
| 865 NAME=info.name, | |
| 866 PARAMETERS=parameters) | |
| 867 | 887 |
| 868 # Process in order of ascending number of arguments to ensure missing | 888 # Process in order of ascending number of arguments to ensure missing |
| 869 # optional arguments are processed early. | 889 # optional arguments are processed early. |
| 870 overloads = sorted(info.overloads, | 890 overloads = sorted(info.overloads, |
| 871 key=lambda overload: len(overload.arguments)) | 891 key=lambda overload: len(overload.arguments)) |
| 872 self._native_version = 0 | 892 self._native_version = 0 |
| 873 fallthrough = self.GenerateDispatch(body, info, ' ', 0, overloads) | 893 fallthrough = self.GenerateDispatch(body, info, ' ', 0, overloads) |
| 874 if fallthrough: | 894 if fallthrough: |
| 875 body.Emit(' throw "Incorrect number or type of arguments";\n'); | 895 body.Emit(' throw "Incorrect number or type of arguments";\n'); |
| 876 | 896 |
| (...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1237 for parent in interface.parents: | 1257 for parent in interface.parents: |
| 1238 parent_name = parent.type.id | 1258 parent_name = parent.type.id |
| 1239 if not database.HasInterface(parent.type.id): | 1259 if not database.HasInterface(parent.type.id): |
| 1240 continue | 1260 continue |
| 1241 parent_interface = database.GetInterface(parent.type.id) | 1261 parent_interface = database.GetInterface(parent.type.id) |
| 1242 if callback(parent_interface): | 1262 if callback(parent_interface): |
| 1243 return parent_interface | 1263 return parent_interface |
| 1244 parent_interface = _FindParent(parent_interface, database, callback) | 1264 parent_interface = _FindParent(parent_interface, database, callback) |
| 1245 if parent_interface: | 1265 if parent_interface: |
| 1246 return parent_interface | 1266 return parent_interface |
| OLD | NEW |