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 5a46d9ade698737c023aa6af2688b9e1b8ed1ee9..856ae0d7d32c1f79999af3130b0cfcc9fc9b08a8 100644 |
--- a/mojo/public/tools/bindings/generators/mojom_cpp_generator.py |
+++ b/mojo/public/tools/bindings/generators/mojom_cpp_generator.py |
@@ -42,6 +42,11 @@ _kind_to_cpp_literal_suffix = { |
mojom.UINT64: "ULL", |
} |
+# TODO(rockot): Get rid of this global. This requires some refactoring of the |
+# generator library code so that filters can use the generator as context. |
+_current_typemap = {} |
+ |
+ |
def ConstantValue(constant): |
return ExpressionToText(constant.value, kind=constant.kind) |
@@ -67,6 +72,25 @@ def GetNameForKind(kind, internal = False): |
parts.append(kind.name) |
return "::".join(parts) |
+def GetFullMojomNameForKind(kind): |
+ parts = [] |
+ if kind.imported_from: |
+ parts.extend(NamespaceToArray(kind.imported_from["namespace"])) |
+ elif hasattr(kind, "module"): |
+ parts.extend(NamespaceToArray(kind.module.namespace)) |
+ parts.append(kind.name) |
+ return ".".join(parts) |
+ |
+def IsTypemappedKind(kind): |
+ return hasattr(kind, "name") and \ |
+ GetFullMojomNameForKind(kind) in _current_typemap |
+ |
+def IsNativeOnlyKind(kind): |
+ return IsTypemappedKind(kind) and kind.native_only |
+ |
+def GetNativeTypeName(typemapped_kind): |
+ return _current_typemap[GetFullMojomNameForKind(typemapped_kind)]["typename"] |
+ |
def GetQualifiedNameForKind(kind): |
# Always start with an empty part to force a leading "::" on output. |
parts = [""] |
@@ -75,6 +99,8 @@ def GetQualifiedNameForKind(kind): |
return "::".join(parts) |
def GetCppType(kind): |
+ if mojom.IsStructKind(kind) and kind.native_only: |
+ raise Exception("Should not be reached!") |
if mojom.IsArrayKind(kind): |
return "mojo::internal::Array_Data<%s>*" % GetCppType(kind.kind) |
if mojom.IsMapKind(kind): |
@@ -104,6 +130,8 @@ def GetCppPodType(kind): |
return _kind_to_cpp_type[kind] |
def GetCppArrayArgWrapperType(kind): |
+ if mojom.IsStructKind(kind) and kind.native_only: |
+ raise Exception("Cannot serialize containers of native-only types yet!") |
if mojom.IsEnumKind(kind): |
return GetNameForKind(kind) |
if mojom.IsStructKind(kind) or mojom.IsUnionKind(kind): |
@@ -137,6 +165,8 @@ def GetCppArrayArgWrapperType(kind): |
return _kind_to_cpp_type[kind] |
def GetCppResultWrapperType(kind): |
+ if IsTypemappedKind(kind): |
+ return "const %s&" % GetNativeTypeName(kind) |
if mojom.IsEnumKind(kind): |
return GetNameForKind(kind) |
if mojom.IsStructKind(kind) or mojom.IsUnionKind(kind): |
@@ -175,6 +205,8 @@ def GetCppResultWrapperType(kind): |
raise Exception("Unrecognized kind %s" % kind.spec) |
def GetCppWrapperType(kind): |
+ if IsTypemappedKind(kind): |
+ return GetNativeTypeName(kind) |
if mojom.IsEnumKind(kind): |
return GetNameForKind(kind) |
if mojom.IsStructKind(kind) or mojom.IsUnionKind(kind): |
@@ -207,6 +239,8 @@ def GetCppWrapperType(kind): |
return _kind_to_cpp_type[kind] |
def GetCppConstWrapperType(kind): |
+ if IsTypemappedKind(kind): |
+ return "const %s&" % GetNativeTypeName(kind) |
if mojom.IsStructKind(kind) or mojom.IsUnionKind(kind): |
return "%sPtr" % GetNameForKind(kind) |
if mojom.IsArrayKind(kind): |
@@ -241,6 +275,8 @@ def GetCppConstWrapperType(kind): |
return _kind_to_cpp_type[kind] |
def GetCppFieldType(kind): |
+ if IsNativeOnlyKind(kind): |
+ return "mojo::internal::ArrayPointer<uint8_t>" |
if mojom.IsStructKind(kind): |
return ("mojo::internal::StructPointer<%s_Data>" % |
GetNameForKind(kind, internal=True)) |
@@ -347,7 +383,8 @@ def ShouldInlineUnion(union): |
return not any(mojom.IsMoveOnlyKind(field.kind) for field in union.fields) |
def GetArrayValidateParamsCtorArgs(kind): |
- if mojom.IsStringKind(kind): |
+ if mojom.IsStringKind(kind) or (mojom.IsStructKind(kind) and |
+ kind.native_only): |
expected_num_elements = 0 |
element_is_nullable = False |
element_validate_params = "nullptr" |
@@ -406,6 +443,7 @@ class Generator(generator.Generator): |
"is_enum_kind": mojom.IsEnumKind, |
"is_integral_kind": mojom.IsIntegralKind, |
"is_move_only_kind": mojom.IsMoveOnlyKind, |
+ "is_native_only_kind": IsNativeOnlyKind, |
"is_any_handle_kind": mojom.IsAnyHandleKind, |
"is_interface_kind": mojom.IsInterfaceKind, |
"is_interface_request_kind": mojom.IsInterfaceRequestKind, |
@@ -418,6 +456,7 @@ class Generator(generator.Generator): |
"is_object_kind": mojom.IsObjectKind, |
"is_string_kind": mojom.IsStringKind, |
"is_struct_kind": mojom.IsStructKind, |
+ "is_typemapped_kind": IsTypemappedKind, |
"is_union_kind": mojom.IsUnionKind, |
"passes_associated_kinds": mojom.PassesAssociatedKinds, |
"struct_size": lambda ps: ps.GetTotalSize() + _HEADER_SIZE, |
@@ -426,6 +465,12 @@ class Generator(generator.Generator): |
"under_to_camel": generator.UnderToCamel, |
} |
+ def GetExtraHeaders(self): |
+ extra_headers = set() |
+ for name, entry in self.typemap.iteritems(): |
+ extra_headers.update(entry["headers"]) |
+ return list(extra_headers) |
+ |
def GetJinjaExports(self): |
return { |
"module": self.module, |
@@ -438,6 +483,7 @@ class Generator(generator.Generator): |
"unions": self.GetUnions(), |
"interfaces": self.GetInterfaces(), |
"variant": self.variant, |
+ "extra_headers": self.GetExtraHeaders(), |
} |
@UseJinja("cpp_templates/module.h.tmpl", filters=cpp_filters) |
@@ -453,6 +499,8 @@ class Generator(generator.Generator): |
return self.GetJinjaExports() |
def GenerateFiles(self, args): |
+ global _current_typemap |
+ _current_typemap = self.typemap |
suffix = "-%s" % self.variant if self.variant else "" |
self.Write(self.GenerateModuleHeader(), |
self.MatchMojomFilePath("%s%s.h" % (self.module.name, suffix))) |