Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(31)

Unified Diff: third_party/WebKit/Source/bindings/scripts/v8_types.py

Issue 2725673002: WIP bindings: Expand usage of NativeValueTraits. (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..2c0b58d8e1802e6d678e7f39b1784ce247ade0e8 100644
--- a/third_party/WebKit/Source/bindings/scripts/v8_types.py
+++ b/third_party/WebKit/Source/bindings/scripts/v8_types.py
@@ -145,15 +145,6 @@ def cpp_type(idl_type, extended_attributes=None, raw_type=False, used_as_rvalue_
bool, True if the C++ type is used as an element of a container.
Containers can be an array, a sequence or a dictionary.
"""
- def string_mode():
- if idl_type.is_nullable:
- return 'TreatNullAndUndefinedAsNullString'
- if extended_attributes.get('TreatNullAs') == 'EmptyString':
- return 'TreatNullAsEmptyString'
- if extended_attributes.get('TreatNullAs') == 'NullString':
- return 'TreatNullAsNullString'
- return ''
-
extended_attributes = extended_attributes or {}
idl_type = idl_type.preprocessed_type
@@ -186,7 +177,7 @@ def cpp_type(idl_type, extended_attributes=None, raw_type=False, used_as_rvalue_
if idl_type.is_string_type:
if not raw_type:
return 'String'
- return 'V8StringResource<%s>' % string_mode()
+ return 'V8StringResource<>'
if base_idl_type == 'ArrayBufferView' and 'FlexibleArrayBufferView' in extended_attributes:
return 'FlexibleArrayBufferView'
@@ -374,7 +365,7 @@ def includes_for_type(idl_type, extended_attributes=None):
set(['bindings/%s/v8/V8%s.h' % (component_dir[base_idl_type], base_idl_type)])
)
if idl_type.is_basic_type:
- return set()
+ return set(['bindings/core/v8/IDLTypes.h'])
if base_idl_type.endswith('ConstructorConstructor'):
# FIXME: rename to NamedConstructor
# FIXME: replace with a [NamedConstructorAttribute] extended attribute
@@ -393,7 +384,8 @@ def includes_for_type(idl_type, extended_attributes=None):
if base_idl_type not in component_dir:
return set()
return set(['bindings/%s/v8/V8%s.h' % (component_dir[base_idl_type],
- base_idl_type)])
+ base_idl_type),
+ 'bindings/core/v8/IDLTypes.h'])
IdlType.includes_for_type = includes_for_type
@@ -484,32 +476,9 @@ def set_component_dirs(new_component_dirs):
################################################################################
V8_VALUE_TO_CPP_VALUE = {
- # Basic
- 'Date': 'toCoreDate({isolate}, {v8_value}, exceptionState)',
- 'DOMString': '{v8_value}',
- 'ByteString': 'toByteString({isolate}, {arguments})',
- 'USVString': 'toUSVString({isolate}, {arguments})',
- 'boolean': 'toBoolean({isolate}, {arguments})',
- 'float': 'toRestrictedFloat({isolate}, {arguments})',
- 'unrestricted float': 'toFloat({isolate}, {arguments})',
- 'double': 'toRestrictedDouble({isolate}, {arguments})',
- 'unrestricted double': 'toDouble({isolate}, {arguments})',
- 'byte': 'toInt8({isolate}, {arguments})',
- 'octet': 'toUInt8({isolate}, {arguments})',
- 'short': 'toInt16({isolate}, {arguments})',
- 'unsigned short': 'toUInt16({isolate}, {arguments})',
- 'long': 'toInt32({isolate}, {arguments})',
- 'unsigned long': 'toUInt32({isolate}, {arguments})',
- 'long long': 'toInt64({isolate}, {arguments})',
- 'unsigned long long': 'toUInt64({isolate}, {arguments})',
# Interface types
- 'Dictionary': 'Dictionary({isolate}, {v8_value}, exceptionState)',
'FlexibleArrayBufferView': 'toFlexibleArrayBufferView({isolate}, {v8_value}, {variable_name}, allocateFlexibleArrayBufferViewStorage({v8_value}))',
'NodeFilter': 'toNodeFilter({v8_value}, info.Holder(), ScriptState::current({isolate}))',
- 'Promise': 'ScriptPromise::cast(ScriptState::current({isolate}), {v8_value})',
- 'SerializedScriptValue': 'SerializedScriptValue::serialize({isolate}, {v8_value}, nullptr, nullptr, exceptionState)',
- 'ScriptValue': 'ScriptValue(ScriptState::current({isolate}), {v8_value})',
- 'Window': 'toDOMWindow({isolate}, {v8_value})',
'XPathNSResolver': 'toXPathNSResolver(ScriptState::current({isolate}), {v8_value})',
}
@@ -518,6 +487,7 @@ def v8_conversion_needs_exception_state(idl_type):
return (idl_type.is_numeric_type or
idl_type.is_enum or
idl_type.is_dictionary or
+ idl_type.is_string_type or
idl_type.name in ('Boolean', 'ByteString', 'Date', 'Dictionary', 'USVString', 'SerializedScriptValue'))
IdlType.v8_conversion_needs_exception_state = property(v8_conversion_needs_exception_state)
@@ -545,18 +515,38 @@ def v8_conversion_is_trivial(idl_type):
IdlType.v8_conversion_is_trivial = property(v8_conversion_is_trivial)
+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_union_type:
+ return idl_type.as_union_type.name
+ elif idl_type.is_basic_type:
+ return 'idl::%s' % idl_type.name
+ elif idl_type.implemented_as is not None:
+ return idl_type.implemented_as
+ return idl_type.name
+
+
def v8_value_to_cpp_value(idl_type, extended_attributes, v8_value, variable_name, index, isolate):
if idl_type.name == 'void':
return ''
- # Array or sequence types
- native_array_element_type = idl_type.native_array_element_type
- if native_array_element_type:
- return v8_value_to_cpp_value_array_or_sequence(native_array_element_type, v8_value, index, isolate)
+ def string_mode(idl_type):
+ if idl_type.is_nullable:
+ return 'TreatNullAndUndefinedAsNullString'
+ if extended_attributes.get('TreatNullAs') == 'EmptyString':
+ return 'TreatNullAsEmptyString'
+ if extended_attributes.get('TreatNullAs') == 'NullString':
+ return 'TreatNullAsNullString'
+ return 'DefaultMode'
# Simple types
idl_type = idl_type.preprocessed_type
- base_idl_type = idl_type.as_union_type.name if idl_type.is_union_type else idl_type.base_type
+ if idl_type.is_union_type:
+ base_idl_type = idl_type.as_union_type.name
+ else:
+ base_idl_type = idl_type.base_type
if 'FlexibleArrayBufferView' in extended_attributes:
if base_idl_type not in TYPED_ARRAY_TYPES.union(set(['ArrayBufferView'])):
@@ -569,53 +559,36 @@ def v8_value_to_cpp_value(idl_type, extended_attributes, v8_value, variable_name
configuration = 'EnforceRange'
elif 'Clamp' in extended_attributes:
configuration = 'Clamp'
- arguments = ', '.join([v8_value, configuration, 'exceptionState'])
- elif idl_type.v8_conversion_needs_exception_state:
- arguments = ', '.join([v8_value, 'exceptionState'])
+ arguments = ', '.join([v8_value, 'exceptionState', configuration])
+ elif idl_type.native_array_element_type:
+ # Index is None for setters, index (starting at 0) for method arguments,
+ # and is used to provide a human-readable exception message
+ if index is None:
+ index = 0 # special case, meaning "setter"
+ else:
+ index += 1 # human-readable index
+ arguments = ', '.join([v8_value, 'exceptionState', str(index)])
else:
- arguments = v8_value
+ arguments = ', '.join([v8_value, 'exceptionState'])
+
if base_idl_type in V8_VALUE_TO_CPP_VALUE:
cpp_expression_format = V8_VALUE_TO_CPP_VALUE[base_idl_type]
- elif idl_type.is_array_buffer_or_view:
- 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_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
- elif idl_type.use_output_parameter_for_result:
- cpp_expression_format = 'V8{idl_type}::toImpl({isolate}, {v8_value}, {variable_name}, exceptionState)'
- elif idl_type.is_callback_function:
- cpp_expression_format = (
- '{idl_type}::create(ScriptState::current({isolate}), {v8_value})')
else:
- cpp_expression_format = (
- 'V8{idl_type}::toImplWithTypeCheck({isolate}, {v8_value})')
-
- return cpp_expression_format.format(arguments=arguments, idl_type=base_idl_type, v8_value=v8_value, variable_name=variable_name, isolate=isolate)
+ str_mode = string_mode(idl_type)
+ if idl_type.is_nullable:
+ idl_type = idl_type.inner_type
+ base_idl_type = idl_type_name(idl_type)
-def v8_value_to_cpp_value_array_or_sequence(native_array_element_type, v8_value, index, isolate='info.GetIsolate()'):
- # Index is None for setters, index (starting at 0) for method arguments,
- # and is used to provide a human-readable exception message
- if index is None:
- index = 0 # special case, meaning "setter"
- else:
- index += 1 # human-readable index
- if (native_array_element_type.is_interface_type and
- native_array_element_type.name != 'Dictionary'):
- this_cpp_type = None
- expression_format = 'toMemberNativeArray<{native_array_element_type}>({v8_value}, {index}, {isolate}, exceptionState)'
- else:
- this_cpp_type = native_array_element_type.cpp_type
- if native_array_element_type.is_dictionary or native_array_element_type.is_union_type:
- vector_type = 'HeapVector'
+ if base_idl_type == 'idl::String':
+ nvt_args = '<%s>' % str_mode
else:
- vector_type = 'Vector'
- expression_format = 'toImplArray<%s<{cpp_type}>>({v8_value}, {index}, {isolate}, exceptionState)' % vector_type
- expression = expression_format.format(native_array_element_type=native_array_element_type.name, cpp_type=this_cpp_type,
- index=index, v8_value=v8_value, isolate=isolate)
- return expression
+ nvt_args = ''
+
+ cpp_expression_format = (
+ 'NativeValueTraits<{idl_type}>::nativeValue%s({isolate}, {arguments})' % nvt_args)
+
+ return cpp_expression_format.format(arguments=arguments, idl_type=base_idl_type, v8_value=v8_value, variable_name=variable_name, isolate=isolate)
# FIXME: this function should be refactored, as this takes too many flags.
@@ -638,24 +611,10 @@ def v8_value_to_local_cpp_value(idl_type, extended_attributes, v8_value, variabl
# meaningful if 'check_expression' is not None.
return_expression = bailout_return_value
- if idl_type.is_string_type or idl_type.v8_conversion_needs_exception_state:
+ if idl_type.v8_conversion_needs_exception_state:
# Types for which conversion can fail and that need error handling.
-
check_expression = 'exceptionState.hadException()'
-
- if idl_type.is_dictionary or idl_type.is_union_type:
- set_expression = cpp_value
- else:
- assign_expression = cpp_value
- # Note: 'not idl_type.v8_conversion_needs_exception_state' implies
- # 'idl_type.is_string_type', but there are types for which both are
- # true (ByteString and USVString), so using idl_type.is_string_type
- # as the condition here would be wrong.
- if not idl_type.v8_conversion_needs_exception_state:
- if use_exception_state:
- check_expression = '!%s.prepare(exceptionState)' % variable_name
- else:
- check_expression = '!%s.prepare()' % variable_name
+ assign_expression = cpp_value
elif not idl_type.v8_conversion_is_trivial and not idl_type.is_callback_function:
return {
'error_message': 'no V8 -> C++ conversion for IDL type: %s' % idl_type.name
« no previous file with comments | « third_party/WebKit/Source/bindings/scripts/v8_interface.py ('k') | third_party/WebKit/Source/bindings/scripts/v8_union.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698