Browse Source

Large collection fixes

Brian Fiete 2 years ago
parent
commit
d0de4776f3

+ 2 - 1
BeefLibs/corlib/src/Collections/Dictionary.bf

@@ -364,6 +364,7 @@ namespace System.Collections
 #unwarn
 #unwarn
 			if (sizeof(int_cosize) == 8)
 			if (sizeof(int_cosize) == 8)
 				return (int_cosize)(hashCode & 0x7FFFFFFF'FFFFFFFFL);
 				return (int_cosize)(hashCode & 0x7FFFFFFF'FFFFFFFFL);
+#unwarn
 			return ((int32)hashCode ^ (int32)((int64)hashCode >> 33)) & 0x7FFFFFFF;
 			return ((int32)hashCode ^ (int32)((int64)hashCode >> 33)) & 0x7FFFFFFF;
 		}
 		}
 
 
@@ -629,7 +630,7 @@ namespace System.Collections
 			return oldPtr;
 			return oldPtr;
 		}
 		}
 
 
-		private bool RemoveEntry(int32 hashCode, int_cosize index)
+		private bool RemoveEntry(int_cosize hashCode, int_cosize index)
 		{
 		{
 			if (mBuckets != null)
 			if (mBuckets != null)
 			{
 			{

+ 1 - 1
BeefLibs/corlib/src/Collections/HashSet.bf

@@ -1220,7 +1220,7 @@ namespace System.Collections
 		public struct Enumerator : IEnumerator<T>
 		public struct Enumerator : IEnumerator<T>
 		{
 		{
 			private HashSet<T> mSet;
 			private HashSet<T> mSet;
-			private int32 mIndex;
+			private int_cosize mIndex;
 #if VERSION_HASHSET
 #if VERSION_HASHSET
 			private int32 mVersion;
 			private int32 mVersion;
 #endif
 #endif

+ 2 - 1
BeefLibs/corlib/src/Collections/List.bf

@@ -252,7 +252,7 @@ namespace System.Collections
 			get
 			get
 			{
 			{
 				return ref mItems[index.Get(mSize)];
 				return ref mItems[index.Get(mSize)];
-			}
+			} 
 
 
 			[Checked]
 			[Checked]
 			set
 			set
@@ -330,6 +330,7 @@ namespace System.Collections
 
 
 		T* Realloc(int newSize, bool autoFree)
 		T* Realloc(int newSize, bool autoFree)
 		{
 		{
+			Runtime.Assert(newSize <= int_cosize.MaxValue);
 			T* oldAlloc = null;
 			T* oldAlloc = null;
 			if (newSize > 0)
 			if (newSize > 0)
 			{
 			{

+ 17 - 5
BeefLibs/corlib/src/IO/FileStream.bf

@@ -280,6 +280,11 @@ namespace System.IO
 
 
 	class BufferedFileStream : BufferedStream, IFileStream
 	class BufferedFileStream : BufferedStream, IFileStream
 	{
 	{
+		public struct PositionRestorer : this(BufferedFileStream stream, int prevPosition), IDisposable
+		{
+			public void Dispose() => stream.Position = prevPosition;
+		}
+
 		protected Platform.BfpFile* mBfpFile;
 		protected Platform.BfpFile* mBfpFile;
 		protected int64 mBfpFilePos;
 		protected int64 mBfpFilePos;
 		FileAccess mFileAccess;
 		FileAccess mFileAccess;
@@ -329,11 +334,6 @@ namespace System.IO
 			Delete();
 			Delete();
 		}
 		}
 
 
-		protected virtual void Delete()
-		{
-			Close();
-		}
-
 		public this(Platform.BfpFile* handle, FileAccess access, int32 bufferSize, bool isAsync)
 		public this(Platform.BfpFile* handle, FileAccess access, int32 bufferSize, bool isAsync)
 		{
 		{
 			mBfpFile = handle;
 			mBfpFile = handle;
@@ -440,6 +440,18 @@ namespace System.IO
 			return .Ok;
 			return .Ok;
 		}
 		}
 
 
+		public PositionRestorer PushPosition(int position)
+		{
+			PositionRestorer restorer = .(this, Position);
+			Position = position;
+			return restorer;
+		}
+
+		protected virtual void Delete()
+		{
+			Close();
+		}
+
 		public override Result<void> Seek(int64 pos, SeekKind seekKind = .Absolute)
 		public override Result<void> Seek(int64 pos, SeekKind seekKind = .Absolute)
 		{
 		{
 			int64 newPos;
 			int64 newPos;

+ 3 - 2
BeefLibs/corlib/src/String.bf

@@ -756,7 +756,7 @@ namespace System
 		void Realloc(int newSize)
 		void Realloc(int newSize)
 		{
 		{
 			Debug.Assert(AllocSize > 0, "String has been frozen");
 			Debug.Assert(AllocSize > 0, "String has been frozen");
-			Debug.Assert((uint)newSize <= cSizeFlags);
+			Runtime.Assert((uint)newSize <= cSizeFlags);
 			char8* newPtr = new:this char8[newSize]* (?);
 			char8* newPtr = new:this char8[newSize]* (?);
 			Internal.MemCpy(newPtr, Ptr, mLength);
 			Internal.MemCpy(newPtr, Ptr, mLength);
 #if VALGRIND
 #if VALGRIND
@@ -776,8 +776,9 @@ namespace System
 
 
 		void Realloc(char8* newPtr, int newSize)
 		void Realloc(char8* newPtr, int newSize)
 		{
 		{
+			Runtime.Assert(newSize <= int_cosize.MaxValue);
 			Debug.Assert(AllocSize > 0, "String has been frozen");
 			Debug.Assert(AllocSize > 0, "String has been frozen");
-			Debug.Assert((uint)newSize <= cSizeFlags);
+			Runtime.Assert((uint)newSize <= cSizeFlags);
 			Internal.MemCpy(newPtr, Ptr, mLength);
 			Internal.MemCpy(newPtr, Ptr, mLength);
 			if (IsDynAlloc)
 			if (IsDynAlloc)
 				delete:this mPtrOrBuffer;
 				delete:this mPtrOrBuffer;