Browse Source

Fix a bug in the serializer

Panagiotis Christopoulos Charitos 5 years ago
parent
commit
d621759874
2 changed files with 10 additions and 8 deletions
  1. 4 4
      src/anki/util/Serializer.h
  2. 6 4
      src/anki/util/Serializer.inl.h

+ 4 - 4
src/anki/util/Serializer.h

@@ -105,7 +105,7 @@ public:
 	{
 		if(!m_err)
 		{
-			m_err = doArrayComplexType(arr, size);
+			m_err = doArrayComplexType(arr, size, memberOffset);
 		}
 	}
 
@@ -147,8 +147,8 @@ private:
 	class PointerInfo
 	{
 	public:
-		PtrSize m_filePos;
-		PtrSize m_value;
+		PtrSize m_filePos; ///< Pointer location inside the file.
+		PtrSize m_value; ///< Where it points to. It's an offset after the header.
 	};
 
 	File* m_file = nullptr;
@@ -160,7 +160,7 @@ private:
 	Error m_err = Error::NONE;
 
 	template<typename T>
-	ANKI_USE_RESULT Error doArrayComplexType(const T* arr, PtrSize size);
+	ANKI_USE_RESULT Error doArrayComplexType(const T* arr, PtrSize size, PtrSize memberOffset);
 
 	template<typename T>
 	ANKI_USE_RESULT Error doDynamicArrayComplexType(const T* arr, PtrSize size, PtrSize memberOffset);

+ 6 - 4
src/anki/util/Serializer.inl.h

@@ -56,14 +56,16 @@ Error BinarySerializer::serializeInternal(const T& x, GenericMemoryPoolAllocator
 		return m_err;
 	}
 
-	// Write all pointers
+	// Write all pointers. Do that now and not while writing the actual shader in order to avoid the file seeks
 	DynamicArrayAuto<PtrSize> pointerFilePositions(m_alloc);
 	for(const PointerInfo& pointer : m_pointerFilePositions)
 	{
 		ANKI_CHECK(m_file->seek(pointer.m_filePos, FileSeekOrigin::BEGINNING));
 		ANKI_CHECK(m_file->write(&pointer.m_value, sizeof(pointer.m_value)));
 
-		pointerFilePositions.emplaceBack(pointer.m_filePos - m_beginOfDataFilePos);
+		const PtrSize offsetAfterHeader = pointer.m_filePos - m_beginOfDataFilePos;
+		ANKI_ASSERT(offsetAfterHeader + sizeof(void*) <= m_eofPos - m_beginOfDataFilePos);
+		pointerFilePositions.emplaceBack(offsetAfterHeader);
 	}
 
 	// Write the pointer offsets
@@ -89,14 +91,14 @@ Error BinarySerializer::serializeInternal(const T& x, GenericMemoryPoolAllocator
 }
 
 template<typename T>
-Error BinarySerializer::doArrayComplexType(const T* arr, PtrSize size)
+Error BinarySerializer::doArrayComplexType(const T* arr, PtrSize size, PtrSize memberOffset)
 {
 	ANKI_ASSERT(arr && size > 0);
 	check();
 	checkStruct<T>();
 
 	// Serialize pointers
-	PtrSize structFilePos = m_structureFilePos.getBack();
+	PtrSize structFilePos = m_structureFilePos.getBack() + memberOffset;
 	for(PtrSize i = 0; i < size; ++i)
 	{
 		m_structureFilePos.emplaceBack(m_alloc, structFilePos);