浏览代码

Added ITypedAllocator, SingleAllocator

Brian Fiete 3 年之前
父节点
当前提交
3b711932ec
共有 2 个文件被更改,包括 81 次插入0 次删除
  1. 75 0
      BeefLibs/corlib/src/Allocator.bf
  2. 6 0
      IDEHelper/Compiler/BfAutoComplete.cpp

+ 75 - 0
BeefLibs/corlib/src/Allocator.bf

@@ -9,6 +9,11 @@ namespace System
 		void Free(void* ptr);
 	}
 
+	interface ITypedAllocator : IRawAllocator
+	{
+		void* AllocTyped(Type type, int size, int align);
+	}
+
 	struct StdAllocator : IRawAllocator
 	{
 		public void* Alloc(int size, int align)
@@ -22,6 +27,76 @@ namespace System
 		}
 	}
 
+	class SingleAllocator : ITypedAllocator
+	{
+		void* mPtr;
+		int mSize;
+		Type mType;
+
+		[AllowAppend]
+		public this(int size)
+		{
+			void* ptr = append uint8[size]*(?);
+			mPtr = ptr;
+			mSize = size;
+		}
+
+		public ~this()
+		{
+			if ((mType != null) && (mType.IsObject))
+			{
+				Object obj = Internal.UnsafeCastToObject(mPtr);
+				delete:null obj;
+			}
+
+			if (mSize < 0)
+				delete mPtr;
+		}
+
+		protected virtual void* AllocLarge(int size, int align)
+		{
+			return new uint8[size]*;
+		}
+
+		protected virtual void FreeLarge(void* ptr)
+		{
+			delete ptr;
+		}
+
+		public void* Alloc(int size, int align)
+		{
+			return AllocTyped(typeof(void), size, align);
+		}
+
+		public void Free(void* ptr)
+		{
+			Runtime.Assert(ptr == mPtr);
+			mType = typeof(void);
+		}
+
+		[Optimize]
+		public void* AllocTyped(Type type, int size, int align)
+		{
+			Runtime.Assert(mType == null, "SingleAllocator has been used for multiple allocations");
+
+			mType = type;
+			do
+			{
+				if (size > size)
+					break;
+				void* usePtr = (void*)(int)Math.Align((int)mPtr, align);
+				if ((uint8*)usePtr + size > (uint8*)mPtr + mSize)
+					break;
+				mPtr = usePtr;
+				mSize = 0;
+				return mPtr;
+			}
+			mSize = -1;
+			mPtr = AllocLarge(size, align);
+			return mPtr;
+		}
+	}
+
 	struct AllocWrapper<T> where T : new, delete
 	{
 		alloctype(T) mVal;

+ 6 - 0
IDEHelper/Compiler/BfAutoComplete.cpp

@@ -1004,6 +1004,12 @@ void BfAutoComplete::AddTypeMembers(BfTypeInstance* typeInst, bool addStatic, bo
 			AddTypeMembers(mModule->mContext->mBfObjectType, addStatic, addNonStatic, filter, startType, false, allowImplicitThis, false);
 	}
 
+	if (typeInst->IsInterface())
+	{
+		for (auto interface : typeInst->mInterfaces)
+			AddTypeMembers(interface.mInterfaceType, addStatic, addNonStatic, filter, startType, false, allowImplicitThis, false);
+	}
+
 	if ((addStatic) && (allowImplicitThis) && (checkOuterType))
 	{
 		auto outerType = mModule->GetOuterType(typeInst);