Index: Source/bindings/scripts/v8_interface_header.py |
diff --git a/Source/bindings/scripts/v8_interface_header.py b/Source/bindings/scripts/v8_interface_header.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9b49d83f8d11cb0a81435571ef1b937bea12c041 |
--- /dev/null |
+++ b/Source/bindings/scripts/v8_interface_header.py |
@@ -0,0 +1,186 @@ |
+# Copyright (C) 2013 Google Inc. All rights reserved. |
+# |
+# Redistribution and use in source and binary forms, with or without |
+# modification, are permitted provided that the following conditions are |
+# met: |
+# |
+# * Redistributions of source code must retain the above copyright |
+# notice, this list of conditions and the following disclaimer. |
+# * Redistributions in binary form must reproduce the above |
+# copyright notice, this list of conditions and the following disclaimer |
+# in the documentation and/or other materials provided with the |
+# distribution. |
+# * Neither the name of Google Inc. nor the names of its |
+# contributors may be used to endorse or promote products derived from |
+# this software without specific prior written permission. |
+# |
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
+# 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
+ |
+"""Generate Blink V8 bindings (.h and .cpp files). |
+ |
+Input: An object of class IdlDefinitions, containing an IDL interface X |
+Output: V8X.h and V8X.cpp |
+""" |
+ |
+ |
+from code_generator_idl_reader import inherits_interface, interface_inherits_extended_attribute |
+from v8_includes import header_files_for_interface |
+import v8_special_accessors |
+# from v8_types import get_native_type, get_v8_class_name |
+from v8_types import * |
+from v8_utilities import generate_conditional_string, implemented_as_cpp_name |
+ |
+ |
+def generate_header(interface): |
+ includes = base_header_includes(interface) |
+ cpp_class_name = implemented_as_cpp_name(interface) |
+ cpp_class_name_as_parameter = get_native_type(interface.name, used_as_parameter=True) |
+ |
+ # Ensure the IsDOMNodeType function is in sync. |
+ if is_dom_node_type(interface.name) != inherits_interface(interface, 'Node'): |
+ # inh = 'INHERIT' if inherits_interface(interface, 'Node') else '' |
+ # dom = 'DOM' if is_dom_node_type(interface.name) else '' |
+ # print '[IsDOMNodeType]', dom, inh |
+ raise Exception('IsDOMNodeType is out of date with respect to %s' % interface.name) |
+ |
+ # SVG |
+ svg_property_type, svg_list_property_type, svg_native_type, svg_header_includes, svg_cpp_includes = get_svg_property_types(interface.name) |
+ includes |= set(svg_header_includes) |
+# print '[[]]', svg_native_type |
+ svg_native_type_contains_svg_static_list_property_tear_off = 'SVGStaticListPropertyTearOff' in svg_native_type |
+ svg_type_needing_tear_off = get_svg_type_needing_tear_off(interface.name) |
+ if svg_type_needing_tear_off: |
+ cpp_class_name = svg_type_needing_tear_off |
+# cpp_class_name_as_parameter = svg_type_needing_tear_off |
+ cpp_class_name_as_parameter = get_native_type(svg_type_needing_tear_off, used_as_parameter=True) |
+ |
+ # Wrap |
+ no_to_v8 = 'DoNotGenerateToV8' in interface.extended_attributes |
+ no_wrap = 'DoNotGenerateWrap' in interface.extended_attributes or no_to_v8 |
+ generate_to_v8 = False |
+ custom_wrap = 'CustomToV8' in interface.extended_attributes |
+ if no_to_v8: |
+ if interface.parent: |
+ raise Exception("Can't suppress toV8 for subclass") |
+ elif no_wrap: |
+ if not custom_wrap: |
+ raise Exception('Must have custom toV8') |
+ generate_to_v8 = True |
+ |
+ if interface.parent: |
+ v8_parent_class_name = 'V8' + interface.parent |
+ to_wrapped_type = '%s::toInternalPointer(impl)' % v8_parent_class_name |
+ from_wrapped_type = 'static_cast<%s*>(%s::fromInternalPointer(object))' % (cpp_class_name, v8_parent_class_name) |
+ else: |
+ to_wrapped_type = 'impl' |
+ from_wrapped_type = 'static_cast<%s*>(object)' % cpp_class_name |
+ |
+ # Enabled per context |
+ enabled_per_context_functions = [operation for operation in interface.operations if operation.name and operation.extended_attributes.get('EnabledPerContext')] |
+ enabled_per_context_attributes = [attribute for attribute in interface.attributes if attribute.extended_attributes.get('EnabledPerContext')] |
+ |
+ template_parameters = { |
+ 'conditional_string': generate_conditional_string(interface), |
+ 'cpp_class_name': cpp_class_name, |
+ # used in function parameter -> can be replaced |
+ 'cpp_class_name_as_parameter': cpp_class_name_as_parameter, |
+ 'inherits_event_target': inherits_interface(interface, 'EventTarget'), |
+ 'internal_fields': get_internal_fields(interface), |
+ 'generate_to_v8': generate_to_v8, |
+ 'header_includes': sorted(includes), |
+ 'operation_definitions': operation_definitions(interface), |
+ 'attribute_definitions': attribute_definitions(interface), |
+ 'has_custom_named_enumerator': has_custom_named_enumerator(interface), |
+ 'install_per_context_properties_body': semicolon_or_braces(enabled_per_context_attributes), |
+ 'install_per_context_prototype_properties_body': semicolon_or_braces(enabled_per_context_functions), |
+ 'wrap': not no_wrap, |
+ 'custom_wrap': custom_wrap, |
+ 'to_wrapped_type': to_wrapped_type, |
+ 'from_wrapped_type': from_wrapped_type, |
+ 'svg_property_type': svg_property_type, |
+ 'svg_list_property_type': svg_list_property_type, |
+ 'svg_native_type': svg_native_type, |
+ 'svg_native_type_contains_svg_static_list_property_tear_off': svg_native_type_contains_svg_static_list_property_tear_off, |
+ } |
+ template_parameters.update(v8_special_accessors.has_custom_accessors(interface)) |
+ return template_parameters |
+ |
+ |
+def base_header_includes(interface): |
+ includes = set([ |
+ 'bindings/v8/WrapperTypeInfo.h', |
+ 'bindings/v8/V8Binding.h', |
+ 'bindings/v8/V8DOMWrapper.h', |
+ ]) |
+ if interface.parent: |
+ includes.add('V8%s.h' % interface.parent) |
+ includes |= set(header_files_for_interface(interface.name, implemented_as_cpp_name(interface))) |
+ return includes |
+ |
+ |
+def get_internal_fields(interface): |
+ # Event listeners on DOM nodes are explicitly supported in the GC controller. |
+ if (not inherits_interface(interface, 'Node') and |
+ (inherits_interface(interface, 'EventTarget') or |
+ any([attribute.data_type == 'EventListener' |
+ for attribute in interface.attributes]))): |
+ return ['eventListenerCacheIndex'] |
+ return [] |
+ |
+ |
+# FIXME: list comprehension |
+# FIXME: in fact, template instead |
+def operation_definitions(interface): |
+ definitions = [] |
+ for operation in interface.operations: |
+ if not operation.name: |
+ continue |
+ if has_custom_implementation(operation) and operation.overload_index == 1: |
+ code = 'static void %sMethodCustom(const v8::FunctionCallbackInfo<v8::Value>&);' % operation.name |
+ definitions.append(apply_conditional(operation, code)) |
+ return definitions |
+ |
+ |
+# FIXME: list comprehension |
+# FIXME: in fact, template instead |
+def attribute_definitions(interface): |
+ definitions = [] |
+ for attribute in interface.attributes: |
+ if has_custom_getter(attribute): |
+ code = 'static void %sAttrGetterCustom(v8::Local<v8::String> name, const v8::PropertyCallbackInfo<v8::Value>&);' % attribute.name |
+ definitions.append(apply_conditional(attribute, code)) |
+ if has_custom_setter(attribute): |
+ code = 'static void %sAttrSetterCustom(v8::Local<v8::String> name, v8::Local<v8::Value>, const v8::PropertyCallbackInfo<void>&);' % attribute.name |
+ definitions.append(apply_conditional(attribute, code)) |
+ return definitions |
+ |
+ |
+def has_custom_named_enumerator(interface): |
+ named_getter_operation = v8_special_accessors.get_named_getter_operation(interface) |
+ return named_getter_operation and 'CustomEnumerateProperty' in named_getter_operation.extended_attributes |
+ |
+ |
+def semicolon_or_braces(l): |
+ if l: |
+ return ';' |
+ return ' { }' |
+ |
+ |
+# FIXME: template instead? |
+def apply_conditional(operation_or_attribute, code): |
+ conditional_string = generate_conditional_string(operation_or_attribute) |
+ if conditional_string: |
+ return ('#if %s\n' % conditional_string + |
+ code + |
+ '#endif // %s\n' % conditional_string) |
+ return code |