| 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 logging | 10 import logging |
| 11 import os | 11 import os |
| 12 from generator import * | 12 from generator import * |
| 13 from htmldartgenerator import * | 13 from htmldartgenerator import * |
| 14 from idlnode import IDLArgument, IDLAttribute, IDLEnum, IDLMember | 14 from idlnode import IDLArgument, IDLAttribute, IDLEnum, IDLMember |
| 15 from systemhtml import js_support_checks, GetCallbackInfo, HTML_LIBRARY_NAMES | 15 from systemhtml import js_support_checks, GetCallbackInfo, HTML_LIBRARY_NAMES |
| 16 | 16 |
| 17 _logger = logging.getLogger('systemnative') | 17 _logger = logging.getLogger('systemnative') |
| 18 | 18 |
| 19 # TODO(vsm): This should be recoverable from IDL, but we appear to not | 19 # TODO(vsm): This should be recoverable from IDL, but we appear to not |
| 20 # track the necessary info. | 20 # track the necessary info. |
| 21 _url_utils = ['hash', 'host', 'hostname', 'origin', | 21 _url_utils = ['hash', 'host', 'hostname', 'origin', |
| 22 'password', 'pathname', 'port', 'protocol', | 22 'password', 'pathname', 'port', 'protocol', |
| 23 'search', 'username'] | 23 'search', 'username'] |
| 24 | 24 |
| 25 _promise_to_future = Conversion('convertNativePromiseToDartFuture', 'dynamic', '
Future') |
| 26 |
| 25 def array_type(data_type): | 27 def array_type(data_type): |
| 26 matched = re.match(r'([\w\d_\s]+)\[\]', data_type) | 28 matched = re.match(r'([\w\d_\s]+)\[\]', data_type) |
| 27 if not matched: | 29 if not matched: |
| 28 return None | 30 return None |
| 29 return matched.group(1) | 31 return matched.group(1) |
| 30 | 32 |
| 31 _sequence_matcher = re.compile('sequence\<(.+)\>') | 33 _sequence_matcher = re.compile('sequence\<(.+)\>') |
| 32 | 34 |
| 33 def TypeIdToBlinkName(interface_id, database): | 35 def TypeIdToBlinkName(interface_id, database): |
| 34 # Maybe should use the type_registry here? | 36 # Maybe should use the type_registry here? |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 101 | 103 |
| 102 def ImplementsMergedMembers(self): | 104 def ImplementsMergedMembers(self): |
| 103 # We could not add merged functions to implementation class because | 105 # We could not add merged functions to implementation class because |
| 104 # underlying c++ object doesn't implement them. Merged functions are | 106 # underlying c++ object doesn't implement them. Merged functions are |
| 105 # generated on merged interface implementation instead. | 107 # generated on merged interface implementation instead. |
| 106 return False | 108 return False |
| 107 | 109 |
| 108 def CustomJSMembers(self): | 110 def CustomJSMembers(self): |
| 109 return {} | 111 return {} |
| 110 | 112 |
| 113 def _OutputConversion(self, idl_type, member): |
| 114 conversion = FindConversion(idl_type, 'get', self._interface.id, member) |
| 115 # TODO(jacobr) handle promise consistently in dart2js and dartium. |
| 116 if idl_type == 'Promise': |
| 117 return _promise_to_future |
| 118 if conversion: |
| 119 if conversion.function_name in ('_convertNativeToDart_Window', '_convertNa
tiveToDart_EventTarget', 'convertNativeToDart_DateTime', 'convertNativeToDart_Im
ageData'): |
| 120 return None |
| 121 return conversion |
| 122 |
| 111 def _InputConversion(self, idl_type, member): | 123 def _InputConversion(self, idl_type, member): |
| 112 return FindConversion(idl_type, 'set', self._interface.id, member) | 124 return FindConversion(idl_type, 'set', self._interface.id, member) |
| 113 | 125 |
| 114 def GenerateCallback(self, info): | 126 def GenerateCallback(self, info): |
| 115 return None | 127 return None |
| 116 | 128 |
| 117 def ImplementationTemplate(self): | 129 def ImplementationTemplate(self): |
| 118 template = None | 130 template = None |
| 119 interface_name = self._interface.doc_js_name | 131 interface_name = self._interface.doc_js_name |
| 120 if interface_name == self._interface.id or not self._database.HasInterface(i
nterface_name): | 132 if interface_name == self._interface.id or not self._database.HasInterface(i
nterface_name): |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 243 | 255 |
| 244 # Then we emit the impedance matching wrapper to call out to the | 256 # Then we emit the impedance matching wrapper to call out to the |
| 245 # toplevel wrapper | 257 # toplevel wrapper |
| 246 if not emit_to_native: | 258 if not emit_to_native: |
| 247 toplevel_name = \ | 259 toplevel_name = \ |
| 248 self.DeriveQualifiedBlinkName(self._interface.id, | 260 self.DeriveQualifiedBlinkName(self._interface.id, |
| 249 dart_native_name) | 261 dart_native_name) |
| 250 self._members_emitter.Emit( | 262 self._members_emitter.Emit( |
| 251 '\n @DocsEditable()\n' | 263 '\n @DocsEditable()\n' |
| 252 ' static $INTERFACE_NAME $FACTORY_METHOD_NAME($PARAMETERS) => ' | 264 ' static $INTERFACE_NAME $FACTORY_METHOD_NAME($PARAMETERS) => ' |
| 253 'wrap_jso($TOPLEVEL_NAME($OUTPARAMETERS));\n', | 265 '$TOPLEVEL_NAME($OUTPARAMETERS);\n', |
| 254 INTERFACE_NAME=self._interface_type_info.interface_name(), | 266 INTERFACE_NAME=self._interface_type_info.interface_name(), |
| 255 FACTORY_METHOD_NAME=factory_method_name, | 267 FACTORY_METHOD_NAME=factory_method_name, |
| 256 PARAMETERS=typed_formals, | 268 PARAMETERS=typed_formals, |
| 257 TOPLEVEL_NAME=toplevel_name, | 269 TOPLEVEL_NAME=toplevel_name, |
| 258 OUTPARAMETERS=parameters) | 270 OUTPARAMETERS=parameters) |
| 259 | 271 |
| 260 self._cpp_resolver_emitter.Emit( | 272 self._cpp_resolver_emitter.Emit( |
| 261 ' if (name == "$ID")\n' | 273 ' if (name == "$ID")\n' |
| 262 ' return Dart$(WEBKIT_INTERFACE_NAME)Internal::$CPP_CALLBACK;\n', | 274 ' return Dart$(WEBKIT_INTERFACE_NAME)Internal::$CPP_CALLBACK;\n', |
| 263 ID=constructor_callback_id, | 275 ID=constructor_callback_id, |
| 264 WEBKIT_INTERFACE_NAME=self._interface.id, | 276 WEBKIT_INTERFACE_NAME=self._interface.id, |
| 265 CPP_CALLBACK=constructor_callback_cpp_name) | 277 CPP_CALLBACK=constructor_callback_cpp_name) |
| 266 | 278 |
| 267 def GenerateCustomFactory(self, constructor_info): | 279 def GenerateCustomFactory(self, constructor_info): |
| 268 if 'CustomConstructor' not in self._interface.ext_attrs: | 280 if 'CustomConstructor' not in self._interface.ext_attrs: |
| 269 return False | 281 return False |
| 270 | 282 |
| 271 annotations = self._metadata.GetFormattedMetadata(self._library_name, | 283 annotations = self._metadata.GetFormattedMetadata(self._library_name, |
| 272 self._interface, self._interface.id, ' ') | 284 self._interface, self._interface.id, ' ') |
| 273 | 285 |
| 274 self._members_emitter.Emit( | 286 self._members_emitter.Emit( |
| 275 '\n $(ANNOTATIONS)factory $CTOR($PARAMS) => wrap_jso(_create($FACTORY_P
ARAMS));\n', | 287 '\n $(ANNOTATIONS)factory $CTOR($PARAMS) => _create($FACTORY_PARAMS);\n
', |
| 276 ANNOTATIONS=annotations, | 288 ANNOTATIONS=annotations, |
| 277 CTOR=constructor_info._ConstructorFullName(self._DartType), | 289 CTOR=constructor_info._ConstructorFullName(self._DartType), |
| 278 PARAMS=constructor_info.ParametersAsDeclaration(self._DartType), | 290 PARAMS=constructor_info.ParametersAsDeclaration(self._DartType), |
| 279 FACTORY_PARAMS= \ | 291 FACTORY_PARAMS= \ |
| 280 constructor_info.ParametersAsArgumentList()) | 292 constructor_info.ParametersAsArgumentList()) |
| 281 | 293 |
| 282 # MutationObserver has custom _create. TODO(terry): Consider table but this
is only one. | 294 # MutationObserver has custom _create. TODO(terry): Consider table but this
is only one. |
| 283 if self._interface.id != 'MutationObserver': | 295 if self._interface.id != 'MutationObserver': |
| 284 constructor_callback_cpp_name = 'constructorCallback' | 296 constructor_callback_cpp_name = 'constructorCallback' |
| 285 self._EmitConstructorInfrastructure( | 297 self._EmitConstructorInfrastructure( |
| (...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 529 # Unwrap the type to get the JsObject if Type is: | 541 # Unwrap the type to get the JsObject if Type is: |
| 530 # | 542 # |
| 531 # - known IDL type | 543 # - known IDL type |
| 532 # - type_id is None then it's probably a union type or overloaded | 544 # - type_id is None then it's probably a union type or overloaded |
| 533 # it's a dynamic/any type | 545 # it's a dynamic/any type |
| 534 # - type is Object | 546 # - type is Object |
| 535 # | 547 # |
| 536 # JsObject maybe stored in the Dart class. | 548 # JsObject maybe stored in the Dart class. |
| 537 return_wrap_jso = wrap_return_type_blink(return_type, attr.type.id, self
._type_registry) | 549 return_wrap_jso = wrap_return_type_blink(return_type, attr.type.id, self
._type_registry) |
| 538 wrap_unwrap_list.append(return_wrap_jso) # wrap_jso the returned objec
t | 550 wrap_unwrap_list.append(return_wrap_jso) # wrap_jso the returned objec
t |
| 539 wrap_unwrap_list.append(self._dart_use_blink) # this must be unwrap_jso | 551 wrap_unwrap_list.append(self._dart_use_blink) |
| 540 | 552 |
| 541 # This seems to have been replaced with Custom=Getter (see above), but | 553 # This seems to have been replaced with Custom=Getter (see above), but |
| 542 # check to be sure we don't see the old syntax | 554 # check to be sure we don't see the old syntax |
| 543 assert(not ('CustomGetter' in attr.ext_attrs)) | 555 assert(not ('CustomGetter' in attr.ext_attrs)) |
| 544 native_suffix = 'Getter' | 556 native_suffix = 'Getter' |
| 545 auto_scope_setup = self._GenerateAutoSetupScope(attr.id, native_suffix) | 557 auto_scope_setup = self._GenerateAutoSetupScope(attr.id, native_suffix) |
| 546 native_entry = \ | 558 native_entry = \ |
| 547 self.DeriveNativeEntry(attr.id, 'Getter', None) | 559 self.DeriveNativeEntry(attr.id, 'Getter', None) |
| 560 output_conversion = self._OutputConversion(attr.type.id, attr.id) |
| 561 |
| 548 cpp_callback_name = self._GenerateNativeBinding(attr.id, 1, | 562 cpp_callback_name = self._GenerateNativeBinding(attr.id, 1, |
| 549 dart_declaration, attr.is_static, return_type, parameters, | 563 dart_declaration, attr.is_static, return_type, parameters, |
| 550 native_suffix, is_custom, auto_scope_setup, native_entry=native_entry, | 564 native_suffix, is_custom, auto_scope_setup, native_entry=native_entry, |
| 551 wrap_unwrap_list=wrap_unwrap_list, dictionary_return=dictionary_returned
) | 565 wrap_unwrap_list=wrap_unwrap_list, dictionary_return=dictionary_returned
, |
| 566 output_conversion=output_conversion) |
| 552 if is_custom: | 567 if is_custom: |
| 553 return | 568 return |
| 554 | 569 |
| 555 if 'Reflect' in attr.ext_attrs: | 570 if 'Reflect' in attr.ext_attrs: |
| 556 webcore_function_name = self._TypeInfo(attr.type.id).webcore_getter_name() | 571 webcore_function_name = self._TypeInfo(attr.type.id).webcore_getter_name() |
| 557 if 'URL' in attr.ext_attrs: | 572 if 'URL' in attr.ext_attrs: |
| 558 if 'NonEmpty' in attr.ext_attrs: | 573 if 'NonEmpty' in attr.ext_attrs: |
| 559 webcore_function_name = 'getNonEmptyURLAttribute' | 574 webcore_function_name = 'getNonEmptyURLAttribute' |
| 560 else: | 575 else: |
| 561 webcore_function_name = 'getURLAttribute' | 576 webcore_function_name = 'getURLAttribute' |
| (...skipping 14 matching lines...) Expand all Loading... |
| 576 attr.ext_attrs['RaisesException'] != 'Setter') | 591 attr.ext_attrs['RaisesException'] != 'Setter') |
| 577 | 592 |
| 578 def _AddSetter(self, attr, html_name): | 593 def _AddSetter(self, attr, html_name): |
| 579 return_type = 'void' | 594 return_type = 'void' |
| 580 ptype = self._DartType(attr.type.id) | 595 ptype = self._DartType(attr.type.id) |
| 581 | 596 |
| 582 type_info = self._TypeInfo(attr.type.id) | 597 type_info = self._TypeInfo(attr.type.id) |
| 583 | 598 |
| 584 # Is the setter value a DartClass (that has a JsObject) or the type is | 599 # Is the setter value a DartClass (that has a JsObject) or the type is |
| 585 # None (it's a dynamic/any type) then unwrap_jso before passing to blink. | 600 # None (it's a dynamic/any type) then unwrap_jso before passing to blink. |
| 586 parameters = ['unwrap_jso(value)' if (isinstance(type_info, InterfaceIDLType
Info) or | 601 parameters = ['value'] |
| 587 not(attr.type.id) or ptype == 'Object'
) | |
| 588 else 'value'] | |
| 589 | 602 |
| 590 dart_declaration = 'set %s(%s value)' % (html_name, ptype) | 603 dart_declaration = 'set %s(%s value)' % (html_name, ptype) |
| 591 is_custom = _IsCustom(attr) and (_IsCustomValue(attr, None) or | 604 is_custom = _IsCustom(attr) and (_IsCustomValue(attr, None) or |
| 592 _IsCustomValue(attr, 'Setter')) | 605 _IsCustomValue(attr, 'Setter')) |
| 593 # This seems to have been replaced with Custom=Setter (see above), but | 606 # This seems to have been replaced with Custom=Setter (see above), but |
| 594 # check to be sure we don't see the old syntax | 607 # check to be sure we don't see the old syntax |
| 595 assert(not ('CustomSetter' in attr.ext_attrs)) | 608 assert(not ('CustomSetter' in attr.ext_attrs)) |
| 596 assert(not ('V8CustomSetter' in attr.ext_attrs)) | 609 assert(not ('V8CustomSetter' in attr.ext_attrs)) |
| 597 native_suffix = 'Setter' | 610 native_suffix = 'Setter' |
| 598 auto_scope_setup = self._GenerateAutoSetupScope(attr.id, native_suffix) | 611 auto_scope_setup = self._GenerateAutoSetupScope(attr.id, native_suffix) |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 644 # | 657 # |
| 645 # class YImpl extends ListBase<T> { copies of transitive XImpl methods; } | 658 # class YImpl extends ListBase<T> { copies of transitive XImpl methods; } |
| 646 # | 659 # |
| 647 dart_element_type = self._DartType(element_type) | 660 dart_element_type = self._DartType(element_type) |
| 648 if self._HasNativeIndexGetter(): | 661 if self._HasNativeIndexGetter(): |
| 649 self._EmitNativeIndexGetter(dart_element_type) | 662 self._EmitNativeIndexGetter(dart_element_type) |
| 650 elif self._HasExplicitIndexedGetter(): | 663 elif self._HasExplicitIndexedGetter(): |
| 651 self._EmitExplicitIndexedGetter(dart_element_type) | 664 self._EmitExplicitIndexedGetter(dart_element_type) |
| 652 else: | 665 else: |
| 653 is_custom = any((op.id == 'item' and _IsCustom(op)) for op in self._interf
ace.operations) | 666 is_custom = any((op.id == 'item' and _IsCustom(op)) for op in self._interf
ace.operations) |
| 667 |
| 668 output_conversion = self._OutputConversion(element_type, 'item') |
| 669 conversion_name = '' |
| 670 if output_conversion: |
| 671 conversion_name = output_conversion.function_name |
| 672 |
| 654 # First emit a toplevel function to do the native call | 673 # First emit a toplevel function to do the native call |
| 655 # Calls to this are emitted elsewhere, | 674 # Calls to this are emitted elsewhere, |
| 656 dart_native_name, resolver_string = \ | 675 dart_native_name, resolver_string = \ |
| 657 self.DeriveNativeEntry("item", 'Method', 1) | 676 self.DeriveNativeEntry("item", 'Method', 1) |
| 658 | 677 |
| 659 # Emit the method which calls the toplevel function, along with | 678 # Emit the method which calls the toplevel function, along with |
| 660 # the [] operator. | 679 # the [] operator. |
| 661 dart_qualified_name = \ | 680 dart_qualified_name = \ |
| 662 self.DeriveQualifiedBlinkName(self._interface.id, | 681 self.DeriveQualifiedBlinkName(self._interface.id, |
| 663 dart_native_name) | 682 dart_native_name) |
| 664 | 683 |
| 665 type_info = self._TypeInfo(element_type) | 684 type_info = self._TypeInfo(element_type) |
| 666 # Does nativeIndexGetter return a DartClass (JsObject) if so wrap_jso. | |
| 667 wrap_jso_start = '' | |
| 668 wrap_jso_end = '' | |
| 669 if (isinstance(type_info, InterfaceIDLTypeInfo) or | |
| 670 wrap_type_blink(type_info.narrow_dart_type(), self._type_registry)): | |
| 671 wrap_jso_start = 'wrap_jso(' | |
| 672 wrap_jso_end = ')' | |
| 673 blinkNativeIndexed = """ | 685 blinkNativeIndexed = """ |
| 674 $TYPE operator[](int index) { | 686 $TYPE operator[](int index) { |
| 675 if (index < 0 || index >= length) | 687 if (index < 0 || index >= length) |
| 676 throw new RangeError.index(index, this); | 688 throw new RangeError.index(index, this); |
| 677 return %s$(DART_NATIVE_NAME)(unwrap_jso(this), index)%s; | 689 return _nativeIndexedGetter(index); |
| 678 } | 690 } |
| 679 | 691 |
| 680 $TYPE _nativeIndexedGetter(int index) => %s$(DART_NATIVE_NAME)(unwrap_jso(this
), index)%s; | 692 $TYPE _nativeIndexedGetter(int index) => $(CONVERSION_NAME)($(DART_NATIVE_NAME
)(this, index)); |
| 681 """ % (wrap_jso_start, wrap_jso_end, wrap_jso_start, wrap_jso_end) | 693 """ |
| 682 # Wrap the type to store the JsObject if Type is: | 694 blinkNativeIndexedGetter = \ |
| 683 # | 695 ' $(DART_NATIVE_NAME)(this, index);\n' |
| 684 # - known IDL type | |
| 685 # - type_id is None then it's probably a union type or overloaded | |
| 686 # it's a dynamic/any type | |
| 687 # - type is Object | |
| 688 # | |
| 689 # JsObject maybe stored in the Dart class. | |
| 690 if isinstance(type_info, InterfaceIDLTypeInfo) or not(type_info) or dart_e
lement_type == 'Object': | |
| 691 blinkNativeIndexedGetter = \ | |
| 692 ' {0}$(DART_NATIVE_NAME)(unwrap_jso(this), index){1};\n'.format('w
rap_jso(', ')') | |
| 693 else: | |
| 694 blinkNativeIndexedGetter = \ | |
| 695 ' $(DART_NATIVE_NAME)(unwrap_jso(this), index);\n' | |
| 696 self._members_emitter.Emit(blinkNativeIndexed, | 696 self._members_emitter.Emit(blinkNativeIndexed, |
| 697 DART_NATIVE_NAME=dart_qualified_name, | 697 DART_NATIVE_NAME=dart_qualified_name, |
| 698 TYPE=self.SecureOutputType(element_type), | 698 TYPE=self.SecureOutputType(element_type), |
| 699 INTERFACE=self._interface.id) | 699 INTERFACE=self._interface.id, |
| 700 CONVERSION_NAME=conversion_name) |
| 700 | 701 |
| 701 if self._HasNativeIndexSetter(): | 702 if self._HasNativeIndexSetter(): |
| 702 self._EmitNativeIndexSetter(dart_element_type) | 703 self._EmitNativeIndexSetter(dart_element_type) |
| 703 else: | 704 else: |
| 704 self._members_emitter.Emit( | 705 self._members_emitter.Emit( |
| 705 '\n' | 706 '\n' |
| 706 ' void operator[]=(int index, $TYPE value) {\n' | 707 ' void operator[]=(int index, $TYPE value) {\n' |
| 707 ' throw new UnsupportedError("Cannot assign element of immutable Li
st.");\n' | 708 ' throw new UnsupportedError("Cannot assign element of immutable Li
st.");\n' |
| 708 ' }\n', | 709 ' }\n', |
| 709 TYPE=dart_element_type) | 710 TYPE=dart_element_type) |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 791 | 792 |
| 792 formals = info.ParametersAsDeclaration(self._DartType) | 793 formals = info.ParametersAsDeclaration(self._DartType) |
| 793 | 794 |
| 794 parameters = info.ParametersAsListOfVariables(None, | 795 parameters = info.ParametersAsListOfVariables(None, |
| 795 self._type_registry if self._d
art_use_blink else None, | 796 self._type_registry if self._d
art_use_blink else None, |
| 796 dart_js_interop, | 797 dart_js_interop, |
| 797 self) | 798 self) |
| 798 | 799 |
| 799 operation = info.operations[0] | 800 operation = info.operations[0] |
| 800 | 801 |
| 802 output_conversion = self._OutputConversion(operation.type.id, operation.id) |
| 803 |
| 801 dictionary_returned = False | 804 dictionary_returned = False |
| 802 # Return type for dictionary is any (untyped). | 805 # Return type for dictionary is any (untyped). |
| 803 if operation.type.id == 'Dictionary': | 806 if operation.type.id == 'Dictionary': |
| 804 return_type = ''; | 807 return_type = ''; |
| 805 dictionary_returned = True; | 808 dictionary_returned = True; |
| 806 | 809 |
| 807 dart_declaration = '%s%s %s(%s)' % ( | 810 dart_declaration = '%s%s %s(%s)' % ( |
| 808 'static ' if info.IsStatic() else '', | 811 'static ' if info.IsStatic() else '', |
| 809 return_type, | 812 return_type, |
| 810 html_name, | 813 html_name, |
| 811 formals) | 814 formals) |
| 812 | 815 |
| 813 is_custom = _IsCustom(operation) | 816 is_custom = _IsCustom(operation) |
| 814 has_optional_arguments = any(IsOptional(argument) for argument in operation.
arguments) | 817 has_optional_arguments = any(IsOptional(argument) for argument in operation.
arguments) |
| 815 needs_dispatcher = not is_custom and (len(info.operations) > 1 or has_option
al_arguments) | 818 needs_dispatcher = not is_custom and (len(info.operations) > 1 or has_option
al_arguments) |
| 816 | 819 |
| 817 # Operation uses blink? | 820 # Operation uses blink? |
| 818 wrap_unwrap_list = []; | 821 wrap_unwrap_list = []; |
| 819 return_wrap_jso = False | 822 return_wrap_jso = False |
| 820 # return type wrapped? | 823 # return type wrapped? |
| 821 if self._dart_use_blink: | 824 if self._dart_use_blink: |
| 822 # Wrap the type to store the JsObject if Type is: | 825 # Wrap the type to store the JsObject if Type is: |
| 823 # | 826 # |
| 824 # - known IDL type | |
| 825 # - type_id is None then it's probably a union type or overloaded | |
| 826 # it's a dynamic/any type | 827 # it's a dynamic/any type |
| 827 # - type is Object | 828 # - type is Object |
| 828 # | 829 # |
| 829 # JsObject maybe stored in the Dart class. | 830 # JsObject maybe stored in the Dart class. |
| 830 return_wrap_jso = wrap_return_type_blink(return_type, info.type_name, se
lf._type_registry) | 831 return_wrap_jso = wrap_return_type_blink(return_type, info.type_name, se
lf._type_registry) |
| 831 return_type_info = self._type_registry.TypeInfo(info.type_name) | 832 return_type_info = self._type_registry.TypeInfo(info.type_name) |
| 832 if (isinstance(return_type_info, SequenceIDLTypeInfo) and | |
| 833 not isinstance(return_type_info._item_info, PrimitiveIDLTypeInfo)): | |
| 834 return_wrap_jso = True | |
| 835 # wrap_jso the returned object | 833 # wrap_jso the returned object |
| 836 wrap_unwrap_list.append(return_wrap_jso) | 834 wrap_unwrap_list.append(return_wrap_jso) |
| 837 # The 'this' parameter must be unwrap_jso | |
| 838 wrap_unwrap_list.append(self._dart_use_blink) | 835 wrap_unwrap_list.append(self._dart_use_blink) |
| 839 | 836 |
| 840 if info.callback_args: | 837 if info.callback_args: |
| 841 self._AddFutureifiedOperation(info, html_name) | 838 self._AddFutureifiedOperation(info, html_name) |
| 842 elif not needs_dispatcher: | 839 elif not needs_dispatcher: |
| 843 # Bind directly to native implementation | 840 # Bind directly to native implementation |
| 844 argument_count = (0 if info.IsStatic() else 1) + len(info.param_infos) | 841 argument_count = (0 if info.IsStatic() else 1) + len(info.param_infos) |
| 845 native_suffix = 'Callback' | 842 native_suffix = 'Callback' |
| 846 auto_scope_setup = self._GenerateAutoSetupScope(info.name, native_suffix) | 843 auto_scope_setup = self._GenerateAutoSetupScope(info.name, native_suffix) |
| 847 native_entry = \ | 844 native_entry = \ |
| 848 self.DeriveNativeEntry(operation.id, 'Method', len(info.param_infos)) | 845 self.DeriveNativeEntry(operation.id, 'Method', len(info.param_infos)) |
| 849 cpp_callback_name = self._GenerateNativeBinding( | 846 cpp_callback_name = self._GenerateNativeBinding( |
| 850 info.name, argument_count, dart_declaration, | 847 info.name, argument_count, dart_declaration, |
| 851 info.IsStatic(), return_type, parameters, | 848 info.IsStatic(), return_type, parameters, |
| 852 native_suffix, is_custom, auto_scope_setup, | 849 native_suffix, is_custom, auto_scope_setup, |
| 853 native_entry=native_entry, | 850 native_entry=native_entry, |
| 854 wrap_unwrap_list=wrap_unwrap_list, | 851 wrap_unwrap_list=wrap_unwrap_list, |
| 855 dictionary_return=dictionary_returned) | 852 dictionary_return=dictionary_returned, |
| 853 output_conversion=output_conversion) |
| 856 if not is_custom: | 854 if not is_custom: |
| 857 self._GenerateOperationNativeCallback(operation, operation.arguments, cp
p_callback_name, auto_scope_setup) | 855 self._GenerateOperationNativeCallback(operation, operation.arguments, cp
p_callback_name, auto_scope_setup) |
| 858 else: | 856 else: |
| 859 self._GenerateDispatcher(info, info.operations, dart_declaration, html_nam
e) | 857 self._GenerateDispatcher(info, info.operations, dart_declaration, html_nam
e) |
| 860 | 858 |
| 861 def _GenerateDispatcher(self, info, operations, dart_declaration, html_name): | 859 def _GenerateDispatcher(self, info, operations, dart_declaration, html_name): |
| 862 | 860 |
| 863 def GenerateCall( | 861 def GenerateCall( |
| 864 stmts_emitter, call_emitter, version, operation, argument_count): | 862 stmts_emitter, call_emitter, version, operation, argument_count): |
| 865 native_suffix = 'Callback' | 863 native_suffix = 'Callback' |
| 866 actuals = info.ParametersAsListOfVariables(argument_count, | 864 actuals = info.ParametersAsListOfVariables(argument_count, |
| 867 self._type_registry if self._da
rt_use_blink else None, | 865 self._type_registry if self._da
rt_use_blink else None, |
| 868 self._dart_js_interop, | 866 self._dart_js_interop, |
| 869 self) | 867 self) |
| 870 actuals_s = ", ".join(actuals) | 868 actuals_s = ", ".join(actuals) |
| 871 formals=actuals | 869 formals=actuals |
| 872 return_type = self.SecureOutputType(operation.type.id) | 870 return_type = self.SecureOutputType(operation.type.id) |
| 873 | 871 |
| 874 return_wrap_jso = False | 872 return_wrap_jso = False |
| 875 if self._dart_use_blink: | 873 if self._dart_use_blink: |
| 876 return_wrap_jso = wrap_return_type_blink(return_type, info.type_name,
self._type_registry) | 874 return_wrap_jso = wrap_return_type_blink(return_type, info.type_name,
self._type_registry) |
| 877 | 875 |
| 878 native_suffix = 'Callback' | 876 native_suffix = 'Callback' |
| 879 is_custom = _IsCustom(operation) | 877 is_custom = _IsCustom(operation) |
| 880 base_name = '_%s_%s' % (operation.id, version) | 878 base_name = '_%s_%s' % (operation.id, version) |
| 881 static = True | 879 static = True |
| 882 if not operation.is_static: | 880 if not operation.is_static: |
| 883 actuals = ['unwrap_jso(this)' if self._dart_use_blink else 'this'] + act
uals | 881 actuals = ['this'] + actuals |
| 884 formals = ['mthis'] + formals | 882 formals = ['mthis'] + formals |
| 885 actuals_s = ", ".join(actuals) | 883 actuals_s = ", ".join(actuals) |
| 886 formals_s = ", ".join(formals) | 884 formals_s = ", ".join(formals) |
| 887 dart_declaration = '%s(%s)' % ( | 885 dart_declaration = '%s(%s)' % ( |
| 888 base_name, formals_s) | 886 base_name, formals_s) |
| 889 native_entry = \ | 887 native_entry = \ |
| 890 self.DeriveNativeEntry(operation.id, 'Method', argument_count) | 888 self.DeriveNativeEntry(operation.id, 'Method', argument_count) |
| 891 overload_base_name = native_entry[0] | 889 overload_base_name = native_entry[0] |
| 892 overload_name = \ | 890 overload_name = \ |
| 893 self.DeriveQualifiedBlinkName(self._interface.id, | 891 self.DeriveQualifiedBlinkName(self._interface.id, |
| 894 overload_base_name) | 892 overload_base_name) |
| 895 if return_wrap_jso: | 893 call_emitter.Emit('$NAME($ARGS)', NAME=overload_name, ARGS=actuals_s) |
| 896 call_emitter.Emit('wrap_jso($NAME($ARGS))', NAME=overload_name, ARGS=a
ctuals_s) | |
| 897 else: | |
| 898 call_emitter.Emit('$NAME($ARGS)', NAME=overload_name, ARGS=actuals_s) | |
| 899 auto_scope_setup = \ | 894 auto_scope_setup = \ |
| 900 self._GenerateAutoSetupScope(base_name, native_suffix) | 895 self._GenerateAutoSetupScope(base_name, native_suffix) |
| 901 cpp_callback_name = self._GenerateNativeBinding( | 896 cpp_callback_name = self._GenerateNativeBinding( |
| 902 base_name, (0 if static else 1) + argument_count, | 897 base_name, (0 if static else 1) + argument_count, |
| 903 dart_declaration, static, return_type, formals, | 898 dart_declaration, static, return_type, formals, |
| 904 native_suffix, is_custom, auto_scope_setup, emit_metadata=False, | 899 native_suffix, is_custom, auto_scope_setup, emit_metadata=False, |
| 905 emit_to_native=True, native_entry=native_entry) | 900 emit_to_native=True, native_entry=native_entry) |
| 906 if not is_custom: | 901 if not is_custom: |
| 907 self._GenerateOperationNativeCallback(operation, | 902 self._GenerateOperationNativeCallback(operation, |
| 908 operation.arguments[:argument_count], cpp_callback_name, | 903 operation.arguments[:argument_count], cpp_callback_name, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 920 pass | 915 pass |
| 921 | 916 |
| 922 def _GenerateOperationNativeCallback(self, operation, arguments, cpp_callback_
name, auto_scope_setup=True): | 917 def _GenerateOperationNativeCallback(self, operation, arguments, cpp_callback_
name, auto_scope_setup=True): |
| 923 webcore_function_name = operation.ext_attrs.get('ImplementedAs', operation.i
d) | 918 webcore_function_name = operation.ext_attrs.get('ImplementedAs', operation.i
d) |
| 924 | 919 |
| 925 function_expression = self._GenerateWebCoreFunctionExpression(webcore_functi
on_name, operation, cpp_callback_name) | 920 function_expression = self._GenerateWebCoreFunctionExpression(webcore_functi
on_name, operation, cpp_callback_name) |
| 926 | 921 |
| 927 def _GenerateNativeBinding(self, idl_name, argument_count, dart_declaration, | 922 def _GenerateNativeBinding(self, idl_name, argument_count, dart_declaration, |
| 928 static, return_type, parameters, native_suffix, is_custom, | 923 static, return_type, parameters, native_suffix, is_custom, |
| 929 auto_scope_setup=True, emit_metadata=True, emit_to_native=False, | 924 auto_scope_setup=True, emit_metadata=True, emit_to_native=False, |
| 930 native_entry=None, wrap_unwrap_list=[], dictionary_return=False): | 925 native_entry=None, wrap_unwrap_list=[], dictionary_return=False, output_co
nversion=None): |
| 931 metadata = [] | 926 metadata = [] |
| 932 if emit_metadata: | 927 if emit_metadata: |
| 933 metadata = self._metadata.GetFormattedMetadata( | 928 metadata = self._metadata.GetFormattedMetadata( |
| 934 self._renamer.GetLibraryName(self._interface), | 929 self._renamer.GetLibraryName(self._interface), |
| 935 self._interface, idl_name, ' ') | 930 self._interface, idl_name, ' ') |
| 936 | 931 |
| 937 if (native_entry): | 932 if (native_entry): |
| 938 dart_native_name, native_binding = native_entry | 933 dart_native_name, native_binding = native_entry |
| 939 else: | 934 else: |
| 940 dart_native_name = \ | 935 dart_native_name = \ |
| 941 self.DeriveNativeName(idl_name, native_suffix) | 936 self.DeriveNativeName(idl_name, native_suffix) |
| 942 native_binding_id = self._interface.id | 937 native_binding_id = self._interface.id |
| 943 native_binding_id = TypeIdToBlinkName(native_binding_id, self._database) | 938 native_binding_id = TypeIdToBlinkName(native_binding_id, self._database) |
| 944 native_binding = \ | 939 native_binding = \ |
| 945 '%s_%s_%s' % (native_binding_id, idl_name, native_suffix) | 940 '%s_%s_%s' % (native_binding_id, idl_name, native_suffix) |
| 946 | 941 |
| 947 if not static: | 942 if not static: |
| 948 formals = ", ".join(['mthis'] + parameters) | 943 formals = ", ".join(['mthis'] + parameters) |
| 949 if wrap_unwrap_list and wrap_unwrap_list[1]: | 944 actuals = ", ".join(['this'] + parameters) |
| 950 actuals = ", ".join(['unwrap_jso(this)'] + parameters) | |
| 951 else: | |
| 952 actuals = ", ".join(['this'] + parameters) | |
| 953 else: | 945 else: |
| 954 formals = ", ".join(parameters) | 946 formals = ", ".join(parameters) |
| 955 actuals = ", ".join(parameters) | 947 actuals = ", ".join(parameters) |
| 956 | 948 |
| 957 if not emit_to_native: | 949 if not emit_to_native: |
| 958 caller_emitter = self._members_emitter | 950 caller_emitter = self._members_emitter |
| 959 full_dart_name = \ | 951 full_dart_name = \ |
| 960 self.DeriveQualifiedBlinkName(self._interface.id, | 952 self.DeriveQualifiedBlinkName(self._interface.id, |
| 961 dart_native_name) | 953 dart_native_name) |
| 962 if IsPureInterface(self._interface.id): | 954 if IsPureInterface(self._interface.id): |
| 963 caller_emitter.Emit( | 955 caller_emitter.Emit( |
| 964 '\n' | 956 '\n' |
| 965 ' $METADATA$DART_DECLARATION;\n', | 957 ' $METADATA$DART_DECLARATION;\n', |
| 966 METADATA=metadata, | 958 METADATA=metadata, |
| 967 DART_DECLARATION=dart_declaration) | 959 DART_DECLARATION=dart_declaration) |
| 968 else: | 960 else: |
| 969 emit_template = ''' | 961 emit_template = ''' |
| 970 $METADATA$DART_DECLARATION => $DART_NAME($ACTUALS); | 962 $METADATA$DART_DECLARATION => $DART_NAME($ACTUALS); |
| 971 ''' | 963 ''' |
| 972 if wrap_unwrap_list and wrap_unwrap_list[0]: | 964 if output_conversion and not dictionary_return: |
| 965 conversion_template = ''' |
| 966 $METADATA$DART_DECLARATION => %s($DART_NAME($ACTUALS)); |
| 967 ''' |
| 968 emit_template = conversion_template % output_conversion.function_n
ame |
| 969 |
| 970 elif wrap_unwrap_list and wrap_unwrap_list[0]: |
| 973 if return_type == 'Rectangle': | 971 if return_type == 'Rectangle': |
| 974 jso_util_method = 'make_dart_rectangle' | 972 jso_util_method = 'make_dart_rectangle' |
| 975 elif wrap_unwrap_list[0]: | 973 elif wrap_unwrap_list[0]: |
| 976 jso_util_method = 'wrap_jso' | 974 jso_util_method = '' |
| 977 | 975 |
| 978 if dictionary_return: | 976 if dictionary_return: |
| 979 emit_jso_template = ''' | 977 emit_jso_template = ''' |
| 980 $METADATA$DART_DECLARATION => convertNativeDictionaryToDartDictionary(%s($DART
_NAME($ACTUALS))); | 978 $METADATA$DART_DECLARATION => convertNativeDictionaryToDartDictionary(%s($DART
_NAME($ACTUALS))); |
| 981 ''' | 979 ''' |
| 982 else: | 980 else: |
| 983 emit_jso_template = ''' | 981 emit_jso_template = ''' |
| 984 $METADATA$DART_DECLARATION => %s($DART_NAME($ACTUALS)); | 982 $METADATA$DART_DECLARATION => %s($DART_NAME($ACTUALS)); |
| 985 ''' | 983 ''' |
| 986 emit_template = emit_jso_template % jso_util_method | 984 emit_template = emit_jso_template % jso_util_method |
| (...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1250 | 1248 |
| 1251 def _IsCustom(op_or_attr): | 1249 def _IsCustom(op_or_attr): |
| 1252 assert(isinstance(op_or_attr, IDLMember)) | 1250 assert(isinstance(op_or_attr, IDLMember)) |
| 1253 return 'Custom' in op_or_attr.ext_attrs or 'DartCustom' in op_or_attr.ext_attr
s | 1251 return 'Custom' in op_or_attr.ext_attrs or 'DartCustom' in op_or_attr.ext_attr
s |
| 1254 | 1252 |
| 1255 def _IsCustomValue(op_or_attr, value): | 1253 def _IsCustomValue(op_or_attr, value): |
| 1256 if _IsCustom(op_or_attr): | 1254 if _IsCustom(op_or_attr): |
| 1257 return op_or_attr.ext_attrs.get('Custom') == value \ | 1255 return op_or_attr.ext_attrs.get('Custom') == value \ |
| 1258 or op_or_attr.ext_attrs.get('DartCustom') == value | 1256 or op_or_attr.ext_attrs.get('DartCustom') == value |
| 1259 return False | 1257 return False |
| OLD | NEW |