Chromium Code Reviews| Index: client/dom/scripts/systemnative.py |
| diff --git a/client/dom/scripts/systemnative.py b/client/dom/scripts/systemnative.py |
| index ae75dbcd8e242f543647c188a025c78718820206..1c62f3ef87efbcc70212252c37e03651dd68e4f8 100644 |
| --- a/client/dom/scripts/systemnative.py |
| +++ b/client/dom/scripts/systemnative.py |
| @@ -59,6 +59,7 @@ class NativeImplementationSystem(System): |
| dart_interface_path = self._FilePathForDartInterface(self._interface.id) |
| self._dom_public_files.append(dart_interface_path) |
| + cpp_impl_includes = set() |
| cpp_header_handlers_emitter = emitter.Emitter() |
| cpp_impl_handlers_emitter = emitter.Emitter() |
| class_name = 'Dart%s' % self._interface.id |
| @@ -77,6 +78,7 @@ class NativeImplementationSystem(System): |
| parameters.append('%s %s' % (argument_type_info.parameter_type(), |
| argument.id)) |
| arguments.append(argument.id) |
| + cpp_impl_includes |= set(argument_type_info.conversion_includes()) |
|
antonm
2012/03/01 15:44:50
or cpp_impl_includes.update(argument_type_info.con
|
| cpp_header_handlers_emitter.Emit( |
| '\n' |
| @@ -107,6 +109,7 @@ class NativeImplementationSystem(System): |
| cpp_impl_emitter = self._emitters.FileEmitter(cpp_impl_path) |
| cpp_impl_emitter.Emit( |
| self._templates.Load('cpp_callback_implementation.template'), |
| + INCLUDES=_GenerateCPPIncludes(cpp_impl_includes), |
| INTERFACE=self._interface.id, |
| HANDLERS=cpp_impl_handlers_emitter.Fragments()) |
| @@ -160,21 +163,24 @@ class NativeImplementationSystem(System): |
| INCLUDES=includes_emitter.Fragments(), |
| RESOLVER_BODY=resolver_body_emitter.Fragments()) |
| - # Generate DartDerivedSourcesAll.cpp |
| - cpp_all_in_one_path = os.path.join(self._output_dir, |
| - 'DartDerivedSourcesAll.cpp') |
| + # Generate DartDerivedSourcesXX.cpp. |
| + partitions = 20 # FIXME: this should be configurable. |
| + sources_count = len(self._cpp_impl_files) |
| + for i in range(0, partitions): |
| + derived_sources_path = os.path.join(self._output_dir, |
| + 'DartDerivedSources%02i.cpp' % (i + 1)) |
| - includes_emitter = emitter.Emitter() |
| - for file in self._cpp_impl_files: |
| - path = os.path.relpath(file, os.path.dirname(cpp_all_in_one_path)) |
| - includes_emitter.Emit('#include "$PATH"\n', PATH=path) |
| + includes_emitter = emitter.Emitter() |
| + for impl_file in self._cpp_impl_files[i::partitions]: |
| + path = os.path.relpath(impl_file, os.path.dirname(cpp_all_in_one_path)) |
| + includes_emitter.Emit('#include "$PATH"\n', PATH=path) |
| - cpp_all_in_one_emitter = self._emitters.FileEmitter(cpp_all_in_one_path) |
| - cpp_all_in_one_emitter.Emit( |
| - self._templates.Load('cpp_all_in_one.template'), |
| - INCLUDES=includes_emitter.Fragments()) |
| + cpp_all_in_one_emitter = self._emitters.FileEmitter(derived_sources_path) |
|
antonm
2012/03/01 15:44:50
cpp_all_in_one, cpp_all_in_one, la-la
|
| + cpp_all_in_one_emitter.Emit( |
| + self._templates.Load('cpp_all_in_one.template'), |
| + INCLUDES=includes_emitter.Fragments()) |
| - # Generate DartResolver.cpp |
| + # Generate DartResolver.cpp. |
| cpp_resolver_path = os.path.join(self._output_dir, 'DartResolver.cpp') |
| includes_emitter = emitter.Emitter() |
| @@ -248,7 +254,7 @@ class NativeImplementationGenerator(systemwrapping.WrappingInterfaceGenerator): |
| self._interface_type_info = GetIDLTypeInfoByName(self._interface.id) |
| self._members_emitter = emitter.Emitter() |
| self._cpp_declarations_emitter = emitter.Emitter() |
| - self._cpp_impl_includes = {} |
| + self._cpp_impl_includes = set() |
| self._cpp_definitions_emitter = emitter.Emitter() |
| self._cpp_resolver_emitter = emitter.Emitter() |
| @@ -288,6 +294,7 @@ class NativeImplementationGenerator(systemwrapping.WrappingInterfaceGenerator): |
| ' goto fail;\n' |
| ' }\n' |
| ' Document* document = domWindow->document();\n') |
| + self._cpp_impl_includes.add('DOMWindow') |
| arguments.append('document') |
| create_function = 'createForJSConstructor' |
| if 'CallWith' in self._interface.ext_attrs: |
| @@ -336,17 +343,12 @@ class NativeImplementationGenerator(systemwrapping.WrappingInterfaceGenerator): |
| self._cpp_impl_emitter.Emit( |
| self._templates.Load('cpp_implementation.template'), |
| INTERFACE=self._interface.id, |
| - INCLUDES=''.join(['#include "%s.h"\n' % |
| - k for k in self._cpp_impl_includes.keys()]), |
| + INCLUDES=_GenerateCPPIncludes(self._cpp_impl_includes), |
| CALLBACKS=self._cpp_definitions_emitter.Fragments(), |
| RESOLVER=self._cpp_resolver_emitter.Fragments()) |
| def _GenerateCppHeader(self): |
| - webcore_include = self._interface_type_info.webcore_include() |
| - if webcore_include: |
| - webcore_include = '#include "%s.h"\n' % webcore_include |
| - else: |
| - webcore_include = '' |
| + webcore_includes = _GenerateCPPIncludes(self._interface_type_info.webcore_includes()) |
| if ('CustomToJS' in self._interface.ext_attrs or |
| 'CustomToJSObject' in self._interface.ext_attrs or |
| @@ -370,8 +372,7 @@ class NativeImplementationGenerator(systemwrapping.WrappingInterfaceGenerator): |
| self._cpp_header_emitter.Emit( |
| self._templates.Load('cpp_header.template'), |
| INTERFACE=self._interface.id, |
| - WEBCORE_INCLUDE=webcore_include, |
| - ADDITIONAL_INCLUDES='', |
| + WEBCORE_INCLUDES=webcore_includes, |
| WEBCORE_CLASS_NAME=self._interface_type_info.native_type(), |
| TO_DART_VALUE=to_dart_value_emitter.Fragments(), |
| DECLARATIONS=self._cpp_declarations_emitter.Fragments()) |
| @@ -583,10 +584,11 @@ class NativeImplementationGenerator(systemwrapping.WrappingInterfaceGenerator): |
| arguments.append('context') |
| elif call_with == 'ScriptArguments|CallStack': |
| raises_dart_exceptions = True |
| - self._cpp_impl_includes['ScriptArguments'] = 1 |
| - self._cpp_impl_includes['ScriptCallStack'] = 1 |
| - self._cpp_impl_includes['V8Proxy'] = 1 |
| - self._cpp_impl_includes['v8'] = 1 |
| + self._cpp_impl_includes.add('DOMWindow') |
| + self._cpp_impl_includes.add('ScriptArguments') |
| + self._cpp_impl_includes.add('ScriptCallStack') |
| + self._cpp_impl_includes.add('V8Proxy') |
| + self._cpp_impl_includes.add('v8') |
| parameter_definitions_emitter.Emit( |
| ' v8::HandleScope handleScope;\n' |
| ' v8::Context::Scope scope(V8Proxy::mainWorldContext(DartUtilities::domWindowForCurrentIsolate()->frame()));\n' |
| @@ -675,7 +677,7 @@ class NativeImplementationGenerator(systemwrapping.WrappingInterfaceGenerator): |
| type_info = GetIDLTypeInfo(idl_argument.type) |
| (adapter_type, include_name) = type_info.parameter_adapter_info() |
| if include_name: |
| - self._cpp_impl_includes[include_name] = 1 |
| + self._cpp_impl_includes.add(include_name) |
| flags = '' |
| if (idl_argument.ext_attrs.get('Optional') == 'DefaultIsNullString' or |
| ('Optional' in idl_argument.ext_attrs and 'Callback' in idl_argument.ext_attrs)): |
| @@ -724,7 +726,7 @@ class NativeImplementationGenerator(systemwrapping.WrappingInterfaceGenerator): |
| 'onmouseup', 'onresize', 'onscroll', 'onunload'] |
| if self._interface.id.startswith('SVG') and not attr.id in svg_exceptions: |
| namespace = 'SVGNames' |
| - self._cpp_impl_includes[namespace] = 1 |
| + self._cpp_impl_includes.add(namespace) |
| attribute_name = attr.ext_attrs['Reflect'] or attr.id.lower() |
| return 'WebCore::%s::%sAttr' % (namespace, attribute_name) |
| @@ -739,8 +741,7 @@ class NativeImplementationGenerator(systemwrapping.WrappingInterfaceGenerator): |
| invocation_template = ' $FUNCTION_CALL;\n' |
| if idl_return_type and idl_return_type.id != 'void': |
| return_type_info = GetIDLTypeInfo(idl_return_type) |
| - if return_type_info.conversion_include(): |
| - self._cpp_impl_includes[return_type_info.conversion_include()] = 1 |
| + self._cpp_impl_includes |= set(return_type_info.conversion_includes()) |
|
antonm
2012/03/01 15:44:50
ditto
|
| # Generate C++ cast based on idl return type. |
| conversion_cast = return_type_info.conversion_cast('$FUNCTION_CALL') |
| @@ -786,7 +787,10 @@ class NativeImplementationGenerator(systemwrapping.WrappingInterfaceGenerator): |
| if 'ImplementedBy' in attributes: |
| arguments.insert(0, 'receiver') |
| - self._cpp_impl_includes[attributes['ImplementedBy']] = 1 |
| + self._cpp_impl_includes.add(attributes['ImplementedBy']) |
| return emitter.Format(invocation_template, |
| FUNCTION_CALL='%s(%s)' % (function_expression, ', '.join(arguments))) |
| + |
| +def _GenerateCPPIncludes(includes): |
| + return ''.join(['#include "%s.h"\n' % include for include in includes]) |