OLD | NEW |
1 # Copyright 2013 The Chromium Authors. All rights reserved. | 1 # Copyright 2013 The Chromium Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 """Generates C++ source files from a mojom.Module.""" | 5 """Generates C++ source files from a mojom.Module.""" |
6 | 6 |
| 7 import collections |
| 8 |
7 import mojom.generate.generator as generator | 9 import mojom.generate.generator as generator |
8 import mojom.generate.module as mojom | 10 import mojom.generate.module as mojom |
9 import mojom.generate.pack as pack | 11 import mojom.generate.pack as pack |
10 from mojom.generate.template_expander import UseJinja | 12 from mojom.generate.template_expander import UseJinja |
11 | 13 |
12 | 14 |
13 _kind_to_cpp_type = { | 15 _kind_to_cpp_type = { |
14 mojom.BOOL: "bool", | 16 mojom.BOOL: "bool", |
15 mojom.INT8: "int8_t", | 17 mojom.INT8: "int8_t", |
16 mojom.UINT8: "uint8_t", | 18 mojom.UINT8: "uint8_t", |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
172 | 174 |
173 def IsTypemappedKind(kind): | 175 def IsTypemappedKind(kind): |
174 return hasattr(kind, "name") and \ | 176 return hasattr(kind, "name") and \ |
175 GetFullMojomNameForKind(kind) in _current_typemap | 177 GetFullMojomNameForKind(kind) in _current_typemap |
176 | 178 |
177 def IsNativeOnlyKind(kind): | 179 def IsNativeOnlyKind(kind): |
178 return (mojom.IsStructKind(kind) or mojom.IsEnumKind(kind)) and \ | 180 return (mojom.IsStructKind(kind) or mojom.IsEnumKind(kind)) and \ |
179 kind.native_only | 181 kind.native_only |
180 | 182 |
181 | 183 |
| 184 def IsDistinctUnionKind(union, field): |
| 185 """Returns whether a field in a union has a distinct type from other fields. |
| 186 |
| 187 The fields of a union for which this returns True may form an overload set |
| 188 without ambiguity. Due to the way integral and floating point type promotion |
| 189 works, integral and floating point types are considered not distinct. |
| 190 """ |
| 191 if (mojom.IsIntegralKind(field.kind) or mojom.IsFloatKind(field.kind) or |
| 192 mojom.IsDoubleKind(field.kind)): |
| 193 return False |
| 194 |
| 195 if not hasattr(union, 'field_types'): |
| 196 union.field_types = collections.defaultdict(lambda: -1) |
| 197 for union_field in union.fields: |
| 198 union.field_types[GetCppWrapperParamType(union_field.kind)] += 1 |
| 199 return not union.field_types[ |
| 200 GetCppWrapperParamType(field.kind)] |
| 201 |
182 def IsHashableKind(kind): | 202 def IsHashableKind(kind): |
183 """Check if the kind can be hashed. | 203 """Check if the kind can be hashed. |
184 | 204 |
185 Args: | 205 Args: |
186 kind: {Kind} The kind to check. | 206 kind: {Kind} The kind to check. |
187 | 207 |
188 Returns: | 208 Returns: |
189 {bool} True if a value of this kind can be hashed. | 209 {bool} True if a value of this kind can be hashed. |
190 """ | 210 """ |
191 checked = set() | 211 checked = set() |
(...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
631 "should_inline": ShouldInlineStruct, | 651 "should_inline": ShouldInlineStruct, |
632 "should_inline_union": ShouldInlineUnion, | 652 "should_inline_union": ShouldInlineUnion, |
633 "is_array_kind": mojom.IsArrayKind, | 653 "is_array_kind": mojom.IsArrayKind, |
634 "is_enum_kind": mojom.IsEnumKind, | 654 "is_enum_kind": mojom.IsEnumKind, |
635 "is_integral_kind": mojom.IsIntegralKind, | 655 "is_integral_kind": mojom.IsIntegralKind, |
636 "is_native_only_kind": IsNativeOnlyKind, | 656 "is_native_only_kind": IsNativeOnlyKind, |
637 "is_any_handle_kind": mojom.IsAnyHandleKind, | 657 "is_any_handle_kind": mojom.IsAnyHandleKind, |
638 "is_any_interface_kind": mojom.IsAnyInterfaceKind, | 658 "is_any_interface_kind": mojom.IsAnyInterfaceKind, |
639 "is_any_handle_or_interface_kind": mojom.IsAnyHandleOrInterfaceKind, | 659 "is_any_handle_or_interface_kind": mojom.IsAnyHandleOrInterfaceKind, |
640 "is_associated_kind": mojom.IsAssociatedKind, | 660 "is_associated_kind": mojom.IsAssociatedKind, |
| 661 "is_distinct_kind": IsDistinctUnionKind, |
641 "is_hashable": IsHashableKind, | 662 "is_hashable": IsHashableKind, |
642 "is_map_kind": mojom.IsMapKind, | 663 "is_map_kind": mojom.IsMapKind, |
643 "is_nullable_kind": mojom.IsNullableKind, | 664 "is_nullable_kind": mojom.IsNullableKind, |
644 "is_object_kind": mojom.IsObjectKind, | 665 "is_object_kind": mojom.IsObjectKind, |
645 "is_reference_kind": mojom.IsReferenceKind, | 666 "is_reference_kind": mojom.IsReferenceKind, |
646 "is_string_kind": mojom.IsStringKind, | 667 "is_string_kind": mojom.IsStringKind, |
647 "is_struct_kind": mojom.IsStructKind, | 668 "is_struct_kind": mojom.IsStructKind, |
648 "is_typemapped_kind": IsTypemappedKind, | 669 "is_typemapped_kind": IsTypemappedKind, |
649 "is_union_kind": mojom.IsUnionKind, | 670 "is_union_kind": mojom.IsUnionKind, |
650 "passes_associated_kinds": mojom.PassesAssociatedKinds, | 671 "passes_associated_kinds": mojom.PassesAssociatedKinds, |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
809 global _variant | 830 global _variant |
810 _variant = self.variant | 831 _variant = self.variant |
811 global _export_attribute | 832 global _export_attribute |
812 _export_attribute = self.export_attribute | 833 _export_attribute = self.export_attribute |
813 suffix = "-%s" % self.variant if self.variant else "" | 834 suffix = "-%s" % self.variant if self.variant else "" |
814 self.Write(self.GenerateModuleHeader(), | 835 self.Write(self.GenerateModuleHeader(), |
815 self.MatchMojomFilePath("%s%s.h" % (self.module.name, suffix))) | 836 self.MatchMojomFilePath("%s%s.h" % (self.module.name, suffix))) |
816 self.Write( | 837 self.Write( |
817 self.GenerateModuleSource(), | 838 self.GenerateModuleSource(), |
818 self.MatchMojomFilePath("%s%s.cc" % (self.module.name, suffix))) | 839 self.MatchMojomFilePath("%s%s.cc" % (self.module.name, suffix))) |
OLD | NEW |