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 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
224 | 224 |
225 def FinishInterface(self): | 225 def FinishInterface(self): |
226 self._GenerateCPPHeader() | 226 self._GenerateCPPHeader() |
227 | 227 |
228 self._cpp_impl_emitter.Emit( | 228 self._cpp_impl_emitter.Emit( |
229 self._template_loader.Load('cpp_implementation.template'), | 229 self._template_loader.Load('cpp_implementation.template'), |
230 INTERFACE=self._interface.id, | 230 INTERFACE=self._interface.id, |
231 INCLUDES=self._GenerateCPPIncludes(self._cpp_impl_includes), | 231 INCLUDES=self._GenerateCPPIncludes(self._cpp_impl_includes), |
232 CALLBACKS=self._cpp_definitions_emitter.Fragments(), | 232 CALLBACKS=self._cpp_definitions_emitter.Fragments(), |
233 RESOLVER=self._cpp_resolver_emitter.Fragments(), | 233 RESOLVER=self._cpp_resolver_emitter.Fragments(), |
234 DART_IMPLEMENTATION_CLASS=self._interface_type_info.implementation_name(
)) | 234 DART_IMPLEMENTATION_CLASS=self._interface_type_info.implementation_name(
), |
| 235 DART_IMPLEMENTATION_LIBRARY='dart:%s' % self._renamer.GetLibraryName(sel
f._interface)) |
235 | 236 |
236 def _GenerateCPPHeader(self): | 237 def _GenerateCPPHeader(self): |
237 to_native_emitter = emitter.Emitter() | 238 to_native_emitter = emitter.Emitter() |
238 if self._interface_type_info.custom_to_native(): | 239 if self._interface_type_info.custom_to_native(): |
239 to_native_emitter.Emit( | 240 to_native_emitter.Emit( |
240 ' static PassRefPtr<NativeType> toNative(Dart_Handle handle, Dart_H
andle& exception);\n') | 241 ' static PassRefPtr<NativeType> toNative(Dart_Handle handle, Dart_H
andle& exception);\n') |
241 else: | 242 else: |
242 to_native_emitter.Emit( | 243 to_native_emitter.Emit( |
243 ' static NativeType* toNative(Dart_Handle handle, Dart_Handle& exce
ption)\n' | 244 ' static NativeType* toNative(Dart_Handle handle, Dart_Handle& exce
ption)\n' |
244 ' {\n' | 245 ' {\n' |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
378 # | 379 # |
379 # class YImpl extends ListBase<T> { copies of transitive XImpl methods; } | 380 # class YImpl extends ListBase<T> { copies of transitive XImpl methods; } |
380 # | 381 # |
381 dart_element_type = self._DartType(element_type) | 382 dart_element_type = self._DartType(element_type) |
382 if self._HasNativeIndexGetter(): | 383 if self._HasNativeIndexGetter(): |
383 self._EmitNativeIndexGetter(dart_element_type) | 384 self._EmitNativeIndexGetter(dart_element_type) |
384 else: | 385 else: |
385 self._members_emitter.Emit( | 386 self._members_emitter.Emit( |
386 '\n' | 387 '\n' |
387 ' $TYPE operator[](int index) native "$(INTERFACE)_item_Callback";\n'
, | 388 ' $TYPE operator[](int index) native "$(INTERFACE)_item_Callback";\n'
, |
388 TYPE=self.SecureOutputType(element_type), | 389 TYPE=self.SecureOutputType(element_type), |
389 INTERFACE=self._interface.id) | 390 INTERFACE=self._interface.id) |
390 | 391 |
391 if self._HasNativeIndexSetter(): | 392 if self._HasNativeIndexSetter(): |
392 self._EmitNativeIndexSetter(dart_element_type) | 393 self._EmitNativeIndexSetter(dart_element_type) |
393 else: | 394 else: |
394 # The HTML library implementation of NodeList has a custom indexed setter | 395 # The HTML library implementation of NodeList has a custom indexed setter |
395 # implementation that uses the parent node the NodeList is associated | 396 # implementation that uses the parent node the NodeList is associated |
396 # with if one is available. | 397 # with if one is available. |
397 if self._interface.id != 'NodeList': | 398 if self._interface.id != 'NodeList': |
398 self._members_emitter.Emit( | 399 self._members_emitter.Emit( |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
508 template = ' $CALL;\n' | 509 template = ' $CALL;\n' |
509 | 510 |
510 overload_name = '%s_%s' % (operation.id, version[0]) | 511 overload_name = '%s_%s' % (operation.id, version[0]) |
511 version[0] += 1 | 512 version[0] += 1 |
512 argument_list = ', '.join(argument_names[:argument_count]) | 513 argument_list = ', '.join(argument_names[:argument_count]) |
513 call = '_%s(%s)' % (overload_name, argument_list) | 514 call = '_%s(%s)' % (overload_name, argument_list) |
514 body.Emit(template, CHECKS=' && '.join(checks), CALL=call) | 515 body.Emit(template, CHECKS=' && '.join(checks), CALL=call) |
515 | 516 |
516 dart_declaration = '%s%s _%s(%s)' % ( | 517 dart_declaration = '%s%s _%s(%s)' % ( |
517 'static ' if operation.is_static else '', | 518 'static ' if operation.is_static else '', |
518 self.SecureOutputType(operation.type.id), | 519 self.SecureOutputType(operation.type.id), |
519 overload_name, argument_list) | 520 overload_name, argument_list) |
520 cpp_callback_name = self._GenerateNativeBinding( | 521 cpp_callback_name = self._GenerateNativeBinding( |
521 overload_name, (0 if operation.is_static else 1) + argument_count, | 522 overload_name, (0 if operation.is_static else 1) + argument_count, |
522 dart_declaration, 'Callback', False) | 523 dart_declaration, 'Callback', False) |
523 self._GenerateOperationNativeCallback(operation, operation.arguments[:argu
ment_count], cpp_callback_name) | 524 self._GenerateOperationNativeCallback(operation, operation.arguments[:argu
ment_count], cpp_callback_name) |
524 | 525 |
525 def GenerateChecksAndCall(operation, argument_count): | 526 def GenerateChecksAndCall(operation, argument_count): |
526 checks = [] | 527 checks = [] |
527 for i in range(0, argument_count): | 528 for i in range(0, argument_count): |
528 argument = operation.arguments[i] | 529 argument = operation.arguments[i] |
(...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
888 def EmitResolver(self, template, output_dir): | 889 def EmitResolver(self, template, output_dir): |
889 file_path = os.path.join(output_dir, 'DartResolver.cpp') | 890 file_path = os.path.join(output_dir, 'DartResolver.cpp') |
890 includes_emitter, body_emitter = self._emitters.FileEmitter(file_path).Emit(
template) | 891 includes_emitter, body_emitter = self._emitters.FileEmitter(file_path).Emit(
template) |
891 for header_file in self._headers_list: | 892 for header_file in self._headers_list: |
892 path = os.path.relpath(header_file, output_dir) | 893 path = os.path.relpath(header_file, output_dir) |
893 includes_emitter.Emit('#include "$PATH"\n', PATH=path) | 894 includes_emitter.Emit('#include "$PATH"\n', PATH=path) |
894 body_emitter.Emit( | 895 body_emitter.Emit( |
895 ' if (Dart_NativeFunction func = $CLASS_NAME::resolver(name, argume
ntCount))\n' | 896 ' if (Dart_NativeFunction func = $CLASS_NAME::resolver(name, argume
ntCount))\n' |
896 ' return func;\n', | 897 ' return func;\n', |
897 CLASS_NAME=os.path.splitext(os.path.basename(path))[0]) | 898 CLASS_NAME=os.path.splitext(os.path.basename(path))[0]) |
OLD | NEW |