mirror of
https://github.com/google/flatbuffers.git
synced 2026-07-01 04:41:36 +00:00
Respect shared attribute in Parser (#5885)
Respects the 'shared' field attribute when reading data with Parser.
This commit is contained in:
@@ -859,7 +859,7 @@ class Parser : public ParserState {
|
|||||||
const std::string &name, const Type &type,
|
const std::string &name, const Type &type,
|
||||||
FieldDef **dest);
|
FieldDef **dest);
|
||||||
FLATBUFFERS_CHECKED_ERROR ParseField(StructDef &struct_def);
|
FLATBUFFERS_CHECKED_ERROR ParseField(StructDef &struct_def);
|
||||||
FLATBUFFERS_CHECKED_ERROR ParseString(Value &val);
|
FLATBUFFERS_CHECKED_ERROR ParseString(Value &val, bool use_string_pooling);
|
||||||
FLATBUFFERS_CHECKED_ERROR ParseComma();
|
FLATBUFFERS_CHECKED_ERROR ParseComma();
|
||||||
FLATBUFFERS_CHECKED_ERROR ParseAnyValue(Value &val, FieldDef *field,
|
FLATBUFFERS_CHECKED_ERROR ParseAnyValue(Value &val, FieldDef *field,
|
||||||
size_t parent_fieldn,
|
size_t parent_fieldn,
|
||||||
|
|||||||
@@ -878,10 +878,14 @@ CheckedError Parser::ParseField(StructDef &struct_def) {
|
|||||||
return NoError();
|
return NoError();
|
||||||
}
|
}
|
||||||
|
|
||||||
CheckedError Parser::ParseString(Value &val) {
|
CheckedError Parser::ParseString(Value &val, bool use_string_pooling) {
|
||||||
auto s = attribute_;
|
auto s = attribute_;
|
||||||
EXPECT(kTokenStringConstant);
|
EXPECT(kTokenStringConstant);
|
||||||
val.constant = NumToString(builder_.CreateString(s).o);
|
if (use_string_pooling) {
|
||||||
|
val.constant = NumToString(builder_.CreateSharedString(s).o);
|
||||||
|
} else {
|
||||||
|
val.constant = NumToString(builder_.CreateString(s).o);
|
||||||
|
}
|
||||||
return NoError();
|
return NoError();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -974,7 +978,7 @@ CheckedError Parser::ParseAnyValue(Value &val, FieldDef *field,
|
|||||||
val.constant = NumToString(builder_.GetSize());
|
val.constant = NumToString(builder_.GetSize());
|
||||||
}
|
}
|
||||||
} else if (enum_val->union_type.base_type == BASE_TYPE_STRING) {
|
} else if (enum_val->union_type.base_type == BASE_TYPE_STRING) {
|
||||||
ECHECK(ParseString(val));
|
ECHECK(ParseString(val, field->shared));
|
||||||
} else {
|
} else {
|
||||||
FLATBUFFERS_ASSERT(false);
|
FLATBUFFERS_ASSERT(false);
|
||||||
}
|
}
|
||||||
@@ -984,7 +988,7 @@ CheckedError Parser::ParseAnyValue(Value &val, FieldDef *field,
|
|||||||
ECHECK(ParseTable(*val.type.struct_def, &val.constant, nullptr));
|
ECHECK(ParseTable(*val.type.struct_def, &val.constant, nullptr));
|
||||||
break;
|
break;
|
||||||
case BASE_TYPE_STRING: {
|
case BASE_TYPE_STRING: {
|
||||||
ECHECK(ParseString(val));
|
ECHECK(ParseString(val, field->shared));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case BASE_TYPE_VECTOR: {
|
case BASE_TYPE_VECTOR: {
|
||||||
@@ -3293,6 +3297,7 @@ bool FieldDef::Deserialize(Parser &parser, const reflection::Field *field) {
|
|||||||
nested_flatbuffer = parser.LookupStruct(nested_qualified_name);
|
nested_flatbuffer = parser.LookupStruct(nested_qualified_name);
|
||||||
if (!nested_flatbuffer) return false;
|
if (!nested_flatbuffer) return false;
|
||||||
}
|
}
|
||||||
|
shared = attributes.Lookup("shared") != nullptr;
|
||||||
DeserializeDoc(doc_comment, field->documentation());
|
DeserializeDoc(doc_comment, field->documentation());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user