Fix expected type of enum values in reflection tables (#4944)
Fixes #4930
This commit is contained in:
parent
a4c362a1ba
commit
a4f9d1bfcc
|
@ -2470,7 +2470,7 @@ struct TypeTable {
|
|||
size_t num_elems; // of type_codes, values, names (but not type_refs).
|
||||
const TypeCode *type_codes; // num_elems count
|
||||
const TypeFunction *type_refs; // less than num_elems entries (see TypeCode).
|
||||
const int32_t *values; // Only set for non-consecutive enum/union or structs.
|
||||
const int64_t *values; // Only set for non-consecutive enum/union or structs.
|
||||
const char * const *names; // Only set if compiled with --reflect-names.
|
||||
};
|
||||
|
||||
|
|
|
@ -88,27 +88,27 @@ inline size_t InlineSize(ElementaryType type, const TypeTable *type_table) {
|
|||
switch (type_table->st) {
|
||||
case ST_TABLE:
|
||||
case ST_UNION: return 4;
|
||||
case ST_STRUCT: return type_table->values[type_table->num_elems];
|
||||
case ST_STRUCT: return static_cast<size_t>(type_table->values[type_table->num_elems]);
|
||||
default: FLATBUFFERS_ASSERT(false); return 1;
|
||||
}
|
||||
default: FLATBUFFERS_ASSERT(false); return 1;
|
||||
}
|
||||
}
|
||||
|
||||
inline int32_t LookupEnum(int32_t enum_val, const int32_t *values,
|
||||
inline int64_t LookupEnum(int64_t enum_val, const int64_t *values,
|
||||
size_t num_values) {
|
||||
if (!values) return enum_val;
|
||||
for (size_t i = 0; i < num_values; i++) {
|
||||
if (enum_val == values[i]) return static_cast<int32_t>(i);
|
||||
if (enum_val == values[i]) return static_cast<int64_t>(i);
|
||||
}
|
||||
return -1; // Unknown enum value.
|
||||
}
|
||||
|
||||
template<typename T> const char *EnumName(T tval, const TypeTable *type_table) {
|
||||
if (!type_table || !type_table->names) return nullptr;
|
||||
auto i = LookupEnum(static_cast<int32_t>(tval), type_table->values,
|
||||
auto i = LookupEnum(static_cast<int64_t>(tval), type_table->values,
|
||||
type_table->num_elems);
|
||||
if (i >= 0 && i < static_cast<int32_t>(type_table->num_elems)) {
|
||||
if (i >= 0 && i < static_cast<int64_t>(type_table->num_elems)) {
|
||||
return type_table->names[i];
|
||||
}
|
||||
return nullptr;
|
||||
|
|
|
@ -704,7 +704,7 @@ inline const flatbuffers::TypeTable *Vec3TypeTable() {
|
|||
{ flatbuffers::ET_FLOAT, 0, -1 },
|
||||
{ flatbuffers::ET_FLOAT, 0, -1 }
|
||||
};
|
||||
static const int32_t values[] = { 0, 4, 8, 12 };
|
||||
static const int64_t values[] = { 0, 4, 8, 12 };
|
||||
static const char * const names[] = {
|
||||
"x",
|
||||
"y",
|
||||
|
|
|
@ -863,7 +863,7 @@ class CppGenerator : public BaseGenerator {
|
|||
code_ += " };";
|
||||
}
|
||||
if (!vs.empty()) {
|
||||
code_ += " static const int32_t values[] = { {{VALUES}} };";
|
||||
code_ += " static const int64_t values[] = { {{VALUES}} };";
|
||||
}
|
||||
auto has_names =
|
||||
num_fields && parser_.opts.mini_reflect == IDLOptions::kTypesAndNames;
|
||||
|
|
|
@ -2358,7 +2358,7 @@ inline const flatbuffers::TypeTable *ColorTypeTable() {
|
|||
static const flatbuffers::TypeFunction type_refs[] = {
|
||||
ColorTypeTable
|
||||
};
|
||||
static const int32_t values[] = { 1, 2, 8 };
|
||||
static const int64_t values[] = { 1, 2, 8 };
|
||||
static const char * const names[] = {
|
||||
"Red",
|
||||
"Green",
|
||||
|
@ -2421,7 +2421,7 @@ inline const flatbuffers::TypeTable *TestTypeTable() {
|
|||
{ flatbuffers::ET_SHORT, 0, -1 },
|
||||
{ flatbuffers::ET_CHAR, 0, -1 }
|
||||
};
|
||||
static const int32_t values[] = { 0, 2, 4 };
|
||||
static const int64_t values[] = { 0, 2, 4 };
|
||||
static const char * const names[] = {
|
||||
"a",
|
||||
"b"
|
||||
|
@ -2461,7 +2461,7 @@ inline const flatbuffers::TypeTable *Vec3TypeTable() {
|
|||
ColorTypeTable,
|
||||
TestTypeTable
|
||||
};
|
||||
static const int32_t values[] = { 0, 4, 8, 16, 24, 26, 32 };
|
||||
static const int64_t values[] = { 0, 4, 8, 16, 24, 26, 32 };
|
||||
static const char * const names[] = {
|
||||
"x",
|
||||
"y",
|
||||
|
@ -2481,7 +2481,7 @@ inline const flatbuffers::TypeTable *AbilityTypeTable() {
|
|||
{ flatbuffers::ET_UINT, 0, -1 },
|
||||
{ flatbuffers::ET_UINT, 0, -1 }
|
||||
};
|
||||
static const int32_t values[] = { 0, 4, 8 };
|
||||
static const int64_t values[] = { 0, 4, 8 };
|
||||
static const char * const names[] = {
|
||||
"id",
|
||||
"distance"
|
||||
|
|
|
@ -161,7 +161,7 @@ inline const flatbuffers::TypeTable *StructInNestedNSTypeTable() {
|
|||
{ flatbuffers::ET_INT, 0, -1 },
|
||||
{ flatbuffers::ET_INT, 0, -1 }
|
||||
};
|
||||
static const int32_t values[] = { 0, 4, 8 };
|
||||
static const int64_t values[] = { 0, 4, 8 };
|
||||
static const char * const names[] = {
|
||||
"a",
|
||||
"b"
|
||||
|
|
|
@ -718,7 +718,7 @@ inline const flatbuffers::TypeTable *RapunzelTypeTable() {
|
|||
static const flatbuffers::TypeCode type_codes[] = {
|
||||
{ flatbuffers::ET_INT, 0, -1 }
|
||||
};
|
||||
static const int32_t values[] = { 0, 4 };
|
||||
static const int64_t values[] = { 0, 4 };
|
||||
static const char * const names[] = {
|
||||
"hair_length"
|
||||
};
|
||||
|
@ -732,7 +732,7 @@ inline const flatbuffers::TypeTable *BookReaderTypeTable() {
|
|||
static const flatbuffers::TypeCode type_codes[] = {
|
||||
{ flatbuffers::ET_INT, 0, -1 }
|
||||
};
|
||||
static const int32_t values[] = { 0, 4 };
|
||||
static const int64_t values[] = { 0, 4 };
|
||||
static const char * const names[] = {
|
||||
"books_read"
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue