Index: mojo/public/tools/bindings/generators/mojom_cpp_generator.py |
diff --git a/mojo/public/tools/bindings/generators/mojom_cpp_generator.py b/mojo/public/tools/bindings/generators/mojom_cpp_generator.py |
index 38d222b136995a93b668e607594989d1f2771b41..b1a78b2018df0cfe92dd0717b97073b6cbd0bfc7 100644 |
--- a/mojo/public/tools/bindings/generators/mojom_cpp_generator.py |
+++ b/mojo/public/tools/bindings/generators/mojom_cpp_generator.py |
@@ -4,6 +4,8 @@ |
"""Generates C++ source files from a mojom.Module.""" |
+import collections |
+ |
import mojom.generate.generator as generator |
import mojom.generate.module as mojom |
import mojom.generate.pack as pack |
@@ -179,6 +181,24 @@ def IsNativeOnlyKind(kind): |
kind.native_only |
+def IsDistinctUnionKind(union, field): |
+ """Returns whether a field in a union has a distinct type from other fields. |
+ |
+ The fields of a union for which this returns True may form an overload set |
+ without ambiguity. Due to the way integral and floating point type promotion |
+ works, integral and floating point types are considered not distinct. |
+ """ |
+ if (mojom.IsIntegralKind(field.kind) or mojom.IsFloatKind(field.kind) or |
+ mojom.IsDoubleKind(field.kind)): |
+ return False |
+ |
+ if not hasattr(union, 'field_types'): |
+ union.field_types = collections.defaultdict(lambda: -1) |
+ for union_field in union.fields: |
+ union.field_types[GetCppWrapperParamType(union_field.kind)] += 1 |
+ return not union.field_types[ |
+ GetCppWrapperParamType(field.kind)] |
+ |
def IsHashableKind(kind): |
"""Check if the kind can be hashed. |
@@ -638,6 +658,7 @@ class Generator(generator.Generator): |
"is_any_interface_kind": mojom.IsAnyInterfaceKind, |
"is_any_handle_or_interface_kind": mojom.IsAnyHandleOrInterfaceKind, |
"is_associated_kind": mojom.IsAssociatedKind, |
+ "is_distinct_kind": IsDistinctUnionKind, |
"is_hashable": IsHashableKind, |
"is_map_kind": mojom.IsMapKind, |
"is_nullable_kind": mojom.IsNullableKind, |