mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-20 11:55:07 +00:00
[C++, JSON] Fix nullptr access when reading a key with a default value. (#6375)
This commit fixes handling of default and NULL `key` fields in `Parser::ParseVector` (#5928). The JSON generator updated. It outputs `key` fields even if the `--force-defaults` option is inactive. Additional test cases for `key` added.
This commit is contained in:
@@ -207,6 +207,9 @@ public struct Monster : IFlatbufferObject
|
||||
public byte[] GetTestrequirednestedflatbufferArray() { return __p.__vector_as_array<byte>(102); }
|
||||
public MyGame.Example.Monster? GetTestrequirednestedflatbufferAsMonster() { int o = __p.__offset(102); return o != 0 ? (MyGame.Example.Monster?)(new MyGame.Example.Monster()).__assign(__p.__indirect(__p.__vector(o)), __p.bb) : null; }
|
||||
public bool MutateTestrequirednestedflatbuffer(int j, byte testrequirednestedflatbuffer) { int o = __p.__offset(102); if (o != 0) { __p.bb.Put(__p.__vector(o) + j * 1, testrequirednestedflatbuffer); return true; } else { return false; } }
|
||||
public MyGame.Example.Stat? ScalarKeySortedTables(int j) { int o = __p.__offset(104); return o != 0 ? (MyGame.Example.Stat?)(new MyGame.Example.Stat()).__assign(__p.__indirect(__p.__vector(o) + j * 4), __p.bb) : null; }
|
||||
public int ScalarKeySortedTablesLength { get { int o = __p.__offset(104); return o != 0 ? __p.__vector_len(o) : 0; } }
|
||||
public MyGame.Example.Stat? ScalarKeySortedTablesByKey(ushort key) { int o = __p.__offset(104); return o != 0 ? MyGame.Example.Stat.__lookup_by_key(__p.__vector(o), key, __p.bb) : null; }
|
||||
|
||||
public static Offset<MyGame.Example.Monster> CreateMonster(FlatBufferBuilder builder,
|
||||
MyGame.Example.Vec3T pos = null,
|
||||
@@ -257,8 +260,9 @@ public struct Monster : IFlatbufferObject
|
||||
int any_ambiguousOffset = 0,
|
||||
VectorOffset vector_of_enumsOffset = default(VectorOffset),
|
||||
MyGame.Example.Race signed_enum = MyGame.Example.Race.None,
|
||||
VectorOffset testrequirednestedflatbufferOffset = default(VectorOffset)) {
|
||||
builder.StartTable(50);
|
||||
VectorOffset testrequirednestedflatbufferOffset = default(VectorOffset),
|
||||
VectorOffset scalar_key_sorted_tablesOffset = default(VectorOffset)) {
|
||||
builder.StartTable(51);
|
||||
Monster.AddNonOwningReference(builder, non_owning_reference);
|
||||
Monster.AddCoOwningReference(builder, co_owning_reference);
|
||||
Monster.AddSingleWeakReference(builder, single_weak_reference);
|
||||
@@ -266,6 +270,7 @@ public struct Monster : IFlatbufferObject
|
||||
Monster.AddTesthashs64Fnv1a(builder, testhashs64_fnv1a);
|
||||
Monster.AddTesthashu64Fnv1(builder, testhashu64_fnv1);
|
||||
Monster.AddTesthashs64Fnv1(builder, testhashs64_fnv1);
|
||||
Monster.AddScalarKeySortedTables(builder, scalar_key_sorted_tablesOffset);
|
||||
Monster.AddTestrequirednestedflatbuffer(builder, testrequirednestedflatbufferOffset);
|
||||
Monster.AddVectorOfEnums(builder, vector_of_enumsOffset);
|
||||
Monster.AddAnyAmbiguous(builder, any_ambiguousOffset);
|
||||
@@ -311,7 +316,7 @@ public struct Monster : IFlatbufferObject
|
||||
return Monster.EndMonster(builder);
|
||||
}
|
||||
|
||||
public static void StartMonster(FlatBufferBuilder builder) { builder.StartTable(50); }
|
||||
public static void StartMonster(FlatBufferBuilder builder) { builder.StartTable(51); }
|
||||
public static void AddPos(FlatBufferBuilder builder, Offset<MyGame.Example.Vec3> posOffset) { builder.AddStruct(0, posOffset.Value, 0); }
|
||||
public static void AddMana(FlatBufferBuilder builder, short mana) { builder.AddShort(1, mana, 150); }
|
||||
public static void AddHp(FlatBufferBuilder builder, short hp) { builder.AddShort(2, hp, 100); }
|
||||
@@ -412,6 +417,10 @@ public struct Monster : IFlatbufferObject
|
||||
public static VectorOffset CreateTestrequirednestedflatbufferVector(FlatBufferBuilder builder, byte[] data) { builder.StartVector(1, data.Length, 1); for (int i = data.Length - 1; i >= 0; i--) builder.AddByte(data[i]); return builder.EndVector(); }
|
||||
public static VectorOffset CreateTestrequirednestedflatbufferVectorBlock(FlatBufferBuilder builder, byte[] data) { builder.StartVector(1, data.Length, 1); builder.Add(data); return builder.EndVector(); }
|
||||
public static void StartTestrequirednestedflatbufferVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(1, numElems, 1); }
|
||||
public static void AddScalarKeySortedTables(FlatBufferBuilder builder, VectorOffset scalarKeySortedTablesOffset) { builder.AddOffset(50, scalarKeySortedTablesOffset.Value, 0); }
|
||||
public static VectorOffset CreateScalarKeySortedTablesVector(FlatBufferBuilder builder, Offset<MyGame.Example.Stat>[] data) { builder.StartVector(4, data.Length, 4); for (int i = data.Length - 1; i >= 0; i--) builder.AddOffset(data[i].Value); return builder.EndVector(); }
|
||||
public static VectorOffset CreateScalarKeySortedTablesVectorBlock(FlatBufferBuilder builder, Offset<MyGame.Example.Stat>[] data) { builder.StartVector(4, data.Length, 4); builder.Add(data); return builder.EndVector(); }
|
||||
public static void StartScalarKeySortedTablesVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(4, numElems, 4); }
|
||||
public static Offset<MyGame.Example.Monster> EndMonster(FlatBufferBuilder builder) {
|
||||
int o = builder.EndTable();
|
||||
builder.Required(o, 10); // name
|
||||
@@ -555,6 +564,8 @@ public struct Monster : IFlatbufferObject
|
||||
_o.SignedEnum = this.SignedEnum;
|
||||
_o.Testrequirednestedflatbuffer = new List<byte>();
|
||||
for (var _j = 0; _j < this.TestrequirednestedflatbufferLength; ++_j) {_o.Testrequirednestedflatbuffer.Add(this.Testrequirednestedflatbuffer(_j));}
|
||||
_o.ScalarKeySortedTables = new List<MyGame.Example.StatT>();
|
||||
for (var _j = 0; _j < this.ScalarKeySortedTablesLength; ++_j) {_o.ScalarKeySortedTables.Add(this.ScalarKeySortedTables(_j).HasValue ? this.ScalarKeySortedTables(_j).Value.UnPack() : null);}
|
||||
}
|
||||
public static Offset<MyGame.Example.Monster> Pack(FlatBufferBuilder builder, MonsterT _o) {
|
||||
if (_o == null) return default(Offset<MyGame.Example.Monster>);
|
||||
@@ -671,6 +682,12 @@ public struct Monster : IFlatbufferObject
|
||||
var __testrequirednestedflatbuffer = _o.Testrequirednestedflatbuffer.ToArray();
|
||||
_testrequirednestedflatbuffer = CreateTestrequirednestedflatbufferVector(builder, __testrequirednestedflatbuffer);
|
||||
}
|
||||
var _scalar_key_sorted_tables = default(VectorOffset);
|
||||
if (_o.ScalarKeySortedTables != null) {
|
||||
var __scalar_key_sorted_tables = new Offset<MyGame.Example.Stat>[_o.ScalarKeySortedTables.Count];
|
||||
for (var _j = 0; _j < __scalar_key_sorted_tables.Length; ++_j) { __scalar_key_sorted_tables[_j] = MyGame.Example.Stat.Pack(builder, _o.ScalarKeySortedTables[_j]); }
|
||||
_scalar_key_sorted_tables = CreateScalarKeySortedTablesVector(builder, __scalar_key_sorted_tables);
|
||||
}
|
||||
return CreateMonster(
|
||||
builder,
|
||||
_o.Pos,
|
||||
@@ -721,7 +738,8 @@ public struct Monster : IFlatbufferObject
|
||||
_any_ambiguous,
|
||||
_vector_of_enums,
|
||||
_o.SignedEnum,
|
||||
_testrequirednestedflatbuffer);
|
||||
_testrequirednestedflatbuffer,
|
||||
_scalar_key_sorted_tables);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -866,6 +884,8 @@ public class MonsterT
|
||||
public MyGame.Example.Race SignedEnum { get; set; }
|
||||
[Newtonsoft.Json.JsonProperty("testrequirednestedflatbuffer")]
|
||||
public List<byte> Testrequirednestedflatbuffer { get; set; }
|
||||
[Newtonsoft.Json.JsonProperty("scalar_key_sorted_tables")]
|
||||
public List<MyGame.Example.StatT> ScalarKeySortedTables { get; set; }
|
||||
|
||||
public MonsterT() {
|
||||
this.Pos = new MyGame.Example.Vec3T();
|
||||
@@ -914,6 +934,7 @@ public class MonsterT
|
||||
this.VectorOfEnums = null;
|
||||
this.SignedEnum = MyGame.Example.Race.None;
|
||||
this.Testrequirednestedflatbuffer = null;
|
||||
this.ScalarKeySortedTables = null;
|
||||
}
|
||||
|
||||
public static MonsterT DeserializeFromJson(string jsonText) {
|
||||
|
||||
Reference in New Issue
Block a user