Fix expected type of enum values in reflection tables (#4944)

Fixes #4930
This commit is contained in:
Michael Edwards 2018-10-08 23:29:29 +02:00 committed by Wouter van Oortmerssen
parent a4c362a1ba
commit a4f9d1bfcc
7 changed files with 15 additions and 15 deletions

View File

@ -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.
};

View File

@ -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;

View File

@ -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",

View File

@ -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;

View File

@ -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"

View File

@ -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"

View File

@ -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"
};