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 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
52 self._emitters.FileEmitter(cpp_impl_path), | 52 self._emitters.FileEmitter(cpp_impl_path), |
53 self._BaseDefines(interface), | 53 self._BaseDefines(interface), |
54 self._templates) | 54 self._templates) |
55 | 55 |
56 def ProcessCallback(self, interface, info): | 56 def ProcessCallback(self, interface, info): |
57 self._interface = interface | 57 self._interface = interface |
58 | 58 |
59 dart_interface_path = self._FilePathForDartInterface(self._interface.id) | 59 dart_interface_path = self._FilePathForDartInterface(self._interface.id) |
60 self._dom_public_files.append(dart_interface_path) | 60 self._dom_public_files.append(dart_interface_path) |
61 | 61 |
62 cpp_impl_includes = {} | |
62 cpp_header_handlers_emitter = emitter.Emitter() | 63 cpp_header_handlers_emitter = emitter.Emitter() |
63 cpp_impl_handlers_emitter = emitter.Emitter() | 64 cpp_impl_handlers_emitter = emitter.Emitter() |
64 class_name = 'Dart%s' % self._interface.id | 65 class_name = 'Dart%s' % self._interface.id |
65 for operation in interface.operations: | 66 for operation in interface.operations: |
66 if operation.type.id == 'void': | 67 if operation.type.id == 'void': |
67 return_type = 'void' | 68 return_type = 'void' |
68 return_prefix = '' | 69 return_prefix = '' |
69 else: | 70 else: |
70 return_type = 'bool' | 71 return_type = 'bool' |
71 return_prefix = 'return ' | 72 return_prefix = 'return ' |
72 | 73 |
73 parameters = [] | 74 parameters = [] |
74 arguments = [] | 75 arguments = [] |
75 for argument in operation.arguments: | 76 for argument in operation.arguments: |
76 argument_type_info = GetIDLTypeInfo(argument.type) | 77 argument_type_info = GetIDLTypeInfo(argument.type) |
77 parameters.append('%s %s' % (argument_type_info.parameter_type(), | 78 parameters.append('%s %s' % (argument_type_info.parameter_type(), |
78 argument.id)) | 79 argument.id)) |
79 arguments.append(argument.id) | 80 arguments.append(argument.id) |
81 if argument_type_info.conversion_include(): | |
82 cpp_impl_includes[argument_type_info.conversion_include()] = 1 | |
antonm
2012/03/01 14:25:31
why it's map? should we assign 1 or None?
podivilov
2012/03/01 15:36:56
Done.
| |
80 | 83 |
81 cpp_header_handlers_emitter.Emit( | 84 cpp_header_handlers_emitter.Emit( |
82 '\n' | 85 '\n' |
83 ' virtual $TYPE handleEvent($PARAMETERS);\n', | 86 ' virtual $TYPE handleEvent($PARAMETERS);\n', |
84 TYPE=return_type, PARAMETERS=', '.join(parameters)) | 87 TYPE=return_type, PARAMETERS=', '.join(parameters)) |
85 | 88 |
86 cpp_impl_handlers_emitter.Emit( | 89 cpp_impl_handlers_emitter.Emit( |
87 '\n' | 90 '\n' |
88 '$TYPE $CLASS_NAME::handleEvent($PARAMETERS)\n' | 91 '$TYPE $CLASS_NAME::handleEvent($PARAMETERS)\n' |
89 '{\n' | 92 '{\n' |
(...skipping 10 matching lines...) Expand all Loading... | |
100 cpp_header_emitter.Emit( | 103 cpp_header_emitter.Emit( |
101 self._templates.Load('cpp_callback_header.template'), | 104 self._templates.Load('cpp_callback_header.template'), |
102 INTERFACE=self._interface.id, | 105 INTERFACE=self._interface.id, |
103 HANDLERS=cpp_header_handlers_emitter.Fragments()) | 106 HANDLERS=cpp_header_handlers_emitter.Fragments()) |
104 | 107 |
105 cpp_impl_path = self._FilePathForCppImplementation(self._interface.id) | 108 cpp_impl_path = self._FilePathForCppImplementation(self._interface.id) |
106 self._cpp_impl_files.append(cpp_impl_path) | 109 self._cpp_impl_files.append(cpp_impl_path) |
107 cpp_impl_emitter = self._emitters.FileEmitter(cpp_impl_path) | 110 cpp_impl_emitter = self._emitters.FileEmitter(cpp_impl_path) |
108 cpp_impl_emitter.Emit( | 111 cpp_impl_emitter.Emit( |
109 self._templates.Load('cpp_callback_implementation.template'), | 112 self._templates.Load('cpp_callback_implementation.template'), |
113 INCLUDES=_GenerateCPPIncludes(cpp_impl_includes.keys()), | |
110 INTERFACE=self._interface.id, | 114 INTERFACE=self._interface.id, |
111 HANDLERS=cpp_impl_handlers_emitter.Fragments()) | 115 HANDLERS=cpp_impl_handlers_emitter.Fragments()) |
112 | 116 |
113 def GenerateLibraries(self, lib_dir): | 117 def GenerateLibraries(self, lib_dir): |
114 auxiliary_dir = os.path.relpath(self._auxiliary_dir, self._output_dir) | 118 auxiliary_dir = os.path.relpath(self._auxiliary_dir, self._output_dir) |
115 | 119 |
116 # Generate dom_public.dart. | 120 # Generate dom_public.dart. |
117 self._GenerateLibFile( | 121 self._GenerateLibFile( |
118 'dom_public.darttemplate', | 122 'dom_public.darttemplate', |
119 os.path.join(self._output_dir, 'dom_public.dart'), | 123 os.path.join(self._output_dir, 'dom_public.dart'), |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
153 ' if (Dart_NativeFunction func = $CLASS_NAME::resolver(name, argume ntCount))\n' | 157 ' if (Dart_NativeFunction func = $CLASS_NAME::resolver(name, argume ntCount))\n' |
154 ' return func;\n', | 158 ' return func;\n', |
155 CLASS_NAME=os.path.splitext(os.path.basename(path))[0]) | 159 CLASS_NAME=os.path.splitext(os.path.basename(path))[0]) |
156 | 160 |
157 cpp_resolver_emitter = self._emitters.FileEmitter(cpp_resolver_path) | 161 cpp_resolver_emitter = self._emitters.FileEmitter(cpp_resolver_path) |
158 cpp_resolver_emitter.Emit( | 162 cpp_resolver_emitter.Emit( |
159 self._templates.Load('cpp_resolver.template'), | 163 self._templates.Load('cpp_resolver.template'), |
160 INCLUDES=includes_emitter.Fragments(), | 164 INCLUDES=includes_emitter.Fragments(), |
161 RESOLVER_BODY=resolver_body_emitter.Fragments()) | 165 RESOLVER_BODY=resolver_body_emitter.Fragments()) |
162 | 166 |
163 # Generate DartDerivedSourcesAll.cpp | 167 # Generate DartDerivedSourcesXX.cpp. |
164 cpp_all_in_one_path = os.path.join(self._output_dir, | 168 partitions = 20 # FIXME: this should be configurable. |
165 'DartDerivedSourcesAll.cpp') | 169 sources_count = len(self._cpp_impl_files) |
170 for i in range(0, partitions): | |
171 cpp_all_in_one_path = os.path.join(self._output_dir, | |
antonm
2012/03/01 14:25:31
cpp_all_in_one is now misleading
| |
172 'DartDerivedSources%02i.cpp' % (i + 1)) | |
166 | 173 |
167 includes_emitter = emitter.Emitter() | 174 includes_emitter = emitter.Emitter() |
168 for file in self._cpp_impl_files: | 175 for j in range(i * sources_count / partitions, (i + 1) * sources_count / p artitions): |
antonm
2012/03/01 14:25:31
for impl_file in self._cpp_impl_files[i * sources_
podivilov
2012/03/01 15:36:56
nice!
| |
169 path = os.path.relpath(file, os.path.dirname(cpp_all_in_one_path)) | 176 path = os.path.relpath(self._cpp_impl_files[j], os.path.dirname(cpp_al l_in_one_path)) |
170 includes_emitter.Emit('#include "$PATH"\n', PATH=path) | 177 includes_emitter.Emit('#include "$PATH"\n', PATH=path) |
171 | 178 |
172 cpp_all_in_one_emitter = self._emitters.FileEmitter(cpp_all_in_one_path) | 179 cpp_all_in_one_emitter = self._emitters.FileEmitter(cpp_all_in_one_path) |
173 cpp_all_in_one_emitter.Emit( | 180 cpp_all_in_one_emitter.Emit( |
174 self._templates.Load('cpp_all_in_one.template'), | 181 self._templates.Load('cpp_all_in_one.template'), |
175 INCLUDES=includes_emitter.Fragments()) | 182 INCLUDES=includes_emitter.Fragments()) |
176 | 183 |
177 # Generate DartResolver.cpp | 184 # Generate DartResolver.cpp. |
178 cpp_resolver_path = os.path.join(self._output_dir, 'DartResolver.cpp') | 185 cpp_resolver_path = os.path.join(self._output_dir, 'DartResolver.cpp') |
179 | 186 |
180 includes_emitter = emitter.Emitter() | 187 includes_emitter = emitter.Emitter() |
181 resolver_body_emitter = emitter.Emitter() | 188 resolver_body_emitter = emitter.Emitter() |
182 for file in self._cpp_header_files: | 189 for file in self._cpp_header_files: |
183 path = os.path.relpath(file, os.path.dirname(cpp_resolver_path)) | 190 path = os.path.relpath(file, os.path.dirname(cpp_resolver_path)) |
184 includes_emitter.Emit('#include "$PATH"\n', PATH=path) | 191 includes_emitter.Emit('#include "$PATH"\n', PATH=path) |
185 resolver_body_emitter.Emit( | 192 resolver_body_emitter.Emit( |
186 ' if (Dart_NativeFunction func = $CLASS_NAME::resolver(name, argu mentCount))\n' | 193 ' if (Dart_NativeFunction func = $CLASS_NAME::resolver(name, argu mentCount))\n' |
187 ' return func;\n', | 194 ' return func;\n', |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
281 create_function = 'create' | 288 create_function = 'create' |
282 if 'NamedConstructor' in self._interface.ext_attrs: | 289 if 'NamedConstructor' in self._interface.ext_attrs: |
283 raises_dart_exceptions = True | 290 raises_dart_exceptions = True |
284 parameter_definitions_emitter.Emit( | 291 parameter_definitions_emitter.Emit( |
285 ' DOMWindow* domWindow = DartUtilities::domWindowForCurrentIs olate();\n' | 292 ' DOMWindow* domWindow = DartUtilities::domWindowForCurrentIs olate();\n' |
286 ' if (!domWindow) {\n' | 293 ' if (!domWindow) {\n' |
287 ' exception = Dart_NewString("Failed to fetch domWindow") ;\n' | 294 ' exception = Dart_NewString("Failed to fetch domWindow") ;\n' |
288 ' goto fail;\n' | 295 ' goto fail;\n' |
289 ' }\n' | 296 ' }\n' |
290 ' Document* document = domWindow->document();\n') | 297 ' Document* document = domWindow->document();\n') |
298 self._cpp_impl_includes['DOMWindow'] = 1 | |
291 arguments.append('document') | 299 arguments.append('document') |
292 create_function = 'createForJSConstructor' | 300 create_function = 'createForJSConstructor' |
293 if 'CallWith' in self._interface.ext_attrs: | 301 if 'CallWith' in self._interface.ext_attrs: |
294 call_with = self._interface.ext_attrs['CallWith'] | 302 call_with = self._interface.ext_attrs['CallWith'] |
295 if call_with == 'ScriptExecutionContext': | 303 if call_with == 'ScriptExecutionContext': |
296 raises_dart_exceptions = True | 304 raises_dart_exceptions = True |
297 parameter_definitions_emitter.Emit( | 305 parameter_definitions_emitter.Emit( |
298 ' ScriptExecutionContext* context = DartUtilities::scriptExec utionContext();\n' | 306 ' ScriptExecutionContext* context = DartUtilities::scriptExec utionContext();\n' |
299 ' if (!context) {\n' | 307 ' if (!context) {\n' |
300 ' exception = Dart_NewString("Failed to create an object" );\n' | 308 ' exception = Dart_NewString("Failed to create an object" );\n' |
(...skipping 28 matching lines...) Expand all Loading... | |
329 self._dart_impl_emitter.Emit( | 337 self._dart_impl_emitter.Emit( |
330 self._templates.Load('dart_implementation.darttemplate'), | 338 self._templates.Load('dart_implementation.darttemplate'), |
331 CLASS=self._class_name, BASE=base, INTERFACE=self._interface.id, | 339 CLASS=self._class_name, BASE=base, INTERFACE=self._interface.id, |
332 MEMBERS=self._members_emitter.Fragments()) | 340 MEMBERS=self._members_emitter.Fragments()) |
333 | 341 |
334 self._GenerateCppHeader() | 342 self._GenerateCppHeader() |
335 | 343 |
336 self._cpp_impl_emitter.Emit( | 344 self._cpp_impl_emitter.Emit( |
337 self._templates.Load('cpp_implementation.template'), | 345 self._templates.Load('cpp_implementation.template'), |
338 INTERFACE=self._interface.id, | 346 INTERFACE=self._interface.id, |
339 INCLUDES=''.join(['#include "%s.h"\n' % | 347 INCLUDES=_GenerateCPPIncludes(self._cpp_impl_includes.keys()), |
340 k for k in self._cpp_impl_includes.keys()]), | |
341 CALLBACKS=self._cpp_definitions_emitter.Fragments(), | 348 CALLBACKS=self._cpp_definitions_emitter.Fragments(), |
342 RESOLVER=self._cpp_resolver_emitter.Fragments()) | 349 RESOLVER=self._cpp_resolver_emitter.Fragments()) |
343 | 350 |
344 def _GenerateCppHeader(self): | 351 def _GenerateCppHeader(self): |
345 webcore_include = self._interface_type_info.webcore_include() | 352 webcore_includes = _GenerateCPPIncludes(self._interface_type_info.webcore_in cludes()) |
346 if webcore_include: | |
347 webcore_include = '#include "%s.h"\n' % webcore_include | |
348 else: | |
349 webcore_include = '' | |
350 | 353 |
351 if ('CustomToJS' in self._interface.ext_attrs or | 354 if ('CustomToJS' in self._interface.ext_attrs or |
352 'CustomToJSObject' in self._interface.ext_attrs or | 355 'CustomToJSObject' in self._interface.ext_attrs or |
353 'PureInterface' in self._interface.ext_attrs or | 356 'PureInterface' in self._interface.ext_attrs or |
354 'CPPPureInterface' in self._interface.ext_attrs or | 357 'CPPPureInterface' in self._interface.ext_attrs or |
355 self._interface_type_info.custom_to_dart()): | 358 self._interface_type_info.custom_to_dart()): |
356 to_dart_value_template = ( | 359 to_dart_value_template = ( |
357 'Dart_Handle toDartValue($(WEBCORE_CLASS_NAME)* value);\n') | 360 'Dart_Handle toDartValue($(WEBCORE_CLASS_NAME)* value);\n') |
358 else: | 361 else: |
359 to_dart_value_template = ( | 362 to_dart_value_template = ( |
360 'inline Dart_Handle toDartValue($(WEBCORE_CLASS_NAME)* value)\n' | 363 'inline Dart_Handle toDartValue($(WEBCORE_CLASS_NAME)* value)\n' |
361 '{\n' | 364 '{\n' |
362 ' return DartDOMWrapper::toDart<Dart$(INTERFACE)>(value);\n' | 365 ' return DartDOMWrapper::toDart<Dart$(INTERFACE)>(value);\n' |
363 '}\n') | 366 '}\n') |
364 to_dart_value_emitter = emitter.Emitter() | 367 to_dart_value_emitter = emitter.Emitter() |
365 to_dart_value_emitter.Emit( | 368 to_dart_value_emitter.Emit( |
366 to_dart_value_template, | 369 to_dart_value_template, |
367 INTERFACE=self._interface.id, | 370 INTERFACE=self._interface.id, |
368 WEBCORE_CLASS_NAME=self._interface_type_info.native_type()) | 371 WEBCORE_CLASS_NAME=self._interface_type_info.native_type()) |
369 | 372 |
370 self._cpp_header_emitter.Emit( | 373 self._cpp_header_emitter.Emit( |
371 self._templates.Load('cpp_header.template'), | 374 self._templates.Load('cpp_header.template'), |
372 INTERFACE=self._interface.id, | 375 INTERFACE=self._interface.id, |
373 WEBCORE_INCLUDE=webcore_include, | 376 WEBCORE_INCLUDES=webcore_includes, |
374 ADDITIONAL_INCLUDES='', | |
375 WEBCORE_CLASS_NAME=self._interface_type_info.native_type(), | 377 WEBCORE_CLASS_NAME=self._interface_type_info.native_type(), |
376 TO_DART_VALUE=to_dart_value_emitter.Fragments(), | 378 TO_DART_VALUE=to_dart_value_emitter.Fragments(), |
377 DECLARATIONS=self._cpp_declarations_emitter.Fragments()) | 379 DECLARATIONS=self._cpp_declarations_emitter.Fragments()) |
378 | 380 |
379 def AddAttribute(self, getter, setter): | 381 def AddAttribute(self, getter, setter): |
380 # FIXME: Dartium does not support attribute event listeners. However, JS | 382 # FIXME: Dartium does not support attribute event listeners. However, JS |
381 # implementation falls back to them when addEventListener is not available. | 383 # implementation falls back to them when addEventListener is not available. |
382 # Make sure addEventListener is available in all EventTargets and remove | 384 # Make sure addEventListener is available in all EventTargets and remove |
383 # this check. | 385 # this check. |
384 if (getter or setter).type.id == 'EventListener': | 386 if (getter or setter).type.id == 'EventListener': |
(...skipping 398 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
783 ' goto fail;\n' | 785 ' goto fail;\n' |
784 ' }\n', | 786 ' }\n', |
785 INVOCATION=invocation_template) | 787 INVOCATION=invocation_template) |
786 | 788 |
787 if 'ImplementedBy' in attributes: | 789 if 'ImplementedBy' in attributes: |
788 arguments.insert(0, 'receiver') | 790 arguments.insert(0, 'receiver') |
789 self._cpp_impl_includes[attributes['ImplementedBy']] = 1 | 791 self._cpp_impl_includes[attributes['ImplementedBy']] = 1 |
790 | 792 |
791 return emitter.Format(invocation_template, | 793 return emitter.Format(invocation_template, |
792 FUNCTION_CALL='%s(%s)' % (function_expression, ', '.join(arguments))) | 794 FUNCTION_CALL='%s(%s)' % (function_expression, ', '.join(arguments))) |
795 | |
796 def _GenerateCPPIncludes(includes): | |
797 return ''.join(['#include "%s.h"\n' % i for i in includes]) | |
antonm
2012/03/01 14:25:31
nit: i is usually for index :)
podivilov
2012/03/01 15:36:56
Done.
| |
OLD | NEW |