From b3495e9c7147d28c0f81cfd5fa58b517caaeedf6 Mon Sep 17 00:00:00 2001 From: CyrusNajmabadi Date: Tue, 9 May 2017 16:51:57 -0700 Subject: [PATCH] Restore logic. --- .../Portable/Serialization/ObjectReader.cs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/Compilers/Core/Portable/Serialization/ObjectReader.cs b/src/Compilers/Core/Portable/Serialization/ObjectReader.cs index 6183edf5cfe..ea876f3ffbe 100644 --- a/src/Compilers/Core/Portable/Serialization/ObjectReader.cs +++ b/src/Compilers/Core/Portable/Serialization/ObjectReader.cs @@ -246,9 +246,20 @@ public void Dispose() s_objectListPool.Free(_values); } + + public int GetNextObjectId() + { + var id = _values.Count; + _values.Add(null); + return id; + } + public void AddValue(T value) => _values.Add(value); + public void AddValue(int index, T value) + => _values[index] = value; + public T GetValue(int referenceId) => _values[referenceId]; } @@ -568,11 +579,16 @@ private Type ReadTypeAfterTag() private object ReadObject() { + var objectId = _objectReferenceMap.GetNextObjectId(); + + // reading an object may recurse. So we need to grab our ID up front as we'll + // end up making our sub-objects before we make this object. + var typeReader = _binderSnapshot.GetTypeReaderFromId(this.ReadInt32()); // recursive: read and construct instance immediately from member elements encoding next in the stream var instance = typeReader(this); - _objectReferenceMap.AddValue(instance); + _objectReferenceMap.AddValue(objectId, instance); return instance; } -- GitLab