Index: third_party/WebKit/Source/bindings/scripts/v8_types.py |
diff --git a/third_party/WebKit/Source/bindings/scripts/v8_types.py b/third_party/WebKit/Source/bindings/scripts/v8_types.py |
index 1b50fee8e9186d4baacf5ef73debb492495f08b8..0a690946bc7fa8d03e52db276bc87dad7425a334 100644 |
--- a/third_party/WebKit/Source/bindings/scripts/v8_types.py |
+++ b/third_party/WebKit/Source/bindings/scripts/v8_types.py |
@@ -41,7 +41,12 @@ Design doc: http://www.chromium.org/developers/design-documents/idl-compiler |
import posixpath |
-from idl_types import IdlTypeBase, IdlType, IdlUnionType, IdlArrayOrSequenceType, IdlNullableType |
+from idl_types import IdlArrayOrSequenceType |
+from idl_types import IdlNullableType |
+from idl_types import IdlRecordType |
+from idl_types import IdlType |
+from idl_types import IdlTypeBase |
+from idl_types import IdlUnionType |
import v8_attributes # for IdlType.constructor_type_name |
from v8_globals import includes |
from v8_utilities import extended_attribute_value_contains |
@@ -143,7 +148,7 @@ def cpp_type(idl_type, extended_attributes=None, raw_type=False, used_as_rvalue_ |
bool, True if the C++ type is used as a variadic argument of a method. |
used_in_cpp_sequence: |
bool, True if the C++ type is used as an element of a container. |
- Containers can be an array, a sequence or a dictionary. |
+ Containers can be an array, a sequence, a dictionary or a record. |
""" |
def string_mode(): |
if idl_type.is_nullable: |
@@ -169,6 +174,16 @@ def cpp_type(idl_type, extended_attributes=None, raw_type=False, used_as_rvalue_ |
return 'const %s&' % vector_template_type |
return vector_template_type |
+ # Record types. |
+ if idl_type.is_record_type: |
+ vector_type = cpp_ptr_type('Vector', 'HeapVector', idl_type.value_type.is_gc_type) |
+ value_type = idl_type.value_type.cpp_type_args(used_in_cpp_sequence=True) |
+ vector_template_type = cpp_template_type(vector_type, |
+ 'std::pair<String, %s>' % value_type) |
+ if used_as_rvalue_type: |
+ return 'const %s&' % vector_template_type |
+ return vector_template_type |
+ |
# Simple types |
base_idl_type = idl_type.base_type |
@@ -322,6 +337,8 @@ IdlTypeBase.is_traceable = property(is_traceable) |
IdlUnionType.is_traceable = property(lambda self: True) |
IdlArrayOrSequenceType.is_traceable = property( |
lambda self: self.element_type.is_traceable) |
+IdlRecordType.is_traceable = property( |
+ lambda self: self.value_type.is_traceable) |
################################################################################ |
@@ -411,6 +428,14 @@ def includes_for_array_or_sequence_type(idl_type, extended_attributes=None): |
IdlArrayOrSequenceType.includes_for_type = includes_for_array_or_sequence_type |
+def includes_for_record_type(idl_type, extended_attributes=None): |
+ return set.union(set(['bindings/core/v8/IDLTypes.h']), |
+ idl_type.key_type.includes_for_type(extended_attributes), |
+ idl_type.value_type.includes_for_type(extended_attributes)) |
+ |
+IdlRecordType.includes_for_type = includes_for_record_type |
+ |
+ |
def add_includes_for_type(idl_type, extended_attributes=None): |
includes.update(idl_type.includes_for_type(extended_attributes)) |
@@ -522,6 +547,7 @@ def v8_conversion_needs_exception_state(idl_type): |
IdlType.v8_conversion_needs_exception_state = property(v8_conversion_needs_exception_state) |
IdlArrayOrSequenceType.v8_conversion_needs_exception_state = True |
+IdlRecordType.v8_conversion_needs_exception_state = True |
IdlUnionType.v8_conversion_needs_exception_state = True |
@@ -580,6 +606,34 @@ def v8_value_to_cpp_value(idl_type, extended_attributes, v8_value, variable_name |
cpp_expression_format = ( |
'{v8_value}->Is{idl_type}() ? ' |
'V8{idl_type}::toImpl(v8::Local<v8::{idl_type}>::Cast({v8_value})) : 0') |
+ elif idl_type.is_record_type: |
+ # This function is not record-specific, but for now we are using |
+ # NativeValueTraits<> and the idl:: types only with this IDL type. |
+ def idl_type_name(idl_type): |
+ idl_type = idl_type.preprocessed_type |
+ if idl_type.native_array_element_type: |
+ return 'idl::Sequence<%s>' % idl_type_name(idl_type.native_array_element_type) |
+ elif idl_type.is_record_type: |
+ return 'idl::Record<%s, %s>' % (idl_type_name(idl_type.key_type), |
+ idl_type_name(idl_type.value_type)) |
+ elif idl_type.is_union_type: |
+ return idl_type.as_union_type.name |
+ elif idl_type.is_basic_type or idl_type.name == 'Promise': |
+ return 'idl::%s' % idl_type.name |
+ elif idl_type.implemented_as is not None: |
+ return idl_type.implemented_as |
+ return idl_type.name |
+ |
+ if idl_type.is_nullable: |
+ type_name = idl_type.inner_type.name |
+ else: |
+ type_name = idl_type.name |
+ |
+ k = idl_type_name(idl_type.key_type) |
+ v = idl_type_name(idl_type.value_type) |
+ |
+ cpp_expression_format = ( |
+ 'NativeValueTraits<idl::Record<%s, %s>>::nativeValue({isolate}, {v8_value}, exceptionState)' % (k, v)) |
elif idl_type.is_union_type: |
nullable = 'UnionTypeConversionMode::Nullable' if idl_type.includes_nullable_type else 'UnionTypeConversionMode::NotNullable' |
cpp_expression_format = 'V8{idl_type}::toImpl({isolate}, {v8_value}, {variable_name}, %s, exceptionState)' % nullable |
@@ -759,6 +813,10 @@ def v8_conversion_type(idl_type, extended_attributes): |
if native_array_element_type: |
return 'FrozenArray' if idl_type.is_frozen_array else 'array' |
+ # Record types. |
+ if idl_type.is_record_type: |
+ return 'Record' |
+ |
# Simple types |
base_idl_type = idl_type.base_type |
# Basic types, without additional includes |
@@ -808,6 +866,8 @@ V8_SET_RETURN_VALUE = { |
'EventHandler': 'v8SetReturnValue(info, {cpp_value})', |
'ScriptValue': 'v8SetReturnValue(info, {cpp_value})', |
'SerializedScriptValue': 'v8SetReturnValue(info, {cpp_value})', |
+ # Records. |
+ 'Record': 'v8SetReturnValue(info, ToV8({cpp_value}, info.Holder(), info.GetIsolate()))', |
# DOMWrapper |
'DOMWrapperForMainWorld': 'v8SetReturnValueForMainWorld(info, {cpp_value})', |
'DOMWrapperFast': 'v8SetReturnValueFast(info, {cpp_value}, {script_wrappable})', |
@@ -902,6 +962,7 @@ CPP_VALUE_TO_V8_VALUE = { |
'V8AbstractEventListener::cast({cpp_value})->getListenerOrNull(' + |
'{isolate}, impl->getExecutionContext()) : ' + |
'v8::Null({isolate}).As<v8::Value>()'), |
+ 'Record': 'ToV8({cpp_value}, {creation_context}, {isolate})', |
'ScriptValue': '{cpp_value}.v8Value()', |
'SerializedScriptValue': 'v8Deserialize({isolate}, {cpp_value})', |
# General |