diff --git a/BeefLibs/corlib/src/Allocator.bf b/BeefLibs/corlib/src/Allocator.bf index 10a9c7dd..9efd2f80 100644 --- a/BeefLibs/corlib/src/Allocator.bf +++ b/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 where T : new, delete { alloctype(T) mVal; diff --git a/IDEHelper/Compiler/BfAutoComplete.cpp b/IDEHelper/Compiler/BfAutoComplete.cpp index 93a53cb0..13844a9f 100644 --- a/IDEHelper/Compiler/BfAutoComplete.cpp +++ b/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);