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 generates Dart APIs from the IDL database.""" | 6 """This module generates Dart APIs from the IDL database.""" |
7 | 7 |
8 import emitter | 8 import emitter |
9 import idlnode | 9 import idlnode |
10 import logging | 10 import logging |
(...skipping 2687 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2698 def StartInterface(self): | 2698 def StartInterface(self): |
2699 self._class_name = self._ImplClassName(self._interface.id) | 2699 self._class_name = self._ImplClassName(self._interface.id) |
2700 self._interface_type_info = GetIDLTypeInfoByName(self._interface.id) | 2700 self._interface_type_info = GetIDLTypeInfoByName(self._interface.id) |
2701 self._members_emitter = emitter.Emitter() | 2701 self._members_emitter = emitter.Emitter() |
2702 self._cpp_declarations_emitter = emitter.Emitter() | 2702 self._cpp_declarations_emitter = emitter.Emitter() |
2703 self._cpp_impl_includes = {} | 2703 self._cpp_impl_includes = {} |
2704 self._cpp_definitions_emitter = emitter.Emitter() | 2704 self._cpp_definitions_emitter = emitter.Emitter() |
2705 self._cpp_resolver_emitter = emitter.Emitter() | 2705 self._cpp_resolver_emitter = emitter.Emitter() |
2706 | 2706 |
2707 # Generate constructor. | 2707 # Generate constructor. |
2708 # FIXME: add proper support for non-custom constructors. | 2708 # WebKit IDLs may define constructors with arguments. Currently this form i s not supported |
2709 if ('CustomConstructor' in self._interface.ext_attrs or | 2709 # (see b/1721). There is custom implementation for some of them, the rest a re just ignored |
2710 'V8CustomConstructor' in self._interface.ext_attrs or | 2710 # for now. |
2711 self._interface.id in ['FileReader', 'WebKitCSSMatrix', 'XSLTProcessor'] ): | 2711 SUPPORTED_CONSTRUCTORS_WITH_ARGS = [ 'WebKitCSSMatrix' ] |
2712 UNSUPPORTED_CONSTRUCTORS_WITH_ARGS = [ | |
2713 'EventSource', | |
2714 'MediaStream', | |
2715 'PeerConnection', | |
2716 'ShadowRoot', | |
2717 'SharedWorker', | |
2718 'TextTrackCue', | |
2719 'Worker' ] | |
2720 if self._IsConstructable() and self._interface.id not in UNSUPPORTED_CONSTRU CTORS_WITH_ARGS: | |
podivilov
2012/02/17 17:47:20
Please use early return.
| |
2712 self._cpp_resolver_emitter.Emit( | 2721 self._cpp_resolver_emitter.Emit( |
2713 ' if (name == "$(INTERFACE_NAME)_constructor_Callback")\n' | 2722 ' if (name == "$(INTERFACE_NAME)_constructor_Callback")\n' |
2714 ' return Dart$(INTERFACE_NAME)Internal::constructorCallback;\n' , | 2723 ' return Dart$(INTERFACE_NAME)Internal::constructorCallback;\n' , |
2715 INTERFACE_NAME=self._interface.id) | 2724 INTERFACE_NAME=self._interface.id) |
2716 self._cpp_declarations_emitter.Emit( | 2725 |
2717 '\n' | 2726 if self._interface.id not in SUPPORTED_CONSTRUCTORS_WITH_ARGS and 'Constru ctor' in self._interface.ext_attrs: |
podivilov
2012/02/17 17:47:20
Early return as well: if custom, just emit declara
| |
2718 'void constructorCallback(Dart_NativeArguments);\n') | 2727 raises_dom_exceptions = 'ConstructorRaisesException' in self._interface. ext_attrs |
2728 raises_dart_exceptions = raises_dom_exceptions | |
2729 type_info = GetIDLTypeInfo(self._interface) | |
2730 arguments = [] | |
2731 parameter_definitions = '' | |
2732 if 'CallWith' in self._interface.ext_attrs: | |
2733 call_with = self._interface.ext_attrs['CallWith'] | |
2734 if call_with == 'ScriptExecutionContext': | |
2735 raises_dart_exceptions = True | |
2736 parameter_definitions = ( | |
2737 ' ScriptExecutionContext* context = DartUtilities::script ExecutionContext();\n' | |
2738 ' if (!context) {\n' | |
2739 ' exception = Dart_NewString("Failed to create an obj ect");\n' | |
2740 ' goto fail;\n' | |
2741 ' }\n') | |
2742 arguments = ['context'] | |
2743 else: | |
2744 raise Exception('Unsupported CallWith=%s attribute' % call_with) | |
2745 | |
2746 self._GenerateNativeCallbackBase( | |
2747 callback_name='constructorCallback', | |
2748 idl_node=self._interface, | |
2749 parameter_definitions=parameter_definitions, | |
2750 function_name='%s::create' % type_info.native_type(), | |
2751 arguments=arguments, | |
2752 idl_return_type=self._interface, | |
2753 raises_dart_exceptions=raises_dart_exceptions, | |
2754 raises_dom_exceptions=raises_dom_exceptions, | |
2755 needs_receiver=False) | |
2756 else: | |
2757 self._cpp_declarations_emitter.Emit( | |
2758 '\n' | |
2759 'void constructorCallback(Dart_NativeArguments);\n') | |
2760 | |
2719 | 2761 |
2720 def _ImplClassName(self, interface_name): | 2762 def _ImplClassName(self, interface_name): |
2721 return interface_name + 'Implementation' | 2763 return interface_name + 'Implementation' |
2722 | 2764 |
2765 def _IsConstructable(self): | |
2766 # FIXME: support ConstructorTemplate. | |
2767 return set(['CustomConstructor', 'V8CustomConstructor', 'Constructor']) & se t(self._interface.ext_attrs) | |
2768 | |
2723 def FinishInterface(self): | 2769 def FinishInterface(self): |
2724 base = self._BaseClassName(self._interface) | 2770 base = self._BaseClassName(self._interface) |
2725 self._dart_impl_emitter.Emit( | 2771 self._dart_impl_emitter.Emit( |
2726 self._templates.Load('dart_implementation.darttemplate'), | 2772 self._templates.Load('dart_implementation.darttemplate'), |
2727 CLASS=self._class_name, BASE=base, INTERFACE=self._interface.id, | 2773 CLASS=self._class_name, BASE=base, INTERFACE=self._interface.id, |
2728 MEMBERS=self._members_emitter.Fragments()) | 2774 MEMBERS=self._members_emitter.Fragments()) |
2729 | 2775 |
2730 self._GenerateCppHeader() | 2776 self._GenerateCppHeader() |
2731 | 2777 |
2732 self._cpp_impl_emitter.Emit( | 2778 self._cpp_impl_emitter.Emit( |
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3028 parameter_definitions = parameter_definitions_emitter.Fragments() | 3074 parameter_definitions = parameter_definitions_emitter.Fragments() |
3029 self._GenerateNativeCallback(cpp_callback_name, operation, | 3075 self._GenerateNativeCallback(cpp_callback_name, operation, |
3030 parameter_definitions, webcore_function_name, arguments, | 3076 parameter_definitions, webcore_function_name, arguments, |
3031 idl_return_type=operation.type, | 3077 idl_return_type=operation.type, |
3032 raises_dart_exceptions=raises_dart_exceptions, | 3078 raises_dart_exceptions=raises_dart_exceptions, |
3033 raises_dom_exceptions=operation.raises) | 3079 raises_dom_exceptions=operation.raises) |
3034 | 3080 |
3035 def _GenerateNativeCallback(self, callback_name, idl_node, | 3081 def _GenerateNativeCallback(self, callback_name, idl_node, |
3036 parameter_definitions, function_name, arguments, idl_return_type, | 3082 parameter_definitions, function_name, arguments, idl_return_type, |
3037 raises_dart_exceptions, raises_dom_exceptions): | 3083 raises_dart_exceptions, raises_dom_exceptions): |
3038 receiver = self._interface_type_info.receiver() | 3084 self._GenerateNativeCallbackBase( |
podivilov
2012/02/17 17:47:20
I think such trampolines make the code messy. Coul
| |
3085 callback_name=callback_name, | |
3086 idl_node=idl_node, | |
3087 parameter_definitions=parameter_definitions, | |
3088 function_name=self._interface_type_info.receiver() + function_name, | |
3089 arguments=arguments, | |
3090 idl_return_type=idl_return_type, | |
3091 raises_dart_exceptions=raises_dart_exceptions, | |
3092 raises_dom_exceptions=raises_dom_exceptions, | |
3093 needs_receiver=True) | |
3094 | |
3095 def _GenerateNativeCallbackBase(self, callback_name, idl_node, | |
3096 parameter_definitions, function_name, arguments, idl_return_type, | |
3097 raises_dart_exceptions, raises_dom_exceptions, needs_receiver): | |
3039 if raises_dom_exceptions: | 3098 if raises_dom_exceptions: |
3040 arguments.append('ec') | 3099 arguments.append('ec') |
3041 callback = '%s%s(%s)' % (receiver, function_name, ', '.join(arguments)) | 3100 callback = '%s(%s)' % (function_name, ', '.join(arguments)) |
podivilov
2012/02/17 17:47:20
Could you please replace "function_name, arguments
| |
3042 | 3101 |
3043 nested_templates = [] | 3102 nested_templates = [] |
3044 if idl_return_type and idl_return_type.id != 'void': | 3103 if idl_return_type and idl_return_type.id != 'void': |
3045 return_type_info = GetIDLTypeInfo(idl_return_type) | 3104 return_type_info = GetIDLTypeInfo(idl_return_type) |
3046 conversion_cast = return_type_info.conversion_cast('$BODY') | 3105 conversion_cast = return_type_info.conversion_cast('$BODY') |
3047 if isinstance(return_type_info, SVGTearOffIDLTypeInfo): | 3106 if isinstance(return_type_info, SVGTearOffIDLTypeInfo): |
3048 svg_primitive_types = ['SVGAngle', 'SVGLength', 'SVGMatrix', | 3107 svg_primitive_types = ['SVGAngle', 'SVGLength', 'SVGMatrix', |
3049 'SVGNumber', 'SVGPoint', 'SVGRect', 'SVGTransform'] | 3108 'SVGNumber', 'SVGPoint', 'SVGRect', 'SVGTransform'] |
3050 conversion_cast = '%s::create($BODY)' | 3109 conversion_cast = '%s::create($BODY)' |
3051 if self._interface.id.startswith('SVGAnimated'): | 3110 if self._interface.id.startswith('SVGAnimated'): |
(...skipping 25 matching lines...) Expand all Loading... | |
3077 nested_templates.append( | 3136 nested_templates.append( |
3078 ' ExceptionCode ec = 0;\n' | 3137 ' ExceptionCode ec = 0;\n' |
3079 '$BODY' | 3138 '$BODY' |
3080 ' if (UNLIKELY(ec)) {\n' | 3139 ' if (UNLIKELY(ec)) {\n' |
3081 ' exception = DartDOMWrapper::exceptionCodeToDartException( ec);\n' | 3140 ' exception = DartDOMWrapper::exceptionCodeToDartException( ec);\n' |
3082 ' goto fail;\n' | 3141 ' goto fail;\n' |
3083 ' }\n') | 3142 ' }\n') |
3084 | 3143 |
3085 nested_templates.append( | 3144 nested_templates.append( |
3086 ' {\n' | 3145 ' {\n' |
3087 ' $WEBCORE_CLASS_NAME* receiver = DartDOMWrapper::receiver< $WEBC ORE_CLASS_NAME >(args);\n' | |
3088 '$PARAMETER_DEFINITIONS' | 3146 '$PARAMETER_DEFINITIONS' |
3089 '\n' | |
3090 '$BODY' | 3147 '$BODY' |
3091 ' return;\n' | 3148 ' return;\n' |
3092 ' }\n') | 3149 ' }\n') |
3093 | 3150 |
3094 if raises_dart_exceptions: | 3151 if raises_dart_exceptions: |
3095 nested_templates.append( | 3152 nested_templates.append( |
3096 ' Dart_Handle exception;\n' | 3153 ' Dart_Handle exception;\n' |
3097 '$BODY' | 3154 '$BODY' |
3098 '\n' | 3155 '\n' |
3099 'fail:\n' | 3156 'fail:\n' |
3100 ' Dart_ThrowException(exception);\n' | 3157 ' Dart_ThrowException(exception);\n' |
3101 ' ASSERT_NOT_REACHED();\n') | 3158 ' ASSERT_NOT_REACHED();\n') |
3102 | 3159 |
3103 nested_templates.append( | 3160 nested_templates.append( |
3104 '\n' | 3161 '\n' |
3105 'static void $CALLBACK_NAME(Dart_NativeArguments args)\n' | 3162 'static void $CALLBACK_NAME(Dart_NativeArguments args)\n' |
3106 '{\n' | 3163 '{\n' |
3107 ' DartApiScope dartApiScope;\n' | 3164 ' DartApiScope dartApiScope;\n' |
3108 '$BODY' | 3165 '$BODY' |
3109 '}\n') | 3166 '}\n') |
3110 | 3167 |
3111 template_parameters = { | 3168 template_parameters = { |
3112 'CALLBACK_NAME': callback_name, | 3169 'CALLBACK_NAME': callback_name, |
3113 'WEBCORE_CLASS_NAME': self._interface_type_info.native_type(), | 3170 'WEBCORE_CLASS_NAME': self._interface_type_info.native_type(), |
3114 'PARAMETER_DEFINITIONS': parameter_definitions, | 3171 'PARAMETER_DEFINITIONS': parameter_definitions, |
3115 } | 3172 } |
3173 if needs_receiver: | |
3174 template_parameters['PARAMETER_DEFINITIONS'] = emitter.Format( | |
3175 ' $WEBCORE_CLASS_NAME* receiver = DartDOMWrapper::receiver< $WE BCORE_CLASS_NAME >(args);\n' | |
3176 ' $PARAMETER_DEFINITIONS\n', | |
3177 **template_parameters) | |
3178 | |
3116 for template in nested_templates: | 3179 for template in nested_templates: |
3117 template_parameters['BODY'] = callback | 3180 template_parameters['BODY'] = callback |
3118 callback_emitter = emitter.Emitter() | 3181 callback = emitter.Format(template, **template_parameters) |
3119 callback_emitter.Emit(template, **template_parameters) | |
3120 callback = ''.join(callback_emitter.Fragments()) | |
3121 | 3182 |
3122 self._cpp_definitions_emitter.Emit(callback) | 3183 self._cpp_definitions_emitter.Emit(callback) |
3123 | 3184 |
3124 def _GenerateParameterAdapter(self, emitter, idl_argument, index): | 3185 def _GenerateParameterAdapter(self, emitter, idl_argument, index): |
3125 type_info = GetIDLTypeInfo(idl_argument.type) | 3186 type_info = GetIDLTypeInfo(idl_argument.type) |
3126 (adapter_type, include_name) = type_info.parameter_adapter_info() | 3187 (adapter_type, include_name) = type_info.parameter_adapter_info() |
3127 if include_name: | 3188 if include_name: |
3128 self._cpp_impl_includes[include_name] = 1 | 3189 self._cpp_impl_includes[include_name] = 1 |
3129 emitter.Emit( | 3190 emitter.Emit( |
3130 '\n' | 3191 '\n' |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3166 namespace = 'HTMLNames' | 3227 namespace = 'HTMLNames' |
3167 svg_exceptions = ['class', 'id', 'onabort', 'onclick', 'onerror', 'onload', | 3228 svg_exceptions = ['class', 'id', 'onabort', 'onclick', 'onerror', 'onload', |
3168 'onmousedown', 'onmousemove', 'onmouseout', 'onmouseover', | 3229 'onmousedown', 'onmousemove', 'onmouseout', 'onmouseover', |
3169 'onmouseup', 'onresize', 'onscroll', 'onunload'] | 3230 'onmouseup', 'onresize', 'onscroll', 'onunload'] |
3170 if self._interface.id.startswith('SVG') and not attr.id in svg_exceptions: | 3231 if self._interface.id.startswith('SVG') and not attr.id in svg_exceptions: |
3171 namespace = 'SVGNames' | 3232 namespace = 'SVGNames' |
3172 self._cpp_impl_includes[namespace] = 1 | 3233 self._cpp_impl_includes[namespace] = 1 |
3173 | 3234 |
3174 attribute_name = attr.ext_attrs['Reflect'] or attr.id.lower() | 3235 attribute_name = attr.ext_attrs['Reflect'] or attr.id.lower() |
3175 return 'WebCore::%s::%sAttr' % (namespace, attribute_name) | 3236 return 'WebCore::%s::%sAttr' % (namespace, attribute_name) |
OLD | NEW |