OLD | NEW |
1 #!/usr/bin/python | 1 #!/usr/bin/python |
2 # Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 2 # Copyright (c) 2011, 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 import copy | 6 import copy |
7 import database | 7 import database |
8 import logging | 8 import logging |
9 import monitored | 9 import monitored |
10 import multiprocessing | 10 import multiprocessing |
(...skipping 543 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
554 return [match.groups() for match in implements_matches] | 554 return [match.groups() for match in implements_matches] |
555 | 555 |
556 # Compile the IDL file with the Blink compiler and remember each AST for the | 556 # Compile the IDL file with the Blink compiler and remember each AST for the |
557 # IDL. | 557 # IDL. |
558 def _blink_compile_idl_files(self, file_paths, import_options, is_dart_idl): | 558 def _blink_compile_idl_files(self, file_paths, import_options, is_dart_idl): |
559 if not(is_dart_idl): | 559 if not(is_dart_idl): |
560 start_time = time.time() | 560 start_time = time.time() |
561 | 561 |
562 # 2-stage computation: individual, then overall | 562 # 2-stage computation: individual, then overall |
563 for file_path in file_paths: | 563 for file_path in file_paths: |
564 compute_info_individual(file_path, 'dart') | 564 compute_info_individual(file_path) |
565 info_individuals = [info_individual()] | 565 info_individuals = [info_individual()] |
566 compute_interfaces_info_overall(info_individuals) | 566 compute_interfaces_info_overall(info_individuals) |
567 | 567 |
568 end_time = time.time() | 568 end_time = time.time() |
569 print 'Compute dependencies %s seconds' % round((end_time - start_time), 2
) | 569 print 'Compute dependencies %s seconds' % round((end_time - start_time), 2
) |
570 else: | 570 else: |
571 # Compute the interface_info for dart.idl for implements defined. This | 571 # Compute the interface_info for dart.idl for implements defined. This |
572 # file is special in that more than one interface can exist in this file. | 572 # file is special in that more than one interface can exist in this file. |
573 implement_pairs = self._compute_dart_idl_implements(file_paths[0]) | 573 implement_pairs = self._compute_dart_idl_implements(file_paths[0]) |
574 | 574 |
575 interfaces_info['__dart_idl___'] = { | 575 interfaces_info['__dart_idl___'] = { |
576 'implement_pairs': implement_pairs, | 576 'implement_pairs': implement_pairs, |
577 } | 577 } |
578 | 578 |
579 # Parse the IDL files serially. | 579 # Parse the IDL files serially. |
580 start_time = time.time() | 580 start_time = time.time() |
581 | 581 |
582 for file_path in file_paths: | 582 for file_path in file_paths: |
583 file_path = os.path.normpath(file_path) | 583 file_path = os.path.normpath(file_path) |
584 ast = _compile_idl_file(self.build, file_path, import_options) | 584 ast = _compile_idl_file(self.build, file_path, import_options) |
585 self._process_ast(os.path.splitext(os.path.basename(file_path))[0], ast) | 585 self._process_ast(os.path.splitext(os.path.basename(file_path))[0], ast) |
586 | 586 |
587 end_time = time.time() | 587 end_time = time.time() |
588 print 'Compiled %s IDL files in %s seconds' % (len(file_paths), | 588 print 'Compiled %s IDL files in %s seconds' % (len(file_paths), |
589 round((end_time - start_time),
2)) | 589 round((end_time - start_time),
2)) |
590 | 590 |
591 def _process_ast(self, filename, ast): | 591 def _process_ast(self, filename, ast): |
| 592 if len(ast) == 1: |
| 593 ast = ast.values()[0] |
| 594 else: |
| 595 print 'ERROR: Processing AST: ' + os.path.basename(file_name) |
592 new_asts[filename] = ast | 596 new_asts[filename] = ast |
593 | 597 |
594 def import_idl_files(self, file_paths, import_options, is_dart_idl): | 598 def import_idl_files(self, file_paths, import_options, is_dart_idl): |
595 self._blink_compile_idl_files(file_paths, import_options, is_dart_idl) | 599 self._blink_compile_idl_files(file_paths, import_options, is_dart_idl) |
596 | 600 |
597 start_time = time.time() | 601 start_time = time.time() |
598 | 602 |
599 # Parse the IDL files in serial. | 603 # Parse the IDL files in serial. |
600 for file_path in file_paths: | 604 for file_path in file_paths: |
601 file_path = os.path.normpath(file_path) | 605 file_path = os.path.normpath(file_path) |
(...skipping 21 matching lines...) Expand all Loading... |
623 % (interface.id, import_options.source)) | 627 % (interface.id, import_options.source)) |
624 continue | 628 continue |
625 | 629 |
626 _logger.info('importing interface %s (source=%s file=%s)' | 630 _logger.info('importing interface %s (source=%s file=%s)' |
627 % (interface.id, import_options.source, os.path.basename(idl_file.filena
me))) | 631 % (interface.id, import_options.source, os.path.basename(idl_file.filena
me))) |
628 | 632 |
629 interface.attributes = filter(enabled, interface.attributes) | 633 interface.attributes = filter(enabled, interface.attributes) |
630 interface.operations = filter(enabled, interface.operations) | 634 interface.operations = filter(enabled, interface.operations) |
631 self._imported_interfaces.append((interface, import_options)) | 635 self._imported_interfaces.append((interface, import_options)) |
632 | 636 |
633 for implStmt in idl_file.implementsStatements: | 637 # If an IDL dictionary then there is no implementsStatements. |
634 self._impl_stmts.append((implStmt, import_options)) | 638 if hasattr(idl_file, 'implementsStatements'): |
| 639 for implStmt in idl_file.implementsStatements: |
| 640 self._impl_stmts.append((implStmt, import_options)) |
635 | 641 |
636 for enum in idl_file.enums: | 642 for enum in idl_file.enums: |
637 self._database.AddEnum(enum) | 643 self._database.AddEnum(enum) |
638 | 644 |
| 645 for dictionary in idl_file.dictionaries: |
| 646 self._database.AddDictionary(dictionary) |
| 647 |
639 | 648 |
640 def _is_node_enabled(self, node, idl_defines): | 649 def _is_node_enabled(self, node, idl_defines): |
641 if not 'Conditional' in node.ext_attrs: | 650 if not 'Conditional' in node.ext_attrs: |
642 return True | 651 return True |
643 | 652 |
644 def enabled(condition): | 653 def enabled(condition): |
645 return 'ENABLE_%s' % condition in idl_defines | 654 return 'ENABLE_%s' % condition in idl_defines |
646 | 655 |
647 conditional = node.ext_attrs['Conditional'] | 656 conditional = node.ext_attrs['Conditional'] |
648 if conditional.find('&') != -1: | 657 if conditional.find('&') != -1: |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
723 for name, value in annotation.items(): | 732 for name, value in annotation.items(): |
724 if (name in top_level_annotation | 733 if (name in top_level_annotation |
725 and value == top_level_annotation[name]): | 734 and value == top_level_annotation[name]): |
726 del annotation[name] | 735 del annotation[name] |
727 | 736 |
728 map(normalize, interface.parents) | 737 map(normalize, interface.parents) |
729 map(normalize, interface.constants) | 738 map(normalize, interface.constants) |
730 map(normalize, interface.attributes) | 739 map(normalize, interface.attributes) |
731 map(normalize, interface.operations) | 740 map(normalize, interface.operations) |
732 | 741 |
| 742 def map_dictionaries(self): |
| 743 """Changes the type of operations/constructors arguments from an IDL |
| 744 dictionary to a Dictionary. The IDL dictionary is just an enums of |
| 745 strings which are checked at run-time.""" |
| 746 def dictionary_to_map(type_node): |
| 747 if self._database.HasDictionary(type_node.id): |
| 748 type_node.dictionary = type_node.id |
| 749 type_node.id = 'Dictionary' |
| 750 |
| 751 def all_types(node): |
| 752 map(dictionary_to_map, node.all(IDLType)) |
| 753 |
| 754 for interface in self._database.GetInterfaces(): |
| 755 map(all_types, interface.all(IDLExtAttrFunctionValue)) |
| 756 map(all_types, interface.operations) |
| 757 |
733 def fetch_constructor_data(self, options): | 758 def fetch_constructor_data(self, options): |
734 window_interface = self._database.GetInterface('Window') | 759 window_interface = self._database.GetInterface('Window') |
735 for attr in window_interface.attributes: | 760 for attr in window_interface.attributes: |
736 type = attr.type.id | 761 type = attr.type.id |
737 if not type.endswith('Constructor'): | 762 if not type.endswith('Constructor'): |
738 continue | 763 continue |
739 type = re.sub('(Constructor)+$', '', type) | 764 type = re.sub('(Constructor)+$', '', type) |
740 # TODO(antonm): Ideally we'd like to have pristine copy of WebKit IDLs and
fetch | 765 # TODO(antonm): Ideally we'd like to have pristine copy of WebKit IDLs and
fetch |
741 # this information directly from it. Unfortunately right now database is
massaged | 766 # this information directly from it. Unfortunately right now database is
massaged |
742 # a lot so it's difficult to maintain necessary information on Window itse
lf. | 767 # a lot so it's difficult to maintain necessary information on Window itse
lf. |
743 interface = self._database.GetInterface(type) | 768 interface = self._database.GetInterface(type) |
744 if 'V8EnabledPerContext' in attr.ext_attrs: | 769 if 'V8EnabledPerContext' in attr.ext_attrs: |
745 interface.ext_attrs['synthesizedV8EnabledPerContext'] = \ | 770 interface.ext_attrs['synthesizedV8EnabledPerContext'] = \ |
746 attr.ext_attrs['V8EnabledPerContext'] | 771 attr.ext_attrs['V8EnabledPerContext'] |
747 if 'V8EnabledAtRuntime' in attr.ext_attrs: | 772 if 'V8EnabledAtRuntime' in attr.ext_attrs: |
748 interface.ext_attrs['synthesizedV8EnabledAtRuntime'] = \ | 773 interface.ext_attrs['synthesizedV8EnabledAtRuntime'] = \ |
749 attr.ext_attrs['V8EnabledAtRuntime'] or attr.id | 774 attr.ext_attrs['V8EnabledAtRuntime'] or attr.id |
OLD | NEW |