[fidl] Record sizes in coded types
Coding tables for vectors need to know the element size for the vector.
In most cases, this size is known from the flat::Type. However, when
that type is an identifier (which has size 0), we must perform a lookup
to find the coded type for the identifier. Storing the size in the coded
type gives us the proper element size for such a vector.
TO-898 #done
Change-Id: I66213c0c910f426dd1858f24172c8f780a6c6cb2
diff --git a/system/host/fidl/include/fidl/coded_ast.h b/system/host/fidl/include/fidl/coded_ast.h
index b069b68..8d48ebb 100644
--- a/system/host/fidl/include/fidl/coded_ast.h
+++ b/system/host/fidl/include/fidl/coded_ast.h
@@ -61,11 +61,12 @@
kVector,
};
- Type(Kind kind, std::string coded_name, CodingNeeded coding_needed)
- : kind(kind), coded_name(std::move(coded_name)), coding_needed(coding_needed) {}
+ Type(Kind kind, std::string coded_name, uint32_t size, CodingNeeded coding_needed)
+ : kind(kind), coded_name(std::move(coded_name)), size(size), coding_needed(coding_needed) {}
const Kind kind;
const std::string coded_name;
+ uint32_t size;
const CodingNeeded coding_needed;
};
@@ -86,15 +87,15 @@
}
struct PrimitiveType : public Type {
- PrimitiveType(std::string name, types::PrimitiveSubtype subtype)
- : Type(Kind::kPrimitive, std::move(name), CodingNeeded::kNotNeeded), subtype(subtype) {}
+ PrimitiveType(std::string name, types::PrimitiveSubtype subtype, uint32_t size)
+ : Type(Kind::kPrimitive, std::move(name), size, CodingNeeded::kNotNeeded), subtype(subtype) {}
const types::PrimitiveSubtype subtype;
};
struct HandleType : public Type {
HandleType(std::string name, types::HandleSubtype subtype, types::Nullability nullability)
- : Type(Kind::kHandle, std::move(name), CodingNeeded::kNeeded), subtype(subtype), nullability(nullability) {}
+ : Type(Kind::kHandle, std::move(name), 4u, CodingNeeded::kNeeded), subtype(subtype), nullability(nullability) {}
const types::HandleSubtype subtype;
const types::Nullability nullability;
@@ -102,52 +103,49 @@
struct InterfaceHandleType : public Type {
InterfaceHandleType(std::string name, types::Nullability nullability)
- : Type(Kind::kInterfaceHandle, std::move(name), CodingNeeded::kNeeded), nullability(nullability) {}
+ : Type(Kind::kInterfaceHandle, std::move(name), 4u, CodingNeeded::kNeeded), nullability(nullability) {}
const types::Nullability nullability;
};
struct RequestHandleType : public Type {
RequestHandleType(std::string name, types::Nullability nullability)
- : Type(Kind::kRequestHandle, std::move(name), CodingNeeded::kNeeded), nullability(nullability) {}
+ : Type(Kind::kRequestHandle, std::move(name), 4u, CodingNeeded::kNeeded), nullability(nullability) {}
const types::Nullability nullability;
};
struct StructType : public Type {
StructType(std::string name, std::vector<Field> fields, uint32_t size, CodingNeeded coding_needed)
- : Type(Kind::kStruct, std::move(name), coding_needed), fields(std::move(fields)), size(size) {}
+ : Type(Kind::kStruct, std::move(name), size, coding_needed), fields(std::move(fields)) {}
const std::vector<Field> fields;
- const uint32_t size;
bool referenced_by_pointer = false;
};
struct UnionType : public Type {
UnionType(std::string name, std::vector<const Type*> types, uint32_t data_offset, uint32_t size)
- : Type(Kind::kUnion, std::move(name), SomeTypeIsNeeded(types)),
- types(std::move(types)), data_offset(data_offset), size(size) {}
+ : Type(Kind::kUnion, std::move(name), size, SomeTypeIsNeeded(types)),
+ types(std::move(types)), data_offset(data_offset) {}
const std::vector<const Type*> types;
const uint32_t data_offset;
- const uint32_t size;
bool referenced_by_pointer = false;
};
struct ArrayType : public Type {
ArrayType(std::string name, const Type* element_type, uint32_t array_size,
uint32_t element_size)
- : Type(Kind::kArray, std::move(name), element_type->coding_needed), element_type(element_type), array_size(array_size),
+ : Type(Kind::kArray, std::move(name), array_size, element_type->coding_needed), element_type(element_type),
element_size(element_size) {}
const Type* const element_type;
- const uint32_t array_size;
const uint32_t element_size;
};
struct StringType : public Type {
StringType(std::string name, uint32_t max_size, types::Nullability nullability)
- : Type(Kind::kString, std::move(name), CodingNeeded::kNeeded), max_size(max_size), nullability(nullability) {}
+ : Type(Kind::kString, std::move(name), 16u, CodingNeeded::kNeeded), max_size(max_size), nullability(nullability) {}
const uint32_t max_size;
const types::Nullability nullability;
@@ -156,7 +154,7 @@
struct VectorType : public Type {
VectorType(std::string name, const Type* element_type, uint32_t max_count,
uint32_t element_size, types::Nullability nullability)
- : Type(Kind::kVector, std::move(name), CodingNeeded::kNeeded),
+ : Type(Kind::kVector, std::move(name), 16u, CodingNeeded::kNeeded),
element_type(element_type), max_count(max_count),
element_size(element_size), nullability(nullability) {}
diff --git a/system/host/fidl/lib/tables_generator.cpp b/system/host/fidl/lib/tables_generator.cpp
index 9bdcb73..fc60bd2 100644
--- a/system/host/fidl/lib/tables_generator.cpp
+++ b/system/host/fidl/lib/tables_generator.cpp
@@ -202,7 +202,7 @@
Emit(&tables_file_, " = fidl_type_t(::fidl::FidlCodedArray(&");
Emit(&tables_file_, NameTable(array_type.element_type->coded_name));
Emit(&tables_file_, ", ");
- Emit(&tables_file_, array_type.array_size);
+ Emit(&tables_file_, array_type.size);
Emit(&tables_file_, ", ");
Emit(&tables_file_, array_type.element_size);
Emit(&tables_file_, "));\n\n");
@@ -273,7 +273,7 @@
return iter->second;
auto coded_element_type = Compile(vector_type->element_type.get());
uint32_t max_count = vector_type->element_count.Value();
- uint32_t element_size = vector_type->element_type->size;
+ uint32_t element_size = coded_element_type->size;
StringView element_name = coded_element_type->coded_name;
auto name = NameCodedVector(element_name, max_count, vector_type->nullability);
auto coded_vector_type = std::make_unique<coded::VectorType>(std::move(name), coded_element_type, max_count, element_size, vector_type->nullability);
@@ -321,7 +321,7 @@
if (iter != primitive_type_map_.end())
return iter->second;
auto name = NamePrimitiveSubtype(primitive_type->subtype);
- auto coded_primitive_type = std::make_unique<coded::PrimitiveType>(std::move(name), primitive_type->subtype);
+ auto coded_primitive_type = std::make_unique<coded::PrimitiveType>(std::move(name), primitive_type->subtype, flat::PrimitiveType::SubtypeSize(primitive_type->subtype));
primitive_type_map_[primitive_type] = coded_primitive_type.get();
coded_types_.push_back(std::move(coded_primitive_type));
return coded_types_.back().get();
@@ -377,7 +377,7 @@
case flat::Decl::Kind::kEnum: {
auto enum_decl = static_cast<const flat::Enum*>(decl);
std::string enum_name = NameName(enum_decl->name);
- coded_types_.push_back(std::make_unique<coded::PrimitiveType>(std::move(enum_name), enum_decl->type));
+ coded_types_.push_back(std::make_unique<coded::PrimitiveType>(std::move(enum_name), enum_decl->type, flat::PrimitiveType::SubtypeSize(enum_decl->type)));
named_type_map_[&enum_decl->name] = coded_types_.back().get();
break;
}