Index: Source/bindings/scripts/unstable/code_generator_v8.py |
diff --git a/Source/bindings/scripts/unstable/code_generator_v8.py b/Source/bindings/scripts/unstable/code_generator_v8.py |
index d850d584d05abcee252fa844523d1e81ca154fdd..db7f560e74c32cc48e68914cd0025a71b42f0f84 100644 |
--- a/Source/bindings/scripts/unstable/code_generator_v8.py |
+++ b/Source/bindings/scripts/unstable/code_generator_v8.py |
@@ -79,63 +79,72 @@ import v8_types |
from v8_utilities import capitalize, cpp_name, conditional_string, v8_class_name |
-def generate_header_and_cpp(definitions, interface_name, interfaces_info, cache_dir): |
- try: |
- interface = definitions.interfaces[interface_name] |
- except KeyError: |
- raise Exception('%s not in IDL definitions' % interface_name) |
- |
- # Store other interfaces for introspection |
- interfaces.update(definitions.interfaces) |
- |
- # Set up Jinja |
- jinja_env = initialize_jinja_env(cache_dir) |
- if interface.is_callback: |
- header_template_filename = 'callback_interface.h' |
- cpp_template_filename = 'callback_interface.cpp' |
- generate_contents = v8_callback_interface.generate_callback_interface |
- else: |
- header_template_filename = 'interface.h' |
- cpp_template_filename = 'interface.cpp' |
- generate_contents = v8_interface.generate_interface |
- header_template = jinja_env.get_template(header_template_filename) |
- cpp_template = jinja_env.get_template(cpp_template_filename) |
- |
- # Set type info, both local and global |
- interface_info = interfaces_info[interface_name] |
- |
- v8_types.set_callback_functions(definitions.callback_functions.keys()) |
- v8_types.set_enums((enum.name, enum.values) |
- for enum in definitions.enumerations.values()) |
- v8_types.set_ancestors(dict( |
- (interface_name, interface_info['ancestors']) |
- for interface_name, interface_info in interfaces_info.iteritems() |
- if 'ancestors' in interface_info)) |
- v8_types.set_callback_interfaces(set( |
- interface_name |
- for interface_name, interface_info in interfaces_info.iteritems() |
- if interface_info['is_callback_interface'])) |
- v8_types.set_implemented_as_interfaces(dict( |
- (interface_name, interface_info['implemented_as']) |
- for interface_name, interface_info in interfaces_info.iteritems() |
- if 'implemented_as' in interface_info)) |
- v8_types.set_will_be_garbage_collected_types(set( |
- interface_name |
- for interface_name, interface_info in interfaces_info.iteritems() |
- if 'inherited_extended_attributes' in interface_info and |
- 'WillBeGarbageCollected' in interface_info['inherited_extended_attributes'])) |
- |
- # Generate contents (input parameters for Jinja) |
- template_contents = generate_contents(interface) |
- template_contents['header_includes'].add(interface_info['include_path']) |
- template_contents['header_includes'] = sorted(template_contents['header_includes']) |
- includes.update(interface_info.get('dependencies_include_paths', [])) |
- template_contents['cpp_includes'] = sorted(includes) |
- |
- # Render Jinja templates |
- header_text = header_template.render(template_contents) |
- cpp_text = cpp_template.render(template_contents) |
- return header_text, cpp_text |
+class CodeGeneratorV8(object): |
+ def __init__(self, interfaces_info, cache_dir): |
+ interfaces_info = interfaces_info or {} |
+ self.interfaces_info = interfaces_info |
+ self.jinja_env = initialize_jinja_env(cache_dir) |
+ |
+ # Set global type info |
+ v8_types.set_ancestors(dict( |
+ (interface_name, interface_info['ancestors']) |
+ for interface_name, interface_info in interfaces_info.iteritems() |
+ if 'ancestors' in interface_info)) |
+ v8_types.set_callback_interfaces(set( |
+ interface_name |
+ for interface_name, interface_info in interfaces_info.iteritems() |
+ if interface_info['is_callback_interface'])) |
+ v8_types.set_implemented_as_interfaces(dict( |
+ (interface_name, interface_info['implemented_as']) |
+ for interface_name, interface_info in interfaces_info.iteritems() |
+ if 'implemented_as' in interface_info)) |
+ v8_types.set_will_be_garbage_collected_types(set( |
+ interface_name |
+ for interface_name, interface_info in interfaces_info.iteritems() |
+ if 'inherited_extended_attributes' in interface_info and |
+ 'WillBeGarbageCollected' in interface_info['inherited_extended_attributes'])) |
+ |
+ def generate_code(self, definitions, interface_name): |
+ """Returns .h/.cpp code as (header_text, cpp_text).""" |
+ try: |
+ interface = definitions.interfaces[interface_name] |
+ except KeyError: |
+ raise Exception('%s not in IDL definitions' % interface_name) |
+ |
+ # Store other interfaces for introspection |
+ interfaces.update(definitions.interfaces) |
+ |
+ # Set local type info |
+ v8_types.set_callback_functions(definitions.callback_functions.keys()) |
+ v8_types.set_enums((enum.name, enum.values) |
+ for enum in definitions.enumerations.values()) |
+ |
+ # Select appropriate Jinja template and contents function |
+ if interface.is_callback: |
+ header_template_filename = 'callback_interface.h' |
+ cpp_template_filename = 'callback_interface.cpp' |
+ generate_contents = v8_callback_interface.generate_callback_interface |
+ else: |
+ header_template_filename = 'interface.h' |
+ cpp_template_filename = 'interface.cpp' |
+ generate_contents = v8_interface.generate_interface |
+ header_template = self.jinja_env.get_template(header_template_filename) |
+ cpp_template = self.jinja_env.get_template(cpp_template_filename) |
+ |
+ # Generate contents (input parameters for Jinja) |
+ template_contents = generate_contents(interface) |
+ |
+ # Add includes for interface itself and any dependencies |
+ interface_info = self.interfaces_info[interface_name] |
+ template_contents['header_includes'].add(interface_info['include_path']) |
+ template_contents['header_includes'] = sorted(template_contents['header_includes']) |
+ includes.update(interface_info.get('dependencies_include_paths', [])) |
+ template_contents['cpp_includes'] = sorted(includes) |
+ |
+ # Render Jinja templates |
+ header_text = header_template.render(template_contents) |
+ cpp_text = cpp_template.render(template_contents) |
+ return header_text, cpp_text |
def initialize_jinja_env(cache_dir): |