mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-29 20:42:01 +00:00
Made error checking macros less prone to clashes.
Change-Id: Ieb252ce01446551699d935507bc95ee286fe1ddd Tested: on Linux.
This commit is contained in:
@@ -375,9 +375,10 @@ class CheckedError {
|
|||||||
// Additionally, in GCC we can get these errors statically, for additional
|
// Additionally, in GCC we can get these errors statically, for additional
|
||||||
// assurance:
|
// assurance:
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
#define CHECKED_ERROR CheckedError __attribute__((warn_unused_result))
|
#define FLATBUFFERS_CHECKED_ERROR CheckedError \
|
||||||
|
__attribute__((warn_unused_result))
|
||||||
#else
|
#else
|
||||||
#define CHECKED_ERROR CheckedError
|
#define FLATBUFFERS_CHECKED_ERROR CheckedError
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
class Parser {
|
class Parser {
|
||||||
@@ -435,51 +436,56 @@ class Parser {
|
|||||||
// See reflection/reflection.fbs
|
// See reflection/reflection.fbs
|
||||||
void Serialize();
|
void Serialize();
|
||||||
|
|
||||||
CHECKED_ERROR CheckBitsFit(int64_t val, size_t bits);
|
FLATBUFFERS_CHECKED_ERROR CheckBitsFit(int64_t val, size_t bits);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CHECKED_ERROR Error(const std::string &msg);
|
FLATBUFFERS_CHECKED_ERROR Error(const std::string &msg);
|
||||||
CHECKED_ERROR ParseHexNum(int nibbles, int64_t *val);
|
FLATBUFFERS_CHECKED_ERROR ParseHexNum(int nibbles, int64_t *val);
|
||||||
CHECKED_ERROR Next();
|
FLATBUFFERS_CHECKED_ERROR Next();
|
||||||
bool Is(int t);
|
bool Is(int t);
|
||||||
CHECKED_ERROR Expect(int t);
|
FLATBUFFERS_CHECKED_ERROR Expect(int t);
|
||||||
std::string TokenToStringId(int t);
|
std::string TokenToStringId(int t);
|
||||||
EnumDef *LookupEnum(const std::string &id);
|
EnumDef *LookupEnum(const std::string &id);
|
||||||
CHECKED_ERROR ParseNamespacing(std::string *id, std::string *last);
|
FLATBUFFERS_CHECKED_ERROR ParseNamespacing(std::string *id,
|
||||||
CHECKED_ERROR ParseTypeIdent(Type &type);
|
std::string *last);
|
||||||
CHECKED_ERROR ParseType(Type &type);
|
FLATBUFFERS_CHECKED_ERROR ParseTypeIdent(Type &type);
|
||||||
CHECKED_ERROR AddField(StructDef &struct_def, const std::string &name,
|
FLATBUFFERS_CHECKED_ERROR ParseType(Type &type);
|
||||||
const Type &type, FieldDef **dest);
|
FLATBUFFERS_CHECKED_ERROR AddField(StructDef &struct_def,
|
||||||
CHECKED_ERROR ParseField(StructDef &struct_def);
|
const std::string &name, const Type &type,
|
||||||
CHECKED_ERROR ParseAnyValue(Value &val, FieldDef *field, size_t parent_fieldn);
|
FieldDef **dest);
|
||||||
CHECKED_ERROR ParseTable(const StructDef &struct_def, std::string *value,
|
FLATBUFFERS_CHECKED_ERROR ParseField(StructDef &struct_def);
|
||||||
uoffset_t *ovalue);
|
FLATBUFFERS_CHECKED_ERROR ParseAnyValue(Value &val, FieldDef *field,
|
||||||
|
size_t parent_fieldn);
|
||||||
|
FLATBUFFERS_CHECKED_ERROR ParseTable(const StructDef &struct_def,
|
||||||
|
std::string *value, uoffset_t *ovalue);
|
||||||
void SerializeStruct(const StructDef &struct_def, const Value &val);
|
void SerializeStruct(const StructDef &struct_def, const Value &val);
|
||||||
void AddVector(bool sortbysize, int count);
|
void AddVector(bool sortbysize, int count);
|
||||||
CHECKED_ERROR ParseVector(const Type &type, uoffset_t *ovalue);
|
FLATBUFFERS_CHECKED_ERROR ParseVector(const Type &type, uoffset_t *ovalue);
|
||||||
CHECKED_ERROR ParseMetaData(Definition &def);
|
FLATBUFFERS_CHECKED_ERROR ParseMetaData(Definition &def);
|
||||||
CHECKED_ERROR TryTypedValue(int dtoken, bool check, Value &e, BaseType req,
|
FLATBUFFERS_CHECKED_ERROR TryTypedValue(int dtoken, bool check, Value &e,
|
||||||
bool *destmatch);
|
BaseType req, bool *destmatch);
|
||||||
CHECKED_ERROR ParseHash(Value &e, FieldDef* field);
|
FLATBUFFERS_CHECKED_ERROR ParseHash(Value &e, FieldDef* field);
|
||||||
CHECKED_ERROR ParseSingleValue(Value &e);
|
FLATBUFFERS_CHECKED_ERROR ParseSingleValue(Value &e);
|
||||||
CHECKED_ERROR ParseIntegerFromString(Type &type, int64_t *result);
|
FLATBUFFERS_CHECKED_ERROR ParseIntegerFromString(Type &type, int64_t *result);
|
||||||
StructDef *LookupCreateStruct(const std::string &name,
|
StructDef *LookupCreateStruct(const std::string &name,
|
||||||
bool create_if_new = true,
|
bool create_if_new = true,
|
||||||
bool definition = false);
|
bool definition = false);
|
||||||
CHECKED_ERROR ParseEnum(bool is_union, EnumDef **dest);
|
FLATBUFFERS_CHECKED_ERROR ParseEnum(bool is_union, EnumDef **dest);
|
||||||
CHECKED_ERROR ParseNamespace();
|
FLATBUFFERS_CHECKED_ERROR ParseNamespace();
|
||||||
CHECKED_ERROR StartStruct(const std::string &name, StructDef **dest);
|
FLATBUFFERS_CHECKED_ERROR StartStruct(const std::string &name,
|
||||||
CHECKED_ERROR ParseDecl();
|
StructDef **dest);
|
||||||
CHECKED_ERROR ParseProtoFields(StructDef *struct_def, bool isextend,
|
FLATBUFFERS_CHECKED_ERROR ParseDecl();
|
||||||
bool inside_oneof);
|
FLATBUFFERS_CHECKED_ERROR ParseProtoFields(StructDef *struct_def,
|
||||||
CHECKED_ERROR ParseProtoOption();
|
bool isextend, bool inside_oneof);
|
||||||
CHECKED_ERROR ParseProtoKey();
|
FLATBUFFERS_CHECKED_ERROR ParseProtoOption();
|
||||||
CHECKED_ERROR ParseProtoDecl();
|
FLATBUFFERS_CHECKED_ERROR ParseProtoKey();
|
||||||
CHECKED_ERROR ParseProtoCurliesOrIdent();
|
FLATBUFFERS_CHECKED_ERROR ParseProtoDecl();
|
||||||
CHECKED_ERROR ParseTypeFromProtoType(Type *type);
|
FLATBUFFERS_CHECKED_ERROR ParseProtoCurliesOrIdent();
|
||||||
|
FLATBUFFERS_CHECKED_ERROR ParseTypeFromProtoType(Type *type);
|
||||||
|
|
||||||
CHECKED_ERROR DoParse(const char *_source, const char **include_paths,
|
FLATBUFFERS_CHECKED_ERROR DoParse(const char *_source,
|
||||||
const char *source_filename);
|
const char **include_paths,
|
||||||
|
const char *source_filename);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SymbolTable<StructDef> structs_;
|
SymbolTable<StructDef> structs_;
|
||||||
|
|||||||
@@ -43,7 +43,13 @@ static_assert(BASE_TYPE_UNION ==
|
|||||||
static_cast<BaseType>(reflection::Union),
|
static_cast<BaseType>(reflection::Union),
|
||||||
"enums don't match");
|
"enums don't match");
|
||||||
|
|
||||||
|
// Any parsing calls have to be wrapped in this macro, which automates
|
||||||
|
// handling of recursive error checking a bit. It will check the received
|
||||||
|
// CheckedError object, and return straight away on error.
|
||||||
#define ECHECK(call) { auto ce = (call); if (ce.Check()) return ce; }
|
#define ECHECK(call) { auto ce = (call); if (ce.Check()) return ce; }
|
||||||
|
|
||||||
|
// These two functions are called hundreds of times below, so define a short
|
||||||
|
// form:
|
||||||
#define NEXT() ECHECK(Next())
|
#define NEXT() ECHECK(Next())
|
||||||
#define EXPECT(tok) ECHECK(Expect(tok))
|
#define EXPECT(tok) ECHECK(Expect(tok))
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user