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).
|
size_t num_elems; // of type_codes, values, names (but not type_refs).
|
||||||
const TypeCode *type_codes; // num_elems count
|
const TypeCode *type_codes; // num_elems count
|
||||||
const TypeFunction *type_refs; // less than num_elems entries (see TypeCode).
|
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.
|
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) {
|
switch (type_table->st) {
|
||||||
case ST_TABLE:
|
case ST_TABLE:
|
||||||
case ST_UNION: return 4;
|
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;
|
||||||
}
|
}
|
||||||
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) {
|
size_t num_values) {
|
||||||
if (!values) return enum_val;
|
if (!values) return enum_val;
|
||||||
for (size_t i = 0; i < num_values; i++) {
|
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.
|
return -1; // Unknown enum value.
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T> const char *EnumName(T tval, const TypeTable *type_table) {
|
template<typename T> const char *EnumName(T tval, const TypeTable *type_table) {
|
||||||
if (!type_table || !type_table->names) return nullptr;
|
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);
|
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 type_table->names[i];
|
||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
|
@ -704,7 +704,7 @@ inline const flatbuffers::TypeTable *Vec3TypeTable() {
|
||||||
{ flatbuffers::ET_FLOAT, 0, -1 },
|
{ flatbuffers::ET_FLOAT, 0, -1 },
|
||||||
{ 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[] = {
|
static const char * const names[] = {
|
||||||
"x",
|
"x",
|
||||||
"y",
|
"y",
|
||||||
|
|
|
@ -863,7 +863,7 @@ class CppGenerator : public BaseGenerator {
|
||||||
code_ += " };";
|
code_ += " };";
|
||||||
}
|
}
|
||||||
if (!vs.empty()) {
|
if (!vs.empty()) {
|
||||||
code_ += " static const int32_t values[] = { {{VALUES}} };";
|
code_ += " static const int64_t values[] = { {{VALUES}} };";
|
||||||
}
|
}
|
||||||
auto has_names =
|
auto has_names =
|
||||||
num_fields && parser_.opts.mini_reflect == IDLOptions::kTypesAndNames;
|
num_fields && parser_.opts.mini_reflect == IDLOptions::kTypesAndNames;
|
||||||
|
|
|
@ -2358,7 +2358,7 @@ inline const flatbuffers::TypeTable *ColorTypeTable() {
|
||||||
static const flatbuffers::TypeFunction type_refs[] = {
|
static const flatbuffers::TypeFunction type_refs[] = {
|
||||||
ColorTypeTable
|
ColorTypeTable
|
||||||
};
|
};
|
||||||
static const int32_t values[] = { 1, 2, 8 };
|
static const int64_t values[] = { 1, 2, 8 };
|
||||||
static const char * const names[] = {
|
static const char * const names[] = {
|
||||||
"Red",
|
"Red",
|
||||||
"Green",
|
"Green",
|
||||||
|
@ -2421,7 +2421,7 @@ inline const flatbuffers::TypeTable *TestTypeTable() {
|
||||||
{ flatbuffers::ET_SHORT, 0, -1 },
|
{ flatbuffers::ET_SHORT, 0, -1 },
|
||||||
{ flatbuffers::ET_CHAR, 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[] = {
|
static const char * const names[] = {
|
||||||
"a",
|
"a",
|
||||||
"b"
|
"b"
|
||||||
|
@ -2461,7 +2461,7 @@ inline const flatbuffers::TypeTable *Vec3TypeTable() {
|
||||||
ColorTypeTable,
|
ColorTypeTable,
|
||||||
TestTypeTable
|
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[] = {
|
static const char * const names[] = {
|
||||||
"x",
|
"x",
|
||||||
"y",
|
"y",
|
||||||
|
@ -2481,7 +2481,7 @@ inline const flatbuffers::TypeTable *AbilityTypeTable() {
|
||||||
{ flatbuffers::ET_UINT, 0, -1 },
|
{ flatbuffers::ET_UINT, 0, -1 },
|
||||||
{ 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[] = {
|
static const char * const names[] = {
|
||||||
"id",
|
"id",
|
||||||
"distance"
|
"distance"
|
||||||
|
|
|
@ -161,7 +161,7 @@ inline const flatbuffers::TypeTable *StructInNestedNSTypeTable() {
|
||||||
{ flatbuffers::ET_INT, 0, -1 },
|
{ flatbuffers::ET_INT, 0, -1 },
|
||||||
{ 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[] = {
|
static const char * const names[] = {
|
||||||
"a",
|
"a",
|
||||||
"b"
|
"b"
|
||||||
|
|
|
@ -718,7 +718,7 @@ inline const flatbuffers::TypeTable *RapunzelTypeTable() {
|
||||||
static const flatbuffers::TypeCode type_codes[] = {
|
static const flatbuffers::TypeCode type_codes[] = {
|
||||||
{ flatbuffers::ET_INT, 0, -1 }
|
{ flatbuffers::ET_INT, 0, -1 }
|
||||||
};
|
};
|
||||||
static const int32_t values[] = { 0, 4 };
|
static const int64_t values[] = { 0, 4 };
|
||||||
static const char * const names[] = {
|
static const char * const names[] = {
|
||||||
"hair_length"
|
"hair_length"
|
||||||
};
|
};
|
||||||
|
@ -732,7 +732,7 @@ inline const flatbuffers::TypeTable *BookReaderTypeTable() {
|
||||||
static const flatbuffers::TypeCode type_codes[] = {
|
static const flatbuffers::TypeCode type_codes[] = {
|
||||||
{ flatbuffers::ET_INT, 0, -1 }
|
{ flatbuffers::ET_INT, 0, -1 }
|
||||||
};
|
};
|
||||||
static const int32_t values[] = { 0, 4 };
|
static const int64_t values[] = { 0, 4 };
|
||||||
static const char * const names[] = {
|
static const char * const names[] = {
|
||||||
"books_read"
|
"books_read"
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue