Index: Source/bindings/scripts/v8_types.py |
diff --git a/Source/bindings/scripts/v8_types.py b/Source/bindings/scripts/v8_types.py |
index 944db4a604f6a029d45528807efeb4a48f8c9696..d116ffa41822861da917b2b67ab96c90f56666b2 100644 |
--- a/Source/bindings/scripts/v8_types.py |
+++ b/Source/bindings/scripts/v8_types.py |
@@ -193,7 +193,14 @@ def cpp_type(idl_type, extended_attributes=None, raw_type=False, used_as_rvalue_ |
if idl_type.is_dictionary: |
return base_idl_type |
if idl_type.is_union_type: |
- return idl_type.name |
+ # 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 |
+ return "Or".join(member_cpp_name(member) |
+ for member in idl_type.member_types) |
# Default, assume native type is a pointer with same type name as idl type |
return base_idl_type + '*' |
@@ -517,7 +524,7 @@ def v8_value_to_cpp_value(idl_type, extended_attributes, v8_value, variable_name |
# Simple types |
idl_type = idl_type.preprocessed_type |
add_includes_for_type(idl_type) |
- base_idl_type = idl_type.name if idl_type.is_union_type else idl_type.base_type |
+ base_idl_type = idl_type.as_union_type.name if idl_type.is_union_type else idl_type.base_type |
if 'EnforceRange' in extended_attributes: |
arguments = ', '.join([v8_value, 'EnforceRange', 'exceptionState']) |
@@ -534,7 +541,9 @@ 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::Handle<v8::{idl_type}>::Cast({v8_value})) : 0') |
- elif idl_type.is_dictionary or idl_type.is_union_type: |
+ elif idl_type.use_output_parameter_for_result: |
+ if idl_type.includes_nullable_type: |
+ base_idl_type = idl_type.cpp_type + 'OrNull' |
cpp_expression_format = 'V8{idl_type}::toImpl({isolate}, {v8_value}, {variable_name}, exceptionState)' |
elif needs_type_check: |
cpp_expression_format = ( |
@@ -860,9 +869,11 @@ def cpp_type_has_null_value(idl_type): |
# - Enum types, as they are implemented as Strings. |
# - Wrapper types (raw pointer or RefPtr/PassRefPtr) represent null as |
# a null pointer. |
+ # - Union types, as thier container classes can represent null value. |
# - 'Object' type. We use ScriptValue for object type. |
return (idl_type.is_string_type or idl_type.is_wrapper_type or |
- idl_type.is_enum or idl_type.base_type == 'object') |
+ idl_type.is_enum or idl_type.is_union_type |
+ or idl_type.base_type == 'object') |
IdlTypeBase.cpp_type_has_null_value = property(cpp_type_has_null_value) |
@@ -880,3 +891,27 @@ def is_explicit_nullable(idl_type): |
IdlTypeBase.is_implicit_nullable = property(is_implicit_nullable) |
IdlUnionType.is_implicit_nullable = False |
IdlTypeBase.is_explicit_nullable = property(is_explicit_nullable) |
+ |
+ |
+def number_of_nullable_member_types_union(idl_type): |
+ # http://heycam.github.io/webidl/#dfn-number-of-nullable-member-types |
+ count = 0 |
+ for member in idl_type.member_types: |
+ if member.is_nullable: |
+ count += 1 |
+ member = member.inner_type |
+ if member.is_union_type: |
+ count += number_of_nullable_member_types_union(member) |
+ return count |
+ |
+IdlUnionType.number_of_nullable_member_types = property( |
+ number_of_nullable_member_types_union) |
+ |
+ |
+def includes_nullable_type_union(idl_type): |
+ # http://heycam.github.io/webidl/#dfn-includes-a-nullable-type |
+ return idl_type.number_of_nullable_member_types == 1 |
+ |
+IdlTypeBase.includes_nullable_type = False |
+IdlNullableType.includes_nullable_type = True |
+IdlUnionType.includes_nullable_type = property(includes_nullable_type_union) |