Index: Source/bindings/scripts/compute_interfaces_info_individual.py |
diff --git a/Source/bindings/scripts/compute_interfaces_info_individual.py b/Source/bindings/scripts/compute_interfaces_info_individual.py |
index b052e14c162dae0010d6865a4e4441e7d8e3d2fa..fe9095850bf63afe8383b82e1de14e90feb35215 100755 |
--- a/Source/bindings/scripts/compute_interfaces_info_individual.py |
+++ b/Source/bindings/scripts/compute_interfaces_info_individual.py |
@@ -47,9 +47,10 @@ import os |
import posixpath |
import sys |
+from idl_compiler import idl_filename_to_interface_name |
from idl_definitions import Visitor |
from idl_reader import IdlReader |
-from utilities import get_file_contents, read_file_to_list, idl_filename_to_interface_name, idl_filename_to_component, write_pickle_file, get_interface_extended_attributes_from_idl, is_callback_interface_from_idl |
+from utilities import get_file_contents, read_file_to_list, idl_filename_to_interface_name, idl_filename_to_component, write_pickle_file, get_interface_extended_attributes_from_idl, is_callback_interface_from_idl, merge_dict_recursively |
module_path = os.path.dirname(__file__) |
source_path = os.path.normpath(os.path.join(module_path, os.pardir, os.pardir)) |
@@ -100,8 +101,7 @@ def include_path(idl_filename, implemented_as=None): |
relative_dir = relative_dir_posix(idl_filename) |
# IDL file basename is used even if only a partial interface file |
- idl_file_basename, _ = os.path.splitext(os.path.basename(idl_filename)) |
- cpp_class_name = implemented_as or idl_file_basename |
+ cpp_class_name = implemented_as or idl_filename_to_interface_name(idl_filename) |
return posixpath.join(relative_dir, cpp_class_name + '.h') |
@@ -130,6 +130,13 @@ def get_put_forward_interfaces_from_definition(definition): |
if 'PutForwards' in attribute.extended_attributes)) |
+def get_unforgeable_attributes_from_definition(definition): |
+ if 'Unforgeable' in definition.extended_attributes: |
+ return sorted(definition.attributes) |
+ return sorted(attribute for attribute in definition.attributes |
+ if 'Unforgeable' in attribute.extended_attributes) |
+ |
+ |
def collect_union_types_from_definitions(definitions): |
"""Traverse definitions and collect all union types.""" |
class UnionTypeCollector(Visitor): |
@@ -172,6 +179,34 @@ class InterfaceInfoCollector(object): |
def collect_info(self, idl_filename): |
"""Reads an idl file and collects information which is required by the |
binding code generation.""" |
+ def collect_unforgeable_attributes(definition, idl_filename): |
+ """Collects [Unforgeable] attributes so that we can define them on |
+ sub-interfaces later. The resulting structure is as follows. |
+ interfaces_info[interface_name] = { |
+ 'unforgeable_attributes': { |
+ 'core': [IdlAttribute, ...], |
+ 'modules': [IdlAttribute, ...], |
+ }, |
+ ... |
+ } |
+ """ |
+ interface_info = {} |
+ unforgeable_attributes = get_unforgeable_attributes_from_definition(definition) |
+ if not unforgeable_attributes: |
+ return interface_info |
+ |
+ if definition.is_partial: |
+ interface_basename = idl_filename_to_interface_name(idl_filename) |
+ # TODO(yukishiino): [PartialInterfaceImplementedAs] is treated |
+ # in interface_dependency_resolver.transfer_extended_attributes. |
+ # Come up with a better way to keep them consistent. |
+ for attr in unforgeable_attributes: |
+ attr.extended_attributes['PartialInterfaceImplementedAs'] = definition.extended_attributes.get('ImplementedAs', interface_basename) |
+ component = idl_filename_to_component(idl_filename) |
+ interface_info['unforgeable_attributes'] = {} |
+ interface_info['unforgeable_attributes'][component] = unforgeable_attributes |
+ return interface_info |
+ |
definitions = self.reader.read_idl_file(idl_filename) |
this_union_types = collect_union_types_from_definitions(definitions) |
@@ -208,6 +243,15 @@ class InterfaceInfoCollector(object): |
else: |
return |
+ if definition.name not in self.interfaces_info: |
+ self.interfaces_info[definition.name] = {} |
+ |
+ # Remember [Unforgeable] attributes. |
+ if definitions.interfaces: |
+ merge_dict_recursively(self.interfaces_info[definition.name], |
+ collect_unforgeable_attributes(definition, idl_filename)) |
+ |
+ component = idl_filename_to_component(idl_filename) |
extended_attributes = definition.extended_attributes |
implemented_as = extended_attributes.get('ImplementedAs') |
full_path = os.path.realpath(idl_filename) |
@@ -219,10 +263,22 @@ class InterfaceInfoCollector(object): |
if this_include_path: |
partial_include_paths.append(this_include_path) |
if this_union_types: |
- component = idl_filename_to_component(idl_filename) |
partial_include_paths.append( |
'bindings/%s/v8/UnionTypes%s.h' % (component, component.capitalize())) |
self.add_paths_to_partials_dict(definition.name, full_path, partial_include_paths) |
+ # Collects C++ header paths which should be included from generated |
+ # .cpp files. The resulting structure is as follows. |
+ # interfaces_info[interface_name] = { |
+ # 'cpp_includes': { |
+ # 'core': set(['core/foo/Foo.h', ...]), |
+ # 'modules': set(['modules/bar/Bar.h', ...]), |
+ # }, |
+ # ... |
+ # } |
+ if this_include_path: |
+ merge_dict_recursively( |
+ self.interfaces_info[definition.name], |
+ {'cpp_includes': {component: set([this_include_path])}}) |
return |
# 'implements' statements can be included in either the file for the |
@@ -246,7 +302,7 @@ class InterfaceInfoCollector(object): |
'parent': definition.parent, |
'relative_dir': relative_dir_posix(idl_filename), |
}) |
- self.interfaces_info[definition.name] = interface_info |
+ merge_dict_recursively(self.interfaces_info[definition.name], interface_info) |
def get_info_as_dict(self): |
"""Returns info packaged as a dict.""" |