Chromium Code Reviews| 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 |
| 11 import systemwrapping | 11 import systemwrapping |
| 12 from generator import * | 12 from generator import * |
| 13 from systembase import * | 13 from systembase import * |
| 14 | 14 |
| 15 | |
| 16 _cpp_keywords = set(['default', 'operator']) | |
| 17 | |
| 18 def CppSafeName(name): | |
| 19 """Returns version of name safe for use in cpp code, i.e. not a keyword.""" | |
| 20 if name in _cpp_keywords: | |
| 21 return '_' + name | |
| 22 return name | |
| 23 | |
| 24 class NativeImplementationSystem(System): | 15 class NativeImplementationSystem(System): |
| 25 | 16 |
| 26 def __init__(self, templates, database, emitters, auxiliary_dir, output_dir): | 17 def __init__(self, templates, database, emitters, auxiliary_dir, output_dir): |
| 27 super(NativeImplementationSystem, self).__init__( | 18 super(NativeImplementationSystem, self).__init__( |
| 28 templates, database, emitters, output_dir) | 19 templates, database, emitters, output_dir) |
| 29 | 20 |
| 30 self._auxiliary_dir = auxiliary_dir | 21 self._auxiliary_dir = auxiliary_dir |
| 31 self._dom_public_files = [] | 22 self._dom_public_files = [] |
| 32 self._dom_impl_files = [] | 23 self._dom_impl_files = [] |
| 33 self._cpp_header_files = [] | 24 self._cpp_header_files = [] |
| (...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 282 ' if (!context) {\n' | 273 ' if (!context) {\n' |
| 283 ' exception = Dart_NewString("Failed to create an object" );\n' | 274 ' exception = Dart_NewString("Failed to create an object" );\n' |
| 284 ' goto fail;\n' | 275 ' goto fail;\n' |
| 285 ' }\n') | 276 ' }\n') |
| 286 arguments.append('context') | 277 arguments.append('context') |
| 287 else: | 278 else: |
| 288 raise Exception('Unsupported CallWith=%s attribute' % call_with) | 279 raise Exception('Unsupported CallWith=%s attribute' % call_with) |
| 289 | 280 |
| 290 # Process constructor arguments. | 281 # Process constructor arguments. |
| 291 for (i, arg) in enumerate(constructor_info.idl_args): | 282 for (i, arg) in enumerate(constructor_info.idl_args): |
| 292 cpp_arg_name = CppSafeName(arg.id) | 283 self._GenerateParameterAdapter(parameter_definitions_emitter, arg, i - 1) |
|
podivilov
2012/03/13 12:48:13
c++ keywords are never used as parameter names in
| |
| 293 self._GenerateParameterAdapter( | 284 arguments.append(arg.id) |
| 294 parameter_definitions_emitter, arg, cpp_arg_name, i - 1) | |
| 295 arguments.append(cpp_arg_name) | |
| 296 | 285 |
| 297 function_expression = '%s::%s' % (self._interface_type_info.native_type(), c reate_function) | 286 function_expression = '%s::%s' % (self._interface_type_info.native_type(), c reate_function) |
| 298 invocation = self._GenerateWebCoreInvocation(function_expression, arguments, | 287 invocation = self._GenerateWebCoreInvocation(function_expression, arguments, |
| 299 self._interface.id, self._interface.ext_attrs, raises_dom_exceptions) | 288 self._interface.id, self._interface.ext_attrs, raises_dom_exceptions) |
| 300 self._GenerateNativeCallback(callback_name='constructorCallback', | 289 self._GenerateNativeCallback(callback_name='constructorCallback', |
| 301 parameter_definitions=parameter_definitions_emitter.Fragments(), | 290 parameter_definitions=parameter_definitions_emitter.Fragments(), |
| 302 needs_receiver=False, invocation=invocation, | 291 needs_receiver=False, invocation=invocation, |
| 303 raises_exceptions=raises_dart_exceptions) | 292 raises_exceptions=raises_dart_exceptions) |
| 304 | 293 |
| 305 def _ImplClassName(self, interface_name): | 294 def _ImplClassName(self, interface_name): |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 395 arguments = [] | 384 arguments = [] |
| 396 if 'Reflect' in attr.ext_attrs: | 385 if 'Reflect' in attr.ext_attrs: |
| 397 webcore_function_name = GetIDLTypeInfo(attr.type.id).webcore_getter_name() | 386 webcore_function_name = GetIDLTypeInfo(attr.type.id).webcore_getter_name() |
| 398 if 'URL' in attr.ext_attrs: | 387 if 'URL' in attr.ext_attrs: |
| 399 if 'NonEmpty' in attr.ext_attrs: | 388 if 'NonEmpty' in attr.ext_attrs: |
| 400 webcore_function_name = 'getNonEmptyURLAttribute' | 389 webcore_function_name = 'getNonEmptyURLAttribute' |
| 401 else: | 390 else: |
| 402 webcore_function_name = 'getURLAttribute' | 391 webcore_function_name = 'getURLAttribute' |
| 403 arguments.append(self._GenerateWebCoreReflectionAttributeName(attr)) | 392 arguments.append(self._GenerateWebCoreReflectionAttributeName(attr)) |
| 404 else: | 393 else: |
| 405 webcore_function_name = CppSafeName(attr.id) | 394 if attr.id == 'operator': |
|
podivilov
2012/03/13 12:48:13
operator -> _operator rename is rather just a spec
| |
| 406 if attr.id == 'target' and attr.type.id == 'SVGAnimatedString': | 395 webcore_function_name = '_operator' |
| 396 elif attr.id == 'target' and attr.type.id == 'SVGAnimatedString': | |
| 407 webcore_function_name = 'svgTarget' | 397 webcore_function_name = 'svgTarget' |
| 408 else: | 398 else: |
| 409 webcore_function_name = re.sub(r'^(HTML|URL|JS|XML|XSLT|\w)', | 399 webcore_function_name = re.sub(r'^(HTML|URL|JS|XML|XSLT|\w)', |
| 410 lambda s: s.group(1).lower(), | 400 lambda s: s.group(1).lower(), |
| 411 webcore_function_name) | 401 attr.id) |
| 412 webcore_function_name = re.sub(r'^(create|exclusive)', | 402 webcore_function_name = re.sub(r'^(create|exclusive)', |
| 413 lambda s: 'is' + s.group(1).capitalize(), | 403 lambda s: 'is' + s.group(1).capitalize(), |
| 414 webcore_function_name) | 404 webcore_function_name) |
| 415 if attr.type.id.startswith('SVGAnimated'): | 405 if attr.type.id.startswith('SVGAnimated'): |
| 416 webcore_function_name += 'Animated' | 406 webcore_function_name += 'Animated' |
| 417 | 407 |
| 418 function_expression = self._GenerateWebCoreFunctionExpression(webcore_functi on_name, attr) | 408 function_expression = self._GenerateWebCoreFunctionExpression(webcore_functi on_name, attr) |
| 419 invocation = self._GenerateWebCoreInvocation(function_expression, | 409 invocation = self._GenerateWebCoreInvocation(function_expression, |
| 420 arguments, attr.type.id, attr.ext_attrs, attr.get_raises) | 410 arguments, attr.type.id, attr.ext_attrs, attr.get_raises) |
| 421 self._GenerateNativeCallback(cpp_callback_name, '', True, invocation, | 411 self._GenerateNativeCallback(cpp_callback_name, '', True, invocation, |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 436 webcore_function_name = GetIDLTypeInfo(attr.type.id).webcore_setter_name() | 426 webcore_function_name = GetIDLTypeInfo(attr.type.id).webcore_setter_name() |
| 437 arguments.append(self._GenerateWebCoreReflectionAttributeName(attr)) | 427 arguments.append(self._GenerateWebCoreReflectionAttributeName(attr)) |
| 438 else: | 428 else: |
| 439 webcore_function_name = re.sub(r'^(xml(?=[A-Z])|\w)', | 429 webcore_function_name = re.sub(r'^(xml(?=[A-Z])|\w)', |
| 440 lambda s: s.group(1).upper(), | 430 lambda s: s.group(1).upper(), |
| 441 attr.id) | 431 attr.id) |
| 442 webcore_function_name = 'set%s' % webcore_function_name | 432 webcore_function_name = 'set%s' % webcore_function_name |
| 443 if attr.type.id.startswith('SVGAnimated'): | 433 if attr.type.id.startswith('SVGAnimated'): |
| 444 webcore_function_name += 'Animated' | 434 webcore_function_name += 'Animated' |
| 445 | 435 |
| 446 cpp_arg_name = CppSafeName(attr.id) | 436 arguments.append('value') |
| 447 arguments.append(cpp_arg_name) | |
| 448 | 437 |
| 449 parameter_definitions_emitter = emitter.Emitter() | 438 parameter_definitions_emitter = emitter.Emitter() |
| 450 self._GenerateParameterAdapter( | 439 self._GenerateParameterAdapter( |
| 451 parameter_definitions_emitter, attr, cpp_arg_name, 0) | 440 parameter_definitions_emitter, attr, 0, adapter_name='value') |
| 452 parameter_definitions = parameter_definitions_emitter.Fragments() | 441 parameter_definitions = parameter_definitions_emitter.Fragments() |
| 453 | 442 |
| 454 function_expression = self._GenerateWebCoreFunctionExpression(webcore_functi on_name, attr) | 443 function_expression = self._GenerateWebCoreFunctionExpression(webcore_functi on_name, attr) |
| 455 invocation = self._GenerateWebCoreInvocation(function_expression, | 444 invocation = self._GenerateWebCoreInvocation(function_expression, |
| 456 arguments, 'void', attr.ext_attrs, attr.set_raises) | 445 arguments, 'void', attr.ext_attrs, attr.set_raises) |
| 457 | 446 |
| 458 self._GenerateNativeCallback(cpp_callback_name, parameter_definitions, | 447 self._GenerateNativeCallback(cpp_callback_name, parameter_definitions, |
| 459 True, invocation, raises_exceptions=True) | 448 True, invocation, raises_exceptions=True) |
| 460 | 449 |
| 461 def _HasNativeIndexGetter(self, interface): | 450 def _HasNativeIndexGetter(self, interface): |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 584 arguments.extend(['scriptArguments', 'scriptCallStack']) | 573 arguments.extend(['scriptArguments', 'scriptCallStack']) |
| 585 | 574 |
| 586 # Process Dart arguments. | 575 # Process Dart arguments. |
| 587 for (i, argument) in enumerate(operation.arguments): | 576 for (i, argument) in enumerate(operation.arguments): |
| 588 if (i == len(operation.arguments) - 1 and | 577 if (i == len(operation.arguments) - 1 and |
| 589 self._interface.id == 'Console' and | 578 self._interface.id == 'Console' and |
| 590 argument.id == 'arg'): | 579 argument.id == 'arg'): |
| 591 # FIXME: we are skipping last argument here because it was added in | 580 # FIXME: we are skipping last argument here because it was added in |
| 592 # supplemental dart.idl. Cleanup dart.idl and remove this check. | 581 # supplemental dart.idl. Cleanup dart.idl and remove this check. |
| 593 break | 582 break |
| 594 cpp_arg_name = CppSafeName(argument.id) | 583 self._GenerateParameterAdapter(parameter_definitions_emitter, argument, i) |
|
podivilov
2012/03/13 12:48:13
ditto.
| |
| 595 self._GenerateParameterAdapter( | 584 arguments.append(argument.id) |
| 596 parameter_definitions_emitter, argument, cpp_arg_name, i) | |
| 597 arguments.append(cpp_arg_name) | |
| 598 | 585 |
| 599 if operation.id in ['addEventListener', 'removeEventListener']: | 586 if operation.id in ['addEventListener', 'removeEventListener']: |
| 600 # addEventListener's and removeEventListener's last argument is marked | 587 # addEventListener's and removeEventListener's last argument is marked |
| 601 # as optional in idl, but is not optional in webcore implementation. | 588 # as optional in idl, but is not optional in webcore implementation. |
| 602 if len(operation.arguments) == 2: | 589 if len(operation.arguments) == 2: |
| 603 arguments.append('false') | 590 arguments.append('false') |
| 604 | 591 |
| 605 if self._interface.id == 'CSSStyleDeclaration' and operation.id == 'setPrope rty': | 592 if self._interface.id == 'CSSStyleDeclaration' and operation.id == 'setPrope rty': |
| 606 # CSSStyleDeclaration.setProperty priority parameter is optional in Dart | 593 # CSSStyleDeclaration.setProperty priority parameter is optional in Dart |
| 607 # idl, but is not optional in webcore implementation. | 594 # idl, but is not optional in webcore implementation. |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 651 self._cpp_definitions_emitter.Emit( | 638 self._cpp_definitions_emitter.Emit( |
| 652 '\n' | 639 '\n' |
| 653 'static void $CALLBACK_NAME(Dart_NativeArguments args)\n' | 640 'static void $CALLBACK_NAME(Dart_NativeArguments args)\n' |
| 654 '{\n' | 641 '{\n' |
| 655 ' DartApiScope dartApiScope;\n' | 642 ' DartApiScope dartApiScope;\n' |
| 656 '$BODY' | 643 '$BODY' |
| 657 '}\n', | 644 '}\n', |
| 658 CALLBACK_NAME=callback_name, | 645 CALLBACK_NAME=callback_name, |
| 659 BODY=body) | 646 BODY=body) |
| 660 | 647 |
| 661 def _GenerateParameterAdapter(self, emitter, idl_node, name, index): | 648 def _GenerateParameterAdapter(self, emitter, idl_node, index, |
| 649 adapter_name=None): | |
| 662 """idl_node is IDLArgument or IDLAttribute.""" | 650 """idl_node is IDLArgument or IDLAttribute.""" |
| 663 type_info = GetIDLTypeInfo(idl_node.type.id) | 651 type_info = GetIDLTypeInfo(idl_node.type.id) |
| 664 (adapter_type, include_name) = type_info.parameter_adapter_info() | 652 (adapter_type, include_name) = type_info.parameter_adapter_info() |
| 665 if include_name: | 653 if include_name: |
| 666 self._cpp_impl_includes.add(include_name) | 654 self._cpp_impl_includes.add(include_name) |
| 667 flags = '' | 655 flags = '' |
| 668 if (idl_node.ext_attrs.get('Optional') == 'DefaultIsNullString' or | 656 if (idl_node.ext_attrs.get('Optional') == 'DefaultIsNullString' or |
| 669 'RequiredCppParameter' in idl_node.ext_attrs): | 657 'RequiredCppParameter' in idl_node.ext_attrs): |
| 670 flags = ', DartUtilities::ConvertNullToDefaultValue' | 658 flags = ', DartUtilities::ConvertNullToDefaultValue' |
| 671 emitter.Emit( | 659 emitter.Emit( |
| 672 '\n' | 660 '\n' |
| 673 ' const $ADAPTER_TYPE $NAME(Dart_GetNativeArgument(args, $INDEX)$ FLAGS);\n' | 661 ' const $ADAPTER_TYPE $NAME(Dart_GetNativeArgument(args, $INDEX)$ FLAGS);\n' |
| 674 ' if (!$NAME.conversionSuccessful()) {\n' | 662 ' if (!$NAME.conversionSuccessful()) {\n' |
| 675 ' exception = $NAME.exception();\n' | 663 ' exception = $NAME.exception();\n' |
| 676 ' goto fail;\n' | 664 ' goto fail;\n' |
| 677 ' }\n', | 665 ' }\n', |
| 678 ADAPTER_TYPE=adapter_type, | 666 ADAPTER_TYPE=adapter_type, |
| 679 NAME=name, | 667 NAME=adapter_name or idl_node.id, |
| 680 INDEX=index + 1, | 668 INDEX=index + 1, |
| 681 FLAGS=flags) | 669 FLAGS=flags) |
| 682 | 670 |
| 683 def _GenerateNativeBinding(self, idl_name, argument_count, dart_declaration, | 671 def _GenerateNativeBinding(self, idl_name, argument_count, dart_declaration, |
| 684 native_suffix, is_custom): | 672 native_suffix, is_custom): |
| 685 native_binding = '%s_%s_%s' % (self._interface.id, idl_name, native_suffix) | 673 native_binding = '%s_%s_%s' % (self._interface.id, idl_name, native_suffix) |
| 686 self._members_emitter.Emit( | 674 self._members_emitter.Emit( |
| 687 '\n' | 675 '\n' |
| 688 ' $DART_DECLARATION native "$NATIVE_BINDING";\n', | 676 ' $DART_DECLARATION native "$NATIVE_BINDING";\n', |
| 689 DART_DECLARATION=dart_declaration, NATIVE_BINDING=native_binding) | 677 DART_DECLARATION=dart_declaration, NATIVE_BINDING=native_binding) |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 773 | 761 |
| 774 if 'ImplementedBy' in attributes: | 762 if 'ImplementedBy' in attributes: |
| 775 arguments.insert(0, 'receiver') | 763 arguments.insert(0, 'receiver') |
| 776 self._cpp_impl_includes.add(attributes['ImplementedBy']) | 764 self._cpp_impl_includes.add(attributes['ImplementedBy']) |
| 777 | 765 |
| 778 return emitter.Format(invocation_template, | 766 return emitter.Format(invocation_template, |
| 779 FUNCTION_CALL='%s(%s)' % (function_expression, ', '.join(arguments))) | 767 FUNCTION_CALL='%s(%s)' % (function_expression, ', '.join(arguments))) |
| 780 | 768 |
| 781 def _GenerateCPPIncludes(includes): | 769 def _GenerateCPPIncludes(includes): |
| 782 return ''.join(['#include "%s.h"\n' % include for include in includes]) | 770 return ''.join(['#include "%s.h"\n' % include for include in includes]) |
| OLD | NEW |