Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(161)

Side by Side Diff: tools/dom/scripts/systemnative.py

Issue 254463006: This CL contains all of the changes for splitting off all of the native (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Additional cleanup, eliminate now unused generality Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « tools/dom/scripts/systemhtml.py ('k') | tools/dom/scripts/templateloader_test.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 # track the necessary info. 164 # track the necessary info.
165 _url_utils = ['hash', 'host', 'hostname', 'origin', 165 _url_utils = ['hash', 'host', 'hostname', 'origin',
166 'password', 'pathname', 'port', 'protocol', 166 'password', 'pathname', 'port', 'protocol',
167 'search', 'username'] 167 'search', 'username']
168 _cpp_static_call_map = { 168 _cpp_static_call_map = {
169 'DOMURL': _url_utils + ['href', 'toString'], 169 'DOMURL': _url_utils + ['href', 'toString'],
170 'HTMLAnchorElement': _url_utils, 170 'HTMLAnchorElement': _url_utils,
171 'HTMLAreaElement': _url_utils, 171 'HTMLAreaElement': _url_utils,
172 } 172 }
173 173
174 # This goes away after the Chrome 35 roll (or whenever we commit to the
175 # dart:blink refactor)
176 dart_use_blink = False
177
174 def _GetCPPPartialNames(interface): 178 def _GetCPPPartialNames(interface):
175 interface_name = interface.ext_attrs.get('ImplementedAs', interface.id) 179 interface_name = interface.ext_attrs.get('ImplementedAs', interface.id)
176 if not _cpp_partial_map: 180 if not _cpp_partial_map:
177 for (type, member) in _cpp_callback_map.keys(): 181 for (type, member) in _cpp_callback_map.keys():
178 if type not in _cpp_partial_map: 182 if type not in _cpp_partial_map:
179 _cpp_partial_map[type] = set([]) 183 _cpp_partial_map[type] = set([])
180 184
181 name_with_path = _cpp_callback_map[(type, member)] 185 name_with_path = _cpp_callback_map[(type, member)]
182 if name_with_path in _cpp_import_map: 186 if name_with_path in _cpp_import_map:
183 name_with_path = _cpp_import_map[name_with_path] 187 name_with_path = _cpp_import_map[name_with_path]
(...skipping 21 matching lines...) Expand all
205 209
206 cpp_tuple = (interface_name, callback_name) 210 cpp_tuple = (interface_name, callback_name)
207 if cpp_tuple in _cpp_callback_map: 211 if cpp_tuple in _cpp_callback_map:
208 cpp_type_name = _cpp_callback_map[cpp_tuple] 212 cpp_type_name = _cpp_callback_map[cpp_tuple]
209 elif (interface_name, cpp_name) in _cpp_overloaded_callback_map: 213 elif (interface_name, cpp_name) in _cpp_overloaded_callback_map:
210 cpp_type_name = _cpp_overloaded_callback_map[(interface_name, cpp_name)] 214 cpp_type_name = _cpp_overloaded_callback_map[(interface_name, cpp_name)]
211 else: 215 else:
212 cpp_type_name = interface_name 216 cpp_type_name = interface_name
213 return cpp_type_name 217 return cpp_type_name
214 218
219 def DeriveQualifiedName(library_name, name):
220 return library_name + "." + name
221
222 def DeriveNativeName(interface_name, name, suffix):
223 fields = ["Native", interface_name, name]
224 if suffix != "":
225 fields.append(suffix)
226 return "_".join(fields)
227
228 # FIXME(leafp) This should really go elsewhere. I think the right thing
229 # to do is to add support in the DartLibraries objects in systemhtml
230 # for emitting top level code in libraries. This can then just be a
231 # normal use of that kind of object
232 def GetNativeLibraryEmitter(emitters, template_loader,
233 dartium_output_dir, dart_output_dir,
234 auxiliary_dir):
235 def massage_path(path):
236 # The most robust way to emit path separators is to use / always.
237 return path.replace('\\', '/')
238 template = template_loader.Load('blink_dartium.darttemplate')
239 dart_path = os.path.join(dartium_output_dir, 'blink_dartium.dart')
240 library_emitter = emitters.FileEmitter(dart_path)
241 auxiliary_dir = os.path.relpath(auxiliary_dir, dartium_output_dir)
242 emitter = \
243 library_emitter.Emit(template,
244 AUXILIARY_DIR=massage_path(auxiliary_dir))
245 return emitter
246
215 class DartiumBackend(HtmlDartGenerator): 247 class DartiumBackend(HtmlDartGenerator):
216 """Generates Dart implementation for one DOM IDL interface.""" 248 """Generates Dart implementation for one DOM IDL interface."""
217 249
218 def __init__(self, interface, cpp_library_emitter, options): 250 def __init__(self, interface, native_library_emitter,
251 cpp_library_emitter, options):
219 super(DartiumBackend, self).__init__(interface, options) 252 super(DartiumBackend, self).__init__(interface, options)
220 253
221 self._interface = interface 254 self._interface = interface
222 self._cpp_library_emitter = cpp_library_emitter 255 self._cpp_library_emitter = cpp_library_emitter
256 self._native_library_emitter = native_library_emitter
223 self._database = options.database 257 self._database = options.database
224 self._template_loader = options.templates 258 self._template_loader = options.templates
225 self._type_registry = options.type_registry 259 self._type_registry = options.type_registry
226 self._interface_type_info = self._type_registry.TypeInfo(self._interface.id) 260 self._interface_type_info = self._type_registry.TypeInfo(self._interface.id)
227 self._metadata = options.metadata 261 self._metadata = options.metadata
262 self._native_library_name = "blink"
263 # These get initialized by StartInterface
264 self._cpp_header_emitter = None
265 self._cpp_impl_emitter = None
266 self._members_emitter = None
267 self._cpp_declarations_emitter = None
268 self._cpp_impl_includes = None
269 self._cpp_definitions_emitter = None
270 self._cpp_resolver_emitter = None
228 271
229 def ImplementsMergedMembers(self): 272 def ImplementsMergedMembers(self):
230 # We could not add merged functions to implementation class because 273 # We could not add merged functions to implementation class because
231 # underlying c++ object doesn't implement them. Merged functions are 274 # underlying c++ object doesn't implement them. Merged functions are
232 # generated on merged interface implementation instead. 275 # generated on merged interface implementation instead.
233 return False 276 return False
234 277
235 def CustomJSMembers(self): 278 def CustomJSMembers(self):
236 return {} 279 return {}
237 280
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
346 def ImplementationTemplate(self): 389 def ImplementationTemplate(self):
347 template = None 390 template = None
348 interface_name = self._interface.doc_js_name 391 interface_name = self._interface.doc_js_name
349 if interface_name == self._interface.id or not self._database.HasInterface(i nterface_name): 392 if interface_name == self._interface.id or not self._database.HasInterface(i nterface_name):
350 template_file = 'impl_%s.darttemplate' % interface_name 393 template_file = 'impl_%s.darttemplate' % interface_name
351 template = self._template_loader.TryLoad(template_file) 394 template = self._template_loader.TryLoad(template_file)
352 if not template: 395 if not template:
353 template = self._template_loader.Load('dart_implementation.darttemplate') 396 template = self._template_loader.Load('dart_implementation.darttemplate')
354 return template 397 return template
355 398
399 def _NativeImplementationTemplate(self):
400 template = None
401 interface_name = self._interface.doc_js_name
402 if (interface_name == self._interface.id or
403 not self._database.HasInterface(interface_name)):
404 template_file = 'impl_blink_%s.darttemplate' % interface_name
405 template = self._template_loader.TryLoad(template_file)
406 if not template:
407 template = \
408 self._template_loader.Load('dart_blink_implementation.darttemplate')
409 return template
410
356 def RootClassName(self): 411 def RootClassName(self):
357 return 'NativeFieldWrapperClass2' 412 return 'NativeFieldWrapperClass2'
358 413
359 def NativeSpec(self): 414 def NativeSpec(self):
360 return '' 415 return ''
361 416
362 def StartInterface(self, members_emitter): 417 def StartInterface(self, members_emitter):
363 # Create emitters for c++ implementation. 418 # Create emitters for c++ implementation.
364 if not IsPureInterface(self._interface.id) and not IsCustomType(self._interf ace.id): 419 if not IsPureInterface(self._interface.id) and \
420 not IsCustomType(self._interface.id):
365 self._cpp_header_emitter = self._cpp_library_emitter.CreateHeaderEmitter( 421 self._cpp_header_emitter = self._cpp_library_emitter.CreateHeaderEmitter(
366 self._interface.id, 422 self._interface.id,
367 self._renamer.GetLibraryName(self._interface)) 423 self._renamer.GetLibraryName(self._interface))
368 self._cpp_impl_emitter = self._cpp_library_emitter.CreateSourceEmitter(sel f._interface.id) 424 self._cpp_impl_emitter = \
425 self._cpp_library_emitter.CreateSourceEmitter(self._interface.id)
369 else: 426 else:
370 self._cpp_header_emitter = emitter.Emitter() 427 self._cpp_header_emitter = emitter.Emitter()
371 self._cpp_impl_emitter = emitter.Emitter() 428 self._cpp_impl_emitter = emitter.Emitter()
372 429
373 self._interface_type_info = self._TypeInfo(self._interface.id) 430 self._interface_type_info = self._TypeInfo(self._interface.id)
374 self._members_emitter = members_emitter 431 self._members_emitter = members_emitter
432
375 self._cpp_declarations_emitter = emitter.Emitter() 433 self._cpp_declarations_emitter = emitter.Emitter()
376 434
377 self._cpp_impl_includes = set(['"' + partial + '.h"' 435 self._cpp_impl_includes = \
378 for partial in _GetCPPPartialNames(self._inte rface)]) 436 set(['"' + partial + '.h"'
437 for partial in _GetCPPPartialNames(self._interface)])
379 438
380 # This is a hack to work around a strange C++ compile error that we weren't 439 # This is a hack to work around a strange C++ compile error that we weren't
381 # able to track down the true cause of. 440 # able to track down the true cause of.
382 if self._interface.id == 'Timing': 441 if self._interface.id == 'Timing':
383 self._cpp_impl_includes.add('"core/animation/TimedItem.h"') 442 self._cpp_impl_includes.add('"core/animation/TimedItem.h"')
384 443
385 self._cpp_definitions_emitter = emitter.Emitter() 444 self._cpp_definitions_emitter = emitter.Emitter()
386 self._cpp_resolver_emitter = emitter.Emitter() 445 self._cpp_resolver_emitter = emitter.Emitter()
387 446
388 # We need to revisit our treatment of typed arrays, right now 447 # We need to revisit our treatment of typed arrays, right now
(...skipping 13 matching lines...) Expand all
402 '}\n', 461 '}\n',
403 INTERFACE_NAME=self._interface.id); 462 INTERFACE_NAME=self._interface.id);
404 463
405 def _EmitConstructorInfrastructure(self, 464 def _EmitConstructorInfrastructure(self,
406 constructor_info, constructor_callback_cpp_name, factory_method_name, 465 constructor_info, constructor_callback_cpp_name, factory_method_name,
407 argument_count=None): 466 argument_count=None):
408 constructor_callback_id = self._interface.id + '_' + constructor_callback_cp p_name 467 constructor_callback_id = self._interface.id + '_' + constructor_callback_cp p_name
409 if argument_count is None: 468 if argument_count is None:
410 argument_count = len(constructor_info.param_infos) 469 argument_count = len(constructor_info.param_infos)
411 470
412 self._members_emitter.Emit( 471 typed_formals = constructor_info.ParametersAsArgumentList(argument_count)
413 '\n @DocsEditable()\n' 472 parameters = constructor_info.ParametersAsStringOfVariables(argument_count)
414 ' static $INTERFACE_NAME $FACTORY_METHOD_NAME($PARAMETERS) ' 473 interface_name = self._interface_type_info.interface_name()
474
475 if dart_use_blink:
476 # First we emit the toplevel function
477 dart_native_name = \
478 DeriveNativeName(self._interface.id, constructor_callback_cpp_name, "")
479 self._native_library_emitter.Emit(
480 '\n'
481 '$FACTORY_METHOD_NAME($PARAMETERS) native "$ID";\n',
482 FACTORY_METHOD_NAME=dart_native_name,
483 PARAMETERS=parameters,
484 ID=constructor_callback_id)
485
486 # Then we emit the impedance matching wrapper to call out to the
487 # toplevel wrapper
488 self._members_emitter.Emit(
489 '\n @DocsEditable()\n'
490 ' static $INTERFACE_NAME $FACTORY_METHOD_NAME($PARAMETERS) => '
491 '$TOPLEVEL_NAME($OUTPARAMETERS);\n',
492 INTERFACE_NAME=self._interface_type_info.interface_name(),
493 FACTORY_METHOD_NAME=factory_method_name,
494 PARAMETERS=typed_formals,
495 TOPLEVEL_NAME=DeriveQualifiedName(self._native_library_name,
496 dart_native_name),
497 OUTPARAMETERS=parameters)
498 else:
499 self._members_emitter.Emit(
500 '\n @DocsEditable()\n'
501 ' static $INTERFACE_NAME $FACTORY_METHOD_NAME($PARAMETERS) '
415 'native "$ID";\n', 502 'native "$ID";\n',
416 INTERFACE_NAME=self._interface_type_info.interface_name(), 503 INTERFACE_NAME=self._interface_type_info.interface_name(),
417 FACTORY_METHOD_NAME=factory_method_name, 504 FACTORY_METHOD_NAME=factory_method_name,
418 # TODO: add types to parameters. 505 PARAMETERS=typed_formals,
419 PARAMETERS=constructor_info.ParametersAsArgumentList(argument_count), 506 ID=constructor_callback_id)
420 ID=constructor_callback_id)
421 507
422 self._cpp_resolver_emitter.Emit( 508 self._cpp_resolver_emitter.Emit(
423 ' if (name == "$ID")\n' 509 ' if (name == "$ID")\n'
424 ' return Dart$(WEBKIT_INTERFACE_NAME)Internal::$CPP_CALLBACK;\n', 510 ' return Dart$(WEBKIT_INTERFACE_NAME)Internal::$CPP_CALLBACK;\n',
425 ID=constructor_callback_id, 511 ID=constructor_callback_id,
426 WEBKIT_INTERFACE_NAME=self._interface.id, 512 WEBKIT_INTERFACE_NAME=self._interface.id,
427 CPP_CALLBACK=constructor_callback_cpp_name) 513 CPP_CALLBACK=constructor_callback_cpp_name)
428 514
429 def GenerateCustomFactory(self, constructor_info): 515 def GenerateCustomFactory(self, constructor_info):
430 if 'CustomConstructor' not in self._interface.ext_attrs: 516 if 'CustomConstructor' not in self._interface.ext_attrs:
431 return False 517 return False
432 518
433 annotations = self._metadata.GetFormattedMetadata(self._library_name, 519 annotations = self._metadata.GetFormattedMetadata(self._library_name,
434 self._interface, self._interface.id, ' ') 520 self._interface, self._interface.id, ' ')
435 521
436 self._members_emitter.Emit( 522 self._members_emitter.Emit(
437 '\n $(ANNOTATIONS)factory $CTOR($PARAMS) => _create($FACTORY_PARAMS);\n ', 523 '\n $(ANNOTATIONS)factory $CTOR($PARAMS) => _create($FACTORY_PARAMS);\n ',
438 ANNOTATIONS=annotations, 524 ANNOTATIONS=annotations,
439 CTOR=constructor_info._ConstructorFullName(self._DartType), 525 CTOR=constructor_info._ConstructorFullName(self._DartType),
440 PARAMS=constructor_info.ParametersDeclaration(self._DartType), 526 PARAMS=constructor_info.ParametersAsDeclaration(self._DartType),
441 FACTORY_PARAMS= \ 527 FACTORY_PARAMS= \
442 constructor_info.ParametersAsArgumentList()) 528 constructor_info.ParametersAsArgumentList())
443 529
444 constructor_callback_cpp_name = 'constructorCallback' 530 constructor_callback_cpp_name = 'constructorCallback'
445 self._EmitConstructorInfrastructure( 531 self._EmitConstructorInfrastructure(
446 constructor_info, constructor_callback_cpp_name, '_create') 532 constructor_info, constructor_callback_cpp_name, '_create')
447 533
448 self._cpp_declarations_emitter.Emit( 534 self._cpp_declarations_emitter.Emit(
449 '\n' 535 '\n'
450 'void $CPP_CALLBACK(Dart_NativeArguments);\n', 536 'void $CPP_CALLBACK(Dart_NativeArguments);\n',
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
669 755
670 def _GenerateAutoSetupScope(self, idl_name, native_suffix): 756 def _GenerateAutoSetupScope(self, idl_name, native_suffix):
671 return (self._interface.id, idl_name, native_suffix) not in _cpp_no_auto_sco pe_list 757 return (self._interface.id, idl_name, native_suffix) not in _cpp_no_auto_sco pe_list
672 758
673 def _AddGetter(self, attr, html_name, read_only): 759 def _AddGetter(self, attr, html_name, read_only):
674 # Temporary hack to force dart:scalarlist clamped array for ImageData.data. 760 # Temporary hack to force dart:scalarlist clamped array for ImageData.data.
675 # TODO(antonm): solve in principled way. 761 # TODO(antonm): solve in principled way.
676 if self._interface.id == 'ImageData' and html_name == 'data': 762 if self._interface.id == 'ImageData' and html_name == 'data':
677 html_name = '_data' 763 html_name = '_data'
678 type_info = self._TypeInfo(attr.type.id) 764 type_info = self._TypeInfo(attr.type.id)
679 dart_declaration = '%s get %s' % ( 765 return_type = self.SecureOutputType(attr.type.id, False, read_only)
680 self.SecureOutputType(attr.type.id, False, read_only), html_name) 766 parameters = []
767 dart_declaration = '%s get %s' % (return_type, html_name)
681 is_custom = ('Custom' in attr.ext_attrs and 768 is_custom = ('Custom' in attr.ext_attrs and
682 (attr.ext_attrs['Custom'] == None or 769 (attr.ext_attrs['Custom'] == None or
683 attr.ext_attrs['Custom'] == 'Getter')) 770 attr.ext_attrs['Custom'] == 'Getter'))
684 # This seems to have been replaced with Custom=Getter (see above), but 771 # This seems to have been replaced with Custom=Getter (see above), but
685 # check to be sure we don't see the old syntax 772 # check to be sure we don't see the old syntax
686 assert(not ('CustomGetter' in attr.ext_attrs)) 773 assert(not ('CustomGetter' in attr.ext_attrs))
687 native_suffix = 'Getter' 774 native_suffix = 'Getter'
688 auto_scope_setup = self._GenerateAutoSetupScope(attr.id, native_suffix) 775 auto_scope_setup = self._GenerateAutoSetupScope(attr.id, native_suffix)
689 cpp_callback_name = self._GenerateNativeBinding(attr.id, 1, 776 cpp_callback_name = self._GenerateNativeBinding(attr.id, 1,
690 dart_declaration, native_suffix, is_custom, auto_scope_setup) 777 dart_declaration, False, return_type, parameters,
778 native_suffix, is_custom, auto_scope_setup)
691 if is_custom: 779 if is_custom:
692 return 780 return
693 781
694 if 'Reflect' in attr.ext_attrs: 782 if 'Reflect' in attr.ext_attrs:
695 webcore_function_name = self._TypeInfo(attr.type.id).webcore_getter_name() 783 webcore_function_name = self._TypeInfo(attr.type.id).webcore_getter_name()
696 if 'URL' in attr.ext_attrs: 784 if 'URL' in attr.ext_attrs:
697 if 'NonEmpty' in attr.ext_attrs: 785 if 'NonEmpty' in attr.ext_attrs:
698 webcore_function_name = 'getNonEmptyURLAttribute' 786 webcore_function_name = 'getNonEmptyURLAttribute'
699 else: 787 else:
700 webcore_function_name = 'getURLAttribute' 788 webcore_function_name = 'getURLAttribute'
(...skipping 18 matching lines...) Expand all
719 function_expression, 807 function_expression,
720 attr, 808 attr,
721 [], 809 [],
722 attr.type.id, 810 attr.type.id,
723 attr.type.nullable, 811 attr.type.nullable,
724 raises, 812 raises,
725 auto_scope_setup) 813 auto_scope_setup)
726 814
727 def _AddSetter(self, attr, html_name): 815 def _AddSetter(self, attr, html_name):
728 type_info = self._TypeInfo(attr.type.id) 816 type_info = self._TypeInfo(attr.type.id)
729 dart_declaration = 'void set %s(%s value)' % (html_name, self._DartType(attr .type.id)) 817 return_type = 'void'
818 parameters = ['value']
819 ptype = self._DartType(attr.type.id)
820 dart_declaration = 'void set %s(%s value)' % (html_name, ptype)
730 is_custom = ('Custom' in attr.ext_attrs and 821 is_custom = ('Custom' in attr.ext_attrs and
731 (attr.ext_attrs['Custom'] == None or 822 (attr.ext_attrs['Custom'] == None or
732 attr.ext_attrs['Custom'] == 'Setter')) 823 attr.ext_attrs['Custom'] == 'Setter'))
733 # This seems to have been replaced with Custom=Setter (see above), but 824 # This seems to have been replaced with Custom=Setter (see above), but
734 # check to be sure we don't see the old syntax 825 # check to be sure we don't see the old syntax
735 assert(not ('CustomSetter' in attr.ext_attrs)) 826 assert(not ('CustomSetter' in attr.ext_attrs))
736 assert(not ('V8CustomSetter' in attr.ext_attrs)) 827 assert(not ('V8CustomSetter' in attr.ext_attrs))
737 native_suffix = 'Setter' 828 native_suffix = 'Setter'
738 auto_scope_setup = self._GenerateAutoSetupScope(attr.id, native_suffix) 829 auto_scope_setup = self._GenerateAutoSetupScope(attr.id, native_suffix)
739 cpp_callback_name = self._GenerateNativeBinding(attr.id, 2, 830 cpp_callback_name = self._GenerateNativeBinding(attr.id, 2,
740 dart_declaration, native_suffix, is_custom, auto_scope_setup) 831 dart_declaration, False, return_type, parameters,
832 native_suffix, is_custom, auto_scope_setup)
741 if is_custom: 833 if is_custom:
742 return 834 return
743 835
744 if 'Reflect' in attr.ext_attrs: 836 if 'Reflect' in attr.ext_attrs:
745 webcore_function_name = self._TypeInfo(attr.type.id).webcore_setter_name() 837 webcore_function_name = self._TypeInfo(attr.type.id).webcore_setter_name()
746 else: 838 else:
747 if 'ImplementedAs' in attr.ext_attrs: 839 if 'ImplementedAs' in attr.ext_attrs:
748 attr_name = attr.ext_attrs['ImplementedAs'] 840 attr_name = attr.ext_attrs['ImplementedAs']
749 else: 841 else:
750 attr_name = attr.id 842 attr_name = attr.id
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
786 # and 878 # and
787 # 879 #
788 # class YImpl extends ListBase<T> { copies of transitive XImpl methods; } 880 # class YImpl extends ListBase<T> { copies of transitive XImpl methods; }
789 # 881 #
790 dart_element_type = self._DartType(element_type) 882 dart_element_type = self._DartType(element_type)
791 if self._HasNativeIndexGetter(): 883 if self._HasNativeIndexGetter():
792 self._EmitNativeIndexGetter(dart_element_type) 884 self._EmitNativeIndexGetter(dart_element_type)
793 elif self._HasExplicitIndexedGetter(): 885 elif self._HasExplicitIndexedGetter():
794 self._EmitExplicitIndexedGetter(dart_element_type) 886 self._EmitExplicitIndexedGetter(dart_element_type)
795 else: 887 else:
796 self._members_emitter.Emit( 888 if dart_use_blink:
797 '\n' 889 dart_native_name = \
798 ' $TYPE operator[](int index) {\n' 890 DeriveNativeName(self._interface.id, "NativeIndexed", "Getter")
799 ' if (index < 0 || index >= length)\n' 891 # First emit a toplevel function to do the native call
800 ' throw new RangeError.range(index, 0, length);\n' 892 # Calls to this are emitted elsewhere,
801 ' return _nativeIndexedGetter(index);\n' 893 self._native_library_emitter.Emit(
802 ' }\n' 894 '\n'
803 ' $TYPE _nativeIndexedGetter(int index) native "$(INTERFACE)_item_Cal lback";\n', 895 '$(DART_NATIVE_NAME)(mthis, index) '
804 TYPE=self.SecureOutputType(element_type), 896 'native "$(INTERFACE)_item_Callback";\n',
805 INTERFACE=self._interface.id) 897 DART_NATIVE_NAME = dart_native_name,
898 INTERFACE=self._interface.id)
899
900 # Emit the method which calls the toplevel function, along with
901 # the [] operator.
902 self._members_emitter.Emit(
903 '\n'
904 ' $TYPE operator[](int index) {\n'
905 ' if (index < 0 || index >= length)\n'
906 ' throw new RangeError.range(index, 0, length);\n'
907 ' return $(DART_NATIVE_NAME)(this, index);\n'
908 ' }\n\n'
909 ' $TYPE _nativeIndexedGetter(int index) =>'
910 ' $(DART_NATIVE_NAME)(this, index);\n',
911 DART_NATIVE_NAME=DeriveQualifiedName(self._native_library_name,
912 dart_native_name),
913 TYPE=self.SecureOutputType(element_type),
914 INTERFACE=self._interface.id)
915 else:
916 # Emit the method which calls the toplevel function, along with
917 # the [] operator.
918 self._members_emitter.Emit(
919 '\n'
920 ' $TYPE operator[](int index) {\n'
921 ' if (index < 0 || index >= length)\n'
922 ' throw new RangeError.range(index, 0, length);\n'
923 ' return _nativeIndexedGetter(index);\n'
924 ' }\n'
925 ' $TYPE _nativeIndexedGetter(int index)'
926 ' native "$(INTERFACE)_item_Callback";\n',
927 TYPE=self.SecureOutputType(element_type),
928 INTERFACE=self._interface.id)
806 929
807 if self._HasNativeIndexSetter(): 930 if self._HasNativeIndexSetter():
808 self._EmitNativeIndexSetter(dart_element_type) 931 self._EmitNativeIndexSetter(dart_element_type)
809 else: 932 else:
810 self._members_emitter.Emit( 933 self._members_emitter.Emit(
811 '\n' 934 '\n'
812 ' void operator[]=(int index, $TYPE value) {\n' 935 ' void operator[]=(int index, $TYPE value) {\n'
813 ' throw new UnsupportedError("Cannot assign element of immutable Li st.");\n' 936 ' throw new UnsupportedError("Cannot assign element of immutable Li st.");\n'
814 ' }\n', 937 ' }\n',
815 TYPE=dart_element_type) 938 TYPE=dart_element_type)
(...skipping 12 matching lines...) Expand all
828 951
829 if self._HasNativeIndexGetter(): 952 if self._HasNativeIndexGetter():
830 self._EmitNativeIndexGetter(dart_element_type) 953 self._EmitNativeIndexGetter(dart_element_type)
831 if self._HasNativeIndexSetter(): 954 if self._HasNativeIndexSetter():
832 self._EmitNativeIndexSetter(dart_element_type) 955 self._EmitNativeIndexSetter(dart_element_type)
833 956
834 def _HasNativeIndexGetter(self): 957 def _HasNativeIndexGetter(self):
835 return 'CustomIndexedGetter' in self._interface.ext_attrs 958 return 'CustomIndexedGetter' in self._interface.ext_attrs
836 959
837 def _EmitNativeIndexGetter(self, element_type): 960 def _EmitNativeIndexGetter(self, element_type):
838 dart_declaration = '%s operator[](int index)' % \ 961 return_type = self.SecureOutputType(element_type, True)
839 self.SecureOutputType(element_type, True) 962 parameters = ['index']
840 self._GenerateNativeBinding('numericIndexGetter', 2, dart_declaration, 963 dart_declaration = '%s operator[](int index)' % return_type
841 'Callback', True, False) 964 self._GenerateNativeBinding('numericIndexGetter', 2,
965 dart_declaration, False, return_type, parameters,
966 'Callback', True, False)
842 967
843 def _HasExplicitIndexedGetter(self): 968 def _HasExplicitIndexedGetter(self):
844 return any(op.id == 'getItem' for op in self._interface.operations) 969 return any(op.id == 'getItem' for op in self._interface.operations)
845 970
846 def _EmitExplicitIndexedGetter(self, dart_element_type): 971 def _EmitExplicitIndexedGetter(self, dart_element_type):
847 if any(op.id == 'getItem' for op in self._interface.operations): 972 if any(op.id == 'getItem' for op in self._interface.operations):
848 indexed_getter = 'getItem' 973 indexed_getter = 'getItem'
849 974
850 self._members_emitter.Emit( 975 self._members_emitter.Emit(
851 '\n' 976 '\n'
852 ' $TYPE operator[](int index) {\n' 977 ' $TYPE operator[](int index) {\n'
853 ' if (index < 0 || index >= length)\n' 978 ' if (index < 0 || index >= length)\n'
854 ' throw new RangeError.range(index, 0, length);\n' 979 ' throw new RangeError.range(index, 0, length);\n'
855 ' return $INDEXED_GETTER(index);\n' 980 ' return $INDEXED_GETTER(index);\n'
856 ' }\n', 981 ' }\n',
857 TYPE=dart_element_type, 982 TYPE=dart_element_type,
858 INDEXED_GETTER=indexed_getter) 983 INDEXED_GETTER=indexed_getter)
859 984
860 def _HasNativeIndexSetter(self): 985 def _HasNativeIndexSetter(self):
861 return 'CustomIndexedSetter' in self._interface.ext_attrs 986 return 'CustomIndexedSetter' in self._interface.ext_attrs
862 987
863 def _EmitNativeIndexSetter(self, element_type): 988 def _EmitNativeIndexSetter(self, element_type):
864 dart_declaration = 'void operator[]=(int index, %s value)' % element_type 989 return_type = 'void'
865 self._GenerateNativeBinding('numericIndexSetter', 3, dart_declaration, 990 formals = ', '.join(['int index', '%s value' % element_type])
866 'Callback', True, False) 991 parameters = ['index', 'value']
992 dart_declaration = 'void operator[]=(%s)' % formals
993 self._GenerateNativeBinding('numericIndexSetter', 3,
994 dart_declaration, False, return_type, parameters,
995 'Callback', True, False)
867 996
868 def EmitOperation(self, info, html_name): 997 def EmitOperation(self, info, html_name):
869 """ 998 """
870 Arguments: 999 Arguments:
871 info: An OperationInfo object. 1000 info: An OperationInfo object.
872 """ 1001 """
873 1002 return_type = self.SecureOutputType(info.type_name, False, True)
1003 formals = info.ParametersAsDeclaration(self._DartType)
1004 parameters = info.ParametersAsListOfVariables()
874 dart_declaration = '%s%s %s(%s)' % ( 1005 dart_declaration = '%s%s %s(%s)' % (
875 'static ' if info.IsStatic() else '', 1006 'static ' if info.IsStatic() else '',
876 self.SecureOutputType(info.type_name, False, True), 1007 return_type,
877 html_name, 1008 html_name,
878 info.ParametersDeclaration(self._DartType)) 1009 formals)
879 1010
880 operation = info.operations[0] 1011 operation = info.operations[0]
881 is_custom = 'Custom' in operation.ext_attrs 1012 is_custom = 'Custom' in operation.ext_attrs
882 has_optional_arguments = any(self._IsArgumentOptionalInWebCore(operation, ar gument) for argument in operation.arguments) 1013 has_optional_arguments = any(self._IsArgumentOptionalInWebCore(operation, ar gument) for argument in operation.arguments)
883 needs_dispatcher = not is_custom and (len(info.operations) > 1 or has_option al_arguments) 1014 needs_dispatcher = not is_custom and (len(info.operations) > 1 or has_option al_arguments)
884 1015
885 if info.callback_args: 1016 if info.callback_args:
886 self._AddFutureifiedOperation(info, html_name) 1017 self._AddFutureifiedOperation(info, html_name)
887 elif not needs_dispatcher: 1018 elif not needs_dispatcher:
888 # Bind directly to native implementation 1019 # Bind directly to native implementation
889 argument_count = (0 if info.IsStatic() else 1) + len(info.param_infos) 1020 argument_count = (0 if info.IsStatic() else 1) + len(info.param_infos)
890 native_suffix = 'Callback' 1021 native_suffix = 'Callback'
891 auto_scope_setup = self._GenerateAutoSetupScope(info.name, native_suffix) 1022 auto_scope_setup = self._GenerateAutoSetupScope(info.name, native_suffix)
892 cpp_callback_name = self._GenerateNativeBinding( 1023 cpp_callback_name = self._GenerateNativeBinding(
893 info.name, argument_count, dart_declaration, native_suffix, is_custom, 1024 info.name, argument_count, dart_declaration,
894 auto_scope_setup) 1025 info.IsStatic(), return_type, parameters,
1026 native_suffix, is_custom, auto_scope_setup)
895 if not is_custom: 1027 if not is_custom:
896 self._GenerateOperationNativeCallback(operation, operation.arguments, cp p_callback_name, auto_scope_setup) 1028 self._GenerateOperationNativeCallback(operation, operation.arguments, cp p_callback_name, auto_scope_setup)
897 else: 1029 else:
898 self._GenerateDispatcher(info, info.operations, dart_declaration) 1030 self._GenerateDispatcher(info, info.operations, dart_declaration)
899 1031
900 def _GenerateDispatcher(self, info, operations, dart_declaration): 1032 def _GenerateDispatcher(self, info, operations, dart_declaration):
901 1033
902 def GenerateCall( 1034 def GenerateCall(
903 stmts_emitter, call_emitter, version, operation, argument_count): 1035 stmts_emitter, call_emitter, version, operation, argument_count):
904 overload_name = '_%s_%s' % (operation.id, version) 1036 overload_name = '_%s_%s' % (operation.id, version)
905 argument_list = ', '.join( 1037 return_type = self.SecureOutputType(operation.type.id)
906 [p.name for p in info.param_infos[:argument_count]]) 1038 actuals = info.ParametersAsListOfVariables(argument_count)
907 call_emitter.Emit('$NAME($ARGS)', NAME=overload_name, ARGS=argument_list) 1039 actuals_s = ", ".join(actuals)
908 1040 call_emitter.Emit('$NAME($ARGS)', NAME=overload_name, ARGS=actuals_s)
909 dart_declaration = '%s%s %s(%s)' % ( 1041 dart_declaration = '%s%s %s(%s)' % (
910 'static ' if operation.is_static else '', 1042 'static ' if operation.is_static else '',
911 self.SecureOutputType(operation.type.id), 1043 return_type,
912 overload_name, argument_list) 1044 overload_name, actuals_s)
913 is_custom = 'Custom' in operation.ext_attrs 1045 is_custom = 'Custom' in operation.ext_attrs
914 native_suffix = 'Callback' 1046 native_suffix = 'Callback'
915 auto_scope_setup = self._GenerateAutoSetupScope(overload_name, native_suff ix) 1047 auto_scope_setup = \
1048 self._GenerateAutoSetupScope(overload_name, native_suffix)
916 cpp_callback_name = self._GenerateNativeBinding( 1049 cpp_callback_name = self._GenerateNativeBinding(
917 overload_name, (0 if operation.is_static else 1) + argument_count, 1050 overload_name, (0 if operation.is_static else 1) + argument_count,
918 dart_declaration, 'Callback', is_custom, auto_scope_setup, 1051 dart_declaration, operation.is_static, return_type, actuals,
919 emit_metadata=False) 1052 'Callback', is_custom, auto_scope_setup, emit_metadata=False)
920 if not is_custom: 1053 if not is_custom:
921 self._GenerateOperationNativeCallback(operation, operation.arguments[:ar gument_count], cpp_callback_name, auto_scope_setup) 1054 self._GenerateOperationNativeCallback(operation,
1055 operation.arguments[:argument_count], cpp_callback_name,
1056 auto_scope_setup)
922 1057
923 self._GenerateDispatcherBody( 1058 self._GenerateDispatcherBody(
924 info, 1059 info,
925 operations, 1060 operations,
926 dart_declaration, 1061 dart_declaration,
927 GenerateCall, 1062 GenerateCall,
928 self._IsArgumentOptionalInWebCore) 1063 self._IsArgumentOptionalInWebCore)
929 1064
930 def SecondaryContext(self, interface): 1065 def SecondaryContext(self, interface):
931 pass 1066 pass
(...skipping 26 matching lines...) Expand all
958 auto_scope_setup=True, 1093 auto_scope_setup=True,
959 generate_custom_element_scope_if_needed=False): 1094 generate_custom_element_scope_if_needed=False):
960 1095
961 ext_attrs = node.ext_attrs 1096 ext_attrs = node.ext_attrs
962 1097
963 if self._IsStatic(node.id): 1098 if self._IsStatic(node.id):
964 needs_receiver = True 1099 needs_receiver = True
965 1100
966 cpp_arguments = [] 1101 cpp_arguments = []
967 runtime_check = None 1102 runtime_check = None
968 raises_exceptions = raises_dom_exception or arguments 1103 raises_exceptions = raises_dom_exception or arguments or needs_receiver
969 needs_custom_element_callbacks = False 1104 needs_custom_element_callbacks = False
970 1105
971 # TODO(antonm): unify with ScriptState below. 1106 # TODO(antonm): unify with ScriptState below.
972 requires_stack_info = (ext_attrs.get('CallWith') == 'ScriptArguments|ScriptS tate' or 1107 requires_stack_info = (ext_attrs.get('CallWith') == 'ScriptArguments|ScriptS tate' or
973 ext_attrs.get('ConstructorCallWith') == 'ScriptArgume nts|ScriptState' or 1108 ext_attrs.get('ConstructorCallWith') == 'ScriptArgume nts|ScriptState' or
974 ext_attrs.get('CallWith') == 'ScriptArguments&ScriptS tate' or 1109 ext_attrs.get('CallWith') == 'ScriptArguments&ScriptS tate' or
975 ext_attrs.get('ConstructorCallWith') == 'ScriptArgume nts&ScriptState') 1110 ext_attrs.get('ConstructorCallWith') == 'ScriptArgume nts&ScriptState')
976 if requires_stack_info: 1111 if requires_stack_info:
977 raises_exceptions = True 1112 raises_exceptions = True
978 cpp_arguments = ['&state', 'scriptArguments.release()'] 1113 cpp_arguments = ['&state', 'scriptArguments.release()']
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
1108 1243
1109 body_emitter.Emit( 1244 body_emitter.Emit(
1110 ' DOMWindow* domWindow = DartUtilities::domWindowForCurrentIsol ate();\n' 1245 ' DOMWindow* domWindow = DartUtilities::domWindowForCurrentIsol ate();\n'
1111 ' if (!domWindow) {\n' 1246 ' if (!domWindow) {\n'
1112 ' exception = Dart_NewStringFromCString("Failed to fetch do mWindow");\n' 1247 ' exception = Dart_NewStringFromCString("Failed to fetch do mWindow");\n'
1113 ' goto fail;\n' 1248 ' goto fail;\n'
1114 ' }\n' 1249 ' }\n'
1115 ' Document& document = *domWindow->document();\n') 1250 ' Document& document = *domWindow->document();\n')
1116 1251
1117 if needs_receiver: 1252 if needs_receiver:
1118 body_emitter.Emit( 1253 if dart_use_blink:
1119 ' $WEBCORE_CLASS_NAME* receiver = DartDOMWrapper::receiver< $WE BCORE_CLASS_NAME >(args);\n', 1254 body_emitter.Emit(
1120 WEBCORE_CLASS_NAME=self._interface_type_info.native_type()) 1255 ' $WEBCORE_CLASS_NAME* receiver = '
1256 'DartDOMWrapper::receiverChecked<Dart$INTERFACE>(args, exception);\n '
1257 ' if (exception)\n'
1258 ' goto fail;\n',
1259 WEBCORE_CLASS_NAME=self._interface_type_info.native_type(),
1260 INTERFACE=self._interface.id)
1261 else:
1262 body_emitter.Emit(
1263 ' $WEBCORE_CLASS_NAME* receiver = '
1264 'DartDOMWrapper::receiver< $WEBCORE_CLASS_NAME >(args);\n'
1265 ' if (exception)\n'
1266 ' goto fail;\n',
1267 WEBCORE_CLASS_NAME=self._interface_type_info.native_type())
1121 1268
1122 if requires_stack_info: 1269 if requires_stack_info:
1123 self._cpp_impl_includes.add('"ScriptArguments.h"') 1270 self._cpp_impl_includes.add('"ScriptArguments.h"')
1124 body_emitter.Emit( 1271 body_emitter.Emit(
1125 '\n' 1272 '\n'
1126 ' ScriptState* currentState = DartUtilities::currentScriptState ();\n' 1273 ' ScriptState* currentState = DartUtilities::currentScriptState ();\n'
1127 ' if (!currentState) {\n' 1274 ' if (!currentState) {\n'
1128 ' exception = Dart_NewStringFromCString("Failed to retrieve a script state");\n' 1275 ' exception = Dart_NewStringFromCString("Failed to retrieve a script state");\n'
1129 ' goto fail;\n' 1276 ' goto fail;\n'
1130 ' }\n' 1277 ' }\n'
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
1299 value_expression, 1446 value_expression,
1300 auto_scope_setup, 1447 auto_scope_setup,
1301 self._interface.id, 1448 self._interface.id,
1302 ext_attrs) 1449 ext_attrs)
1303 set_return_value = '%s' % (return_to_dart_conversion) 1450 set_return_value = '%s' % (return_to_dart_conversion)
1304 invocation_emitter.Emit( 1451 invocation_emitter.Emit(
1305 ' $RETURN_VALUE;\n', 1452 ' $RETURN_VALUE;\n',
1306 RETURN_VALUE=set_return_value) 1453 RETURN_VALUE=set_return_value)
1307 1454
1308 def _GenerateNativeBinding(self, idl_name, argument_count, dart_declaration, 1455 def _GenerateNativeBinding(self, idl_name, argument_count, dart_declaration,
1309 native_suffix, is_custom, auto_scope_setup=True, emit_metadata=True): 1456 static, return_type, parameters, native_suffix, is_custom,
1310 1457 auto_scope_setup=True, emit_metadata=True):
1311 metadata = [] 1458 metadata = []
1312 if emit_metadata: 1459 if emit_metadata:
1313 metadata = self._metadata.GetFormattedMetadata( 1460 metadata = self._metadata.GetFormattedMetadata(
1314 self._renamer.GetLibraryName(self._interface), 1461 self._renamer.GetLibraryName(self._interface),
1315 self._interface, idl_name, ' ') 1462 self._interface, idl_name, ' ')
1463 dart_native_name = \
1464 DeriveNativeName(self._interface.id, idl_name, native_suffix)
1465 native_binding = '%s_%s_%s' % (self._interface.id, idl_name, native_suffix)
1466 if dart_use_blink:
1467 if not static:
1468 formals = ", ".join(['mthis'] + parameters)
1469 actuals = ", ".join(['this'] + parameters)
1470 else:
1471 formals = ", ".join(parameters)
1472 actuals = ", ".join(parameters)
1316 1473
1317 native_binding = '%s_%s_%s' % (self._interface.id, idl_name, native_suffix) 1474 self._native_library_emitter.Emit(
1318 self._members_emitter.Emit( 1475 '\n'
1319 '\n' 1476 '$DART_NAME($FORMALS) native "$NATIVE_BINDING";\n',
1320 ' $METADATA$DART_DECLARATION native "$NATIVE_BINDING";\n', 1477 DART_NAME=dart_native_name,
1321 DOMINTERFACE=self._interface.id, 1478 FORMALS=formals,
1322 METADATA=metadata, 1479 NATIVE_BINDING=native_binding)
1323 DART_DECLARATION=dart_declaration,
1324 NATIVE_BINDING=native_binding)
1325 1480
1481 # We then emit a class method which calls out to the mangled toplevel
1482 # function. Eventually this will be replaced with a call to an
1483 # interceptor
1484 self._members_emitter.Emit(
1485 '\n'
1486 ' $METADATA$DART_DECLARATION => $DART_NAME($ACTUALS);\n',
1487 METADATA=metadata,
1488 DART_DECLARATION=dart_declaration,
1489 DART_NAME=DeriveQualifiedName(self._native_library_name,
1490 dart_native_name),
1491 ACTUALS=actuals)
1492 else:
1493 self._members_emitter.Emit(
1494 '\n'
1495 ' $METADATA$DART_DECLARATION native "$NATIVE_BINDING";\n',
1496 METADATA=metadata,
1497 DART_DECLARATION=dart_declaration,
1498 NATIVE_BINDING=native_binding)
1326 cpp_callback_name = '%s%s' % (idl_name, native_suffix) 1499 cpp_callback_name = '%s%s' % (idl_name, native_suffix)
1327 1500
1328 self._cpp_resolver_emitter.Emit( 1501 self._cpp_resolver_emitter.Emit(
1329 ' if (argumentCount == $ARGC && name == "$NATIVE_BINDING") {\n' 1502 ' if (argumentCount == $ARGC && name == "$NATIVE_BINDING") {\n'
1330 ' *autoSetupScope = $AUTO_SCOPE_SETUP;\n' 1503 ' *autoSetupScope = $AUTO_SCOPE_SETUP;\n'
1331 ' return Dart$(INTERFACE_NAME)Internal::$CPP_CALLBACK_NAME;\n' 1504 ' return Dart$(INTERFACE_NAME)Internal::$CPP_CALLBACK_NAME;\n'
1332 ' }\n', 1505 ' }\n',
1333 ARGC=argument_count, 1506 ARGC=argument_count,
1334 NATIVE_BINDING=native_binding, 1507 NATIVE_BINDING=native_binding,
1335 INTERFACE_NAME=self._interface.id, 1508 INTERFACE_NAME=self._interface.id,
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after
1584 e.Emit("};\n"); 1757 e.Emit("};\n");
1585 e.Emit('\n'); 1758 e.Emit('\n');
1586 e.Emit('} // namespace WebCore\n'); 1759 e.Emit('} // namespace WebCore\n');
1587 1760
1588 def _IsOptionalStringArgumentInInitEventMethod(interface, operation, argument): 1761 def _IsOptionalStringArgumentInInitEventMethod(interface, operation, argument):
1589 return ( 1762 return (
1590 interface.id.endswith('Event') and 1763 interface.id.endswith('Event') and
1591 operation.id.startswith('init') and 1764 operation.id.startswith('init') and
1592 argument.ext_attrs.get('Default') == 'Undefined' and 1765 argument.ext_attrs.get('Default') == 'Undefined' and
1593 argument.type.id == 'DOMString') 1766 argument.type.id == 'DOMString')
OLDNEW
« no previous file with comments | « tools/dom/scripts/systemhtml.py ('k') | tools/dom/scripts/templateloader_test.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698