Merge pull request #3939 from TGIshib/hex-bug

Fixed bug with negative hex constants (2).
This commit is contained in:
Wouter van Oortmerssen 2016-07-14 10:47:34 -07:00 committed by GitHub
commit 14e7e8260e
2 changed files with 14 additions and 5 deletions

View File

@ -423,6 +423,12 @@ CheckedError Parser::Next() {
return NoError(); return NoError();
} else if (isdigit(static_cast<unsigned char>(c)) || c == '-') { } else if (isdigit(static_cast<unsigned char>(c)) || c == '-') {
const char *start = cursor_ - 1; const char *start = cursor_ - 1;
if (c == '-' && *cursor_ == '0' && (cursor_[1] == 'x' || cursor_[1] == 'X')) {
++start;
++cursor_;
attribute_.append(&c, &c + 1);
c = '0';
}
if (c == '0' && (*cursor_ == 'x' || *cursor_ == 'X')) { if (c == '0' && (*cursor_ == 'x' || *cursor_ == 'X')) {
cursor_++; cursor_++;
while (isxdigit(static_cast<unsigned char>(*cursor_))) cursor_++; while (isxdigit(static_cast<unsigned char>(*cursor_))) cursor_++;

View File

@ -814,14 +814,14 @@ void ErrorTest() {
TestError("table X { Y:byte; } root_type X; { Y:1, Y:2 }", "more than once"); TestError("table X { Y:byte; } root_type X; { Y:1, Y:2 }", "more than once");
} }
float TestValue(const char *json) { template<typename T> T TestValue(const char *json, const char *type_name) {
flatbuffers::Parser parser; flatbuffers::Parser parser;
// Simple schema. // Simple schema.
TEST_EQ(parser.Parse("table X { Y:float; } root_type X;"), true); TEST_EQ(parser.Parse(std::string("table X { Y:" + std::string(type_name) + "; } root_type X;").c_str()), true);
TEST_EQ(parser.Parse(json), true); TEST_EQ(parser.Parse(json), true);
auto root = flatbuffers::GetRoot<float>(parser.builder_.GetBufferPointer()); auto root = flatbuffers::GetRoot<T>(parser.builder_.GetBufferPointer());
// root will point to the table, which is a 32bit vtable offset followed // root will point to the table, which is a 32bit vtable offset followed
// by a float: // by a float:
TEST_EQ(sizeof(flatbuffers::soffset_t), 4); // Test assumes 32bit offsets TEST_EQ(sizeof(flatbuffers::soffset_t), 4); // Test assumes 32bit offsets
@ -833,10 +833,13 @@ bool FloatCompare(float a, float b) { return fabs(a - b) < 0.001; }
// Additional parser testing not covered elsewhere. // Additional parser testing not covered elsewhere.
void ValueTest() { void ValueTest() {
// Test scientific notation numbers. // Test scientific notation numbers.
TEST_EQ(FloatCompare(TestValue("{ Y:0.0314159e+2 }"), 3.14159), true); TEST_EQ(FloatCompare(TestValue<float>("{ Y:0.0314159e+2 }","float"), (float)3.14159), true);
// Test conversion functions. // Test conversion functions.
TEST_EQ(FloatCompare(TestValue("{ Y:cos(rad(180)) }"), -1), true); TEST_EQ(FloatCompare(TestValue<float>("{ Y:cos(rad(180)) }","float"), -1), true);
// Test negative hex constant.
TEST_EQ(TestValue<int>("{ Y:-0x80 }","int") == -128, true);
} }
void EnumStringsTest() { void EnumStringsTest() {