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 |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
73 ' DartIsolateScope scope(m_callback.isolate());\n' | 73 ' DartIsolateScope scope(m_callback.isolate());\n' |
74 ' DartApiScope apiScope;\n' | 74 ' DartApiScope apiScope;\n' |
75 ' $ARGUMENTS_DECLARATION;\n' | 75 ' $ARGUMENTS_DECLARATION;\n' |
76 ' return m_callback.handleEvent($ARGUMENT_COUNT, arguments);\n' | 76 ' return m_callback.handleEvent($ARGUMENT_COUNT, arguments);\n' |
77 '}\n', | 77 '}\n', |
78 CLASS_NAME=class_name, | 78 CLASS_NAME=class_name, |
79 PARAMETERS=', '.join(parameters), | 79 PARAMETERS=', '.join(parameters), |
80 ARGUMENTS_DECLARATION=arguments_declaration, | 80 ARGUMENTS_DECLARATION=arguments_declaration, |
81 ARGUMENT_COUNT=len(arguments)) | 81 ARGUMENT_COUNT=len(arguments)) |
82 | 82 |
83 cpp_header_emitter = self._cpp_library_emitter.CreateHeaderEmitter( | 83 cpp_header_emitter = self._cpp_library_emitter.CreateHeaderEmitter(self._int
erface.id, True) |
84 self._interface.id, | |
85 self._renamer.GetLibraryName(self._interface), | |
86 True) | |
87 cpp_header_emitter.Emit( | 84 cpp_header_emitter.Emit( |
88 self._template_loader.Load('cpp_callback_header.template'), | 85 self._template_loader.Load('cpp_callback_header.template'), |
89 INTERFACE=self._interface.id, | 86 INTERFACE=self._interface.id, |
90 HANDLERS=cpp_header_handlers_emitter.Fragments()) | 87 HANDLERS=cpp_header_handlers_emitter.Fragments()) |
91 | 88 |
92 cpp_impl_emitter = self._cpp_library_emitter.CreateSourceEmitter(self._inter
face.id) | 89 cpp_impl_emitter = self._cpp_library_emitter.CreateSourceEmitter(self._inter
face.id) |
93 cpp_impl_emitter.Emit( | 90 cpp_impl_emitter.Emit( |
94 self._template_loader.Load('cpp_callback_implementation.template'), | 91 self._template_loader.Load('cpp_callback_implementation.template'), |
95 INCLUDES=self._GenerateCPPIncludes(cpp_impl_includes), | 92 INCLUDES=self._GenerateCPPIncludes(cpp_impl_includes), |
96 INTERFACE=self._interface.id, | 93 INTERFACE=self._interface.id, |
(...skipping 11 matching lines...) Expand all Loading... |
108 | 105 |
109 def RootClassName(self): | 106 def RootClassName(self): |
110 return 'NativeFieldWrapperClass1' | 107 return 'NativeFieldWrapperClass1' |
111 | 108 |
112 def NativeSpec(self): | 109 def NativeSpec(self): |
113 return '' | 110 return '' |
114 | 111 |
115 def StartInterface(self, memebers_emitter): | 112 def StartInterface(self, memebers_emitter): |
116 # Create emitters for c++ implementation. | 113 # Create emitters for c++ implementation. |
117 if not IsPureInterface(self._interface.id): | 114 if not IsPureInterface(self._interface.id): |
118 self._cpp_header_emitter = self._cpp_library_emitter.CreateHeaderEmitter( | 115 self._cpp_header_emitter = self._cpp_library_emitter.CreateHeaderEmitter(s
elf._interface.id) |
119 self._interface.id, | |
120 self._renamer.GetLibraryName(self._interface)) | |
121 self._cpp_impl_emitter = self._cpp_library_emitter.CreateSourceEmitter(sel
f._interface.id) | 116 self._cpp_impl_emitter = self._cpp_library_emitter.CreateSourceEmitter(sel
f._interface.id) |
122 else: | 117 else: |
123 self._cpp_header_emitter = emitter.Emitter() | 118 self._cpp_header_emitter = emitter.Emitter() |
124 self._cpp_impl_emitter = emitter.Emitter() | 119 self._cpp_impl_emitter = emitter.Emitter() |
125 | 120 |
126 self._interface_type_info = self._TypeInfo(self._interface.id) | 121 self._interface_type_info = self._TypeInfo(self._interface.id) |
127 self._members_emitter = memebers_emitter | 122 self._members_emitter = memebers_emitter |
128 self._cpp_declarations_emitter = emitter.Emitter() | 123 self._cpp_declarations_emitter = emitter.Emitter() |
129 self._cpp_impl_includes = set() | 124 self._cpp_impl_includes = set() |
130 self._cpp_definitions_emitter = emitter.Emitter() | 125 self._cpp_definitions_emitter = emitter.Emitter() |
(...skipping 729 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
860 return self._type_registry.TypeInfo(type_name) | 855 return self._type_registry.TypeInfo(type_name) |
861 | 856 |
862 def _DartType(self, type_name): | 857 def _DartType(self, type_name): |
863 return self._type_registry.DartType(type_name) | 858 return self._type_registry.DartType(type_name) |
864 | 859 |
865 | 860 |
866 class CPPLibraryEmitter(): | 861 class CPPLibraryEmitter(): |
867 def __init__(self, emitters, cpp_sources_dir): | 862 def __init__(self, emitters, cpp_sources_dir): |
868 self._emitters = emitters | 863 self._emitters = emitters |
869 self._cpp_sources_dir = cpp_sources_dir | 864 self._cpp_sources_dir = cpp_sources_dir |
870 self._library_headers = {} | 865 self._headers_list = [] |
871 self._sources_list = [] | 866 self._sources_list = [] |
872 | 867 |
873 def CreateHeaderEmitter(self, interface_name, library_name, is_callback=False)
: | 868 def CreateHeaderEmitter(self, interface_name, is_callback=False): |
874 path = os.path.join(self._cpp_sources_dir, 'Dart%s.h' % interface_name) | 869 path = os.path.join(self._cpp_sources_dir, 'Dart%s.h' % interface_name) |
875 if not is_callback: | 870 if not is_callback: |
876 self._library_headers.get(library_name, []).append(path) | 871 self._headers_list.append(path) |
877 return self._emitters.FileEmitter(path) | 872 return self._emitters.FileEmitter(path) |
878 | 873 |
879 def CreateSourceEmitter(self, interface_name): | 874 def CreateSourceEmitter(self, interface_name): |
880 path = os.path.join(self._cpp_sources_dir, 'Dart%s.cpp' % interface_name) | 875 path = os.path.join(self._cpp_sources_dir, 'Dart%s.cpp' % interface_name) |
881 self._sources_list.append(path) | 876 self._sources_list.append(path) |
882 return self._emitters.FileEmitter(path) | 877 return self._emitters.FileEmitter(path) |
883 | 878 |
884 def EmitDerivedSources(self, template, output_dir): | 879 def EmitDerivedSources(self, template, output_dir): |
885 partitions = 20 # FIXME: this should be configurable. | 880 partitions = 20 # FIXME: this should be configurable. |
886 sources_count = len(self._sources_list) | 881 sources_count = len(self._sources_list) |
887 for i in range(0, partitions): | 882 for i in range(0, partitions): |
888 file_path = os.path.join(output_dir, 'DartDerivedSources%02i.cpp' % (i + 1
)) | 883 file_path = os.path.join(output_dir, 'DartDerivedSources%02i.cpp' % (i + 1
)) |
889 includes_emitter = self._emitters.FileEmitter(file_path).Emit(template) | 884 includes_emitter = self._emitters.FileEmitter(file_path).Emit(template) |
890 for source_file in self._sources_list[i::partitions]: | 885 for source_file in self._sources_list[i::partitions]: |
891 path = os.path.relpath(source_file, output_dir) | 886 path = os.path.relpath(source_file, output_dir) |
892 includes_emitter.Emit('#include "$PATH"\n', PATH=path) | 887 includes_emitter.Emit('#include "$PATH"\n', PATH=path) |
893 | 888 |
894 def EmitResolver(self, template, output_dir): | 889 def EmitResolver(self, template, output_dir): |
895 for library_name in self._library_headers.keys(): | 890 file_path = os.path.join(output_dir, 'DartResolver.cpp') |
896 file_path = os.path.join(output_dir, '%s_DartResolver.cpp' % library_name) | 891 includes_emitter, body_emitter = self._emitters.FileEmitter(file_path).Emit(
template) |
897 includes_emitter, body_emitter = self._emitters.FileEmitter(file_path).Emi
t( | 892 for header_file in self._headers_list: |
898 template, | 893 path = os.path.relpath(header_file, output_dir) |
899 LIBRARY_NAME=library_name) | 894 includes_emitter.Emit('#include "$PATH"\n', PATH=path) |
900 | 895 body_emitter.Emit( |
901 headers = self._library_headers[library_name] | 896 ' if (Dart_NativeFunction func = $CLASS_NAME::resolver(name, argume
ntCount))\n' |
902 for header_file in headers: | 897 ' return func;\n', |
903 path = os.path.relpath(header_file, output_dir) | 898 CLASS_NAME=os.path.splitext(os.path.basename(path))[0]) |
904 includes_emitter.Emit('#include "$PATH"\n', PATH=path) | |
905 body_emitter.Emit( | |
906 ' if (Dart_NativeFunction func = $CLASS_NAME::resolver(name, argu
mentCount))\n' | |
907 ' return func;\n', | |
908 CLASS_NAME=os.path.splitext(os.path.basename(path))[0]) | |
OLD | NEW |