in bindings/scripts/v8_types.py [0:0]
def cpp_type(idl_type, extended_attributes=None, raw_type=False, used_as_rvalue_type=False, used_as_variadic_argument=False, used_in_cpp_sequence=False):
"""Returns C++ type corresponding to IDL type.
|idl_type| argument is of type IdlType, while return value is a string
Args:
idl_type:
IdlType
raw_type:
bool, True if idl_type's raw/primitive C++ type should be returned.
used_as_rvalue_type:
bool, True if the C++ type is used as an argument or the return
type of a method.
used_as_variadic_argument:
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, a dictionary or a record.
"""
def string_mode():
if idl_type.is_nullable:
return 'kTreatNullAndUndefinedAsNullString'
# TODO(lisabelle): Remove these 4 lines when we have fully supported
# annoteted types. (crbug.com/714866)
# It is because at that time 'TreatNullAs' will only appear in
# type_extended_attributes, not in extended_attributes.
if extended_attributes.get('TreatNullAs') == 'EmptyString':
return 'kTreatNullAsEmptyString'
if extended_attributes.get('TreatNullAs') == 'NullString':
return 'kTreatNullAsNullString'
type_extended_attributes = idl_type.extended_attributes or {}
if type_extended_attributes.get('TreatNullAs') == 'EmptyString':
return 'kTreatNullAsEmptyString'
if type_extended_attributes.get('TreatNullAs') == 'NullString':
return 'kTreatNullAsNullString'
return ''
extended_attributes = extended_attributes or {}
idl_type = idl_type.preprocessed_type
# Array or sequence types
if used_as_variadic_argument:
native_array_element_type = idl_type
else:
native_array_element_type = idl_type.native_array_element_type
if native_array_element_type:
vector_type = cpp_ptr_type('Vector', 'HeapVector', native_array_element_type.is_gc_type)
vector_template_type = cpp_template_type(vector_type, native_array_element_type.cpp_type_args(used_in_cpp_sequence=True))
if used_as_rvalue_type:
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
if base_idl_type in CPP_TYPE_SAME_AS_IDL_TYPE:
return base_idl_type
if base_idl_type in CPP_INTEGER_CONVERSION_RULES:
return CPP_INTEGER_CONVERSION_RULES[base_idl_type]
if base_idl_type in CPP_SPECIAL_CONVERSION_RULES:
return CPP_SPECIAL_CONVERSION_RULES[base_idl_type]
if base_idl_type == 'SerializedScriptValue':
return 'RefPtr<%s>' % base_idl_type
if idl_type.is_string_type:
if not raw_type:
return 'const String&' if used_as_rvalue_type else 'String'
return 'V8StringResource<%s>' % string_mode()
if base_idl_type == 'ArrayBufferView' and 'FlexibleArrayBufferView' in extended_attributes:
return 'FlexibleArrayBufferView'
if base_idl_type in TYPED_ARRAY_TYPES and 'FlexibleArrayBufferView' in extended_attributes:
return 'Flexible' + base_idl_type + 'View'
if base_idl_type in ARRAY_BUFFER_VIEW_AND_TYPED_ARRAY_TYPES:
if not used_in_cpp_sequence:
if 'AllowShared' in extended_attributes:
return cpp_template_type('MaybeShared', idl_type.implemented_as)
else:
return cpp_template_type('NotShared', idl_type.implemented_as)
if idl_type.is_interface_type:
implemented_as_class = idl_type.implemented_as
if raw_type or (used_as_rvalue_type and idl_type.is_garbage_collected) or not used_in_cpp_sequence:
return implemented_as_class + '*'
if not used_in_cpp_sequence:
return implemented_as_class + '*'
return cpp_template_type('Member', implemented_as_class)
if idl_type.is_dictionary:
if used_as_rvalue_type:
return 'const %s&' % base_idl_type
return base_idl_type
if idl_type.is_union_type:
# Avoid "AOrNullOrB" for cpp type of (A? or B) because we generate
# V8AOrBOrNull to handle nulle for (A? or B), (A or B?) and (A or B)?
def member_cpp_name(idl_type):
if idl_type.is_nullable:
return idl_type.inner_type.name
return idl_type.name
idl_type_name = 'Or'.join(member_cpp_name(member)
for member in idl_type.member_types)
return 'const %s&' % idl_type_name if used_as_rvalue_type else idl_type_name
if idl_type.is_callback_function:
if idl_type.is_custom_callback_function:
return 'V8%s' % base_idl_type
return 'V8%s*' % base_idl_type
if base_idl_type == 'void':
return base_idl_type
# Default, assume native type is a pointer with same type name as idl type
return base_idl_type + '*'