Chromium Code Reviews| Index: client/dom/scripts/dartgenerator.py |
| diff --git a/client/dom/scripts/dartgenerator.py b/client/dom/scripts/dartgenerator.py |
| index e267c905996abb0c91c02932c43c029da3c663ef..06db322a2b8d726031e67661836fd6dc98d341a2 100755 |
| --- a/client/dom/scripts/dartgenerator.py |
| +++ b/client/dom/scripts/dartgenerator.py |
| @@ -2705,21 +2705,67 @@ class NativeImplementationGenerator(WrappingInterfaceGenerator): |
| self._cpp_resolver_emitter = emitter.Emitter() |
| # Generate constructor. |
| - # FIXME: add proper support for non-custom constructors. |
| - if ('CustomConstructor' in self._interface.ext_attrs or |
| - 'V8CustomConstructor' in self._interface.ext_attrs or |
| - self._interface.id in ['FileReader', 'WebKitCSSMatrix', 'XSLTProcessor']): |
| + # WebKit IDLs may define constructors with arguments. Currently this form is not supported |
| + # (see b/1721). There is custom implementation for some of them, the rest are just ignored |
| + # for now. |
| + SUPPORTED_CONSTRUCTORS_WITH_ARGS = [ 'WebKitCSSMatrix' ] |
| + UNSUPPORTED_CONSTRUCTORS_WITH_ARGS = [ |
| + 'EventSource', |
| + 'MediaStream', |
| + 'PeerConnection', |
| + 'ShadowRoot', |
| + 'SharedWorker', |
| + 'TextTrackCue', |
| + 'Worker' ] |
| + if self._IsConstructable() and self._interface.id not in UNSUPPORTED_CONSTRUCTORS_WITH_ARGS: |
|
podivilov
2012/02/17 17:47:20
Please use early return.
|
| self._cpp_resolver_emitter.Emit( |
| ' if (name == "$(INTERFACE_NAME)_constructor_Callback")\n' |
| ' return Dart$(INTERFACE_NAME)Internal::constructorCallback;\n', |
| INTERFACE_NAME=self._interface.id) |
| - self._cpp_declarations_emitter.Emit( |
| - '\n' |
| - 'void constructorCallback(Dart_NativeArguments);\n') |
| + |
| + if self._interface.id not in SUPPORTED_CONSTRUCTORS_WITH_ARGS and 'Constructor' in self._interface.ext_attrs: |
|
podivilov
2012/02/17 17:47:20
Early return as well: if custom, just emit declara
|
| + raises_dom_exceptions = 'ConstructorRaisesException' in self._interface.ext_attrs |
| + raises_dart_exceptions = raises_dom_exceptions |
| + type_info = GetIDLTypeInfo(self._interface) |
| + arguments = [] |
| + parameter_definitions = '' |
| + if 'CallWith' in self._interface.ext_attrs: |
| + call_with = self._interface.ext_attrs['CallWith'] |
| + if call_with == 'ScriptExecutionContext': |
| + raises_dart_exceptions = True |
| + parameter_definitions = ( |
| + ' ScriptExecutionContext* context = DartUtilities::scriptExecutionContext();\n' |
| + ' if (!context) {\n' |
| + ' exception = Dart_NewString("Failed to create an object");\n' |
| + ' goto fail;\n' |
| + ' }\n') |
| + arguments = ['context'] |
| + else: |
| + raise Exception('Unsupported CallWith=%s attribute' % call_with) |
| + |
| + self._GenerateNativeCallbackBase( |
| + callback_name='constructorCallback', |
| + idl_node=self._interface, |
| + parameter_definitions=parameter_definitions, |
| + function_name='%s::create' % type_info.native_type(), |
| + arguments=arguments, |
| + idl_return_type=self._interface, |
| + raises_dart_exceptions=raises_dart_exceptions, |
| + raises_dom_exceptions=raises_dom_exceptions, |
| + needs_receiver=False) |
| + else: |
| + self._cpp_declarations_emitter.Emit( |
| + '\n' |
| + 'void constructorCallback(Dart_NativeArguments);\n') |
| + |
| def _ImplClassName(self, interface_name): |
| return interface_name + 'Implementation' |
| + def _IsConstructable(self): |
| + # FIXME: support ConstructorTemplate. |
| + return set(['CustomConstructor', 'V8CustomConstructor', 'Constructor']) & set(self._interface.ext_attrs) |
| + |
| def FinishInterface(self): |
| base = self._BaseClassName(self._interface) |
| self._dart_impl_emitter.Emit( |
| @@ -3035,10 +3081,23 @@ class NativeImplementationGenerator(WrappingInterfaceGenerator): |
| def _GenerateNativeCallback(self, callback_name, idl_node, |
| parameter_definitions, function_name, arguments, idl_return_type, |
| raises_dart_exceptions, raises_dom_exceptions): |
| - receiver = self._interface_type_info.receiver() |
| + self._GenerateNativeCallbackBase( |
|
podivilov
2012/02/17 17:47:20
I think such trampolines make the code messy. Coul
|
| + callback_name=callback_name, |
| + idl_node=idl_node, |
| + parameter_definitions=parameter_definitions, |
| + function_name=self._interface_type_info.receiver() + function_name, |
| + arguments=arguments, |
| + idl_return_type=idl_return_type, |
| + raises_dart_exceptions=raises_dart_exceptions, |
| + raises_dom_exceptions=raises_dom_exceptions, |
| + needs_receiver=True) |
| + |
| + def _GenerateNativeCallbackBase(self, callback_name, idl_node, |
| + parameter_definitions, function_name, arguments, idl_return_type, |
| + raises_dart_exceptions, raises_dom_exceptions, needs_receiver): |
| if raises_dom_exceptions: |
| arguments.append('ec') |
| - callback = '%s%s(%s)' % (receiver, function_name, ', '.join(arguments)) |
| + callback = '%s(%s)' % (function_name, ', '.join(arguments)) |
|
podivilov
2012/02/17 17:47:20
Could you please replace "function_name, arguments
|
| nested_templates = [] |
| if idl_return_type and idl_return_type.id != 'void': |
| @@ -3084,9 +3143,7 @@ class NativeImplementationGenerator(WrappingInterfaceGenerator): |
| nested_templates.append( |
| ' {\n' |
| - ' $WEBCORE_CLASS_NAME* receiver = DartDOMWrapper::receiver< $WEBCORE_CLASS_NAME >(args);\n' |
| '$PARAMETER_DEFINITIONS' |
| - '\n' |
| '$BODY' |
| ' return;\n' |
| ' }\n') |
| @@ -3113,11 +3170,15 @@ class NativeImplementationGenerator(WrappingInterfaceGenerator): |
| 'WEBCORE_CLASS_NAME': self._interface_type_info.native_type(), |
| 'PARAMETER_DEFINITIONS': parameter_definitions, |
| } |
| + if needs_receiver: |
| + template_parameters['PARAMETER_DEFINITIONS'] = emitter.Format( |
| + ' $WEBCORE_CLASS_NAME* receiver = DartDOMWrapper::receiver< $WEBCORE_CLASS_NAME >(args);\n' |
| + ' $PARAMETER_DEFINITIONS\n', |
| + **template_parameters) |
| + |
| for template in nested_templates: |
| template_parameters['BODY'] = callback |
| - callback_emitter = emitter.Emitter() |
| - callback_emitter.Emit(template, **template_parameters) |
| - callback = ''.join(callback_emitter.Fragments()) |
| + callback = emitter.Format(template, **template_parameters) |
| self._cpp_definitions_emitter.Emit(callback) |