diff --git a/BeefLibs/corlib/src/IO/StringStream.bf b/BeefLibs/corlib/src/IO/StringStream.bf index 448e7d4f..9dec3d40 100644 --- a/BeefLibs/corlib/src/IO/StringStream.bf +++ b/BeefLibs/corlib/src/IO/StringStream.bf @@ -23,6 +23,7 @@ namespace System.IO mString = appendStr; } + [DisableChecks] public ~this() { if (mStringKind == .Append) diff --git a/BeefLibs/corlib/src/Internal.bf b/BeefLibs/corlib/src/Internal.bf index 1deb7126..fd4d1b56 100644 --- a/BeefLibs/corlib/src/Internal.bf +++ b/BeefLibs/corlib/src/Internal.bf @@ -437,7 +437,7 @@ namespace System #endif } - public static void Dbg_AppendDeleted(Object rootObj) + public static void Dbg_AppendDeleted(Object rootObj, bool doChecks) { #if BF_ENABLE_OBJECT_DEBUG_FLAGS void Handle(AppendAllocEntry* headAllocEntry) @@ -448,11 +448,14 @@ namespace System switch (checkAllocEntry.mKind) { case .Object(let obj): -#unwarn - if (!obj.[DisableObjectAccessChecks]IsDeleted()) + if (doChecks) { - if (obj.GetType().HasDestructor) - Debug.FatalError("Appended object not deleted with 'delete:append'"); +#unwarn + if (!obj.[DisableObjectAccessChecks]IsDeleted()) + { + if (obj.GetType().HasDestructor) + Debug.FatalError("Appended object not deleted with 'delete:append'"); + } } case .Raw(let rawPtr, let allocData): default: diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index bffd377b..f4c15768 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -18142,9 +18142,10 @@ void BfModule::EmitDtorBody() { auto thisValue = GetThis(); auto appendedObj = mBfIRBuilder->CreateBitCast(thisValue.mValue, mBfIRBuilder->MapType(mContext->mBfObjectType)); - BfModuleMethodInstance allocMethod = GetInternalMethod("Dbg_AppendDeleted", 1); + BfModuleMethodInstance allocMethod = GetInternalMethod("Dbg_AppendDeleted", 2); SizedArray llvmArgs; - llvmArgs.push_back(appendedObj); + llvmArgs.Add(appendedObj); + llvmArgs.Add(mBfIRBuilder->CreateConst(BfTypeCode_Boolean, mCurMethodState->mDisableChecks ? 0 : 1)); if (allocMethod) mBfIRBuilder->CreateCall(allocMethod.mFunc, llvmArgs); } @@ -22030,6 +22031,20 @@ void BfModule::ProcessMethod(BfMethodInstance* methodInstance, bool isInlineDup, if ((methodDef != NULL) && (propertyDeclaration != NULL) && (propertyDeclaration->mExternSpecifier != NULL)) hasExternSpecifier = true; + if (methodDef->mName == BF_METHODNAME_MARKMEMBERS) + { + // We need to be able to mark deleted objects + mCurMethodState->mIgnoreObjectAccessCheck = true; + } + auto customAttributes = methodInstance->GetCustomAttributes(); + if (customAttributes != NULL) + { + if (customAttributes->Contains(mCompiler->mDisableObjectAccessChecksAttributeTypeDef)) + mCurMethodState->mIgnoreObjectAccessCheck = true; + if (customAttributes->Contains(mCompiler->mDisableChecksAttributeTypeDef)) + mCurMethodState->mDisableChecks = true; + } + // Allocate, clear, set classVData if ((methodDef->mMethodType == BfMethodType_Ctor) && (methodDef->mIsStatic)) @@ -22207,21 +22222,7 @@ void BfModule::ProcessMethod(BfMethodInstance* methodInstance, bool isInlineDup, if ((!mCurTypeInstance->IsBoxed()) && (methodDeclaration != NULL) && (methodDeclaration->mHadYield) && (methodDef->mBody != NULL)) { EmitIteratorBlock(skipBody); - } - - if (methodDef->mName == BF_METHODNAME_MARKMEMBERS) - { - // We need to be able to mark deleted objects - mCurMethodState->mIgnoreObjectAccessCheck = true; - } - auto customAttributes = methodInstance->GetCustomAttributes(); - if (customAttributes != NULL) - { - if (customAttributes->Contains(mCompiler->mDisableObjectAccessChecksAttributeTypeDef)) - mCurMethodState->mIgnoreObjectAccessCheck = true; - if (customAttributes->Contains(mCompiler->mDisableChecksAttributeTypeDef)) - mCurMethodState->mDisableChecks = true; - } + } if ((methodDef->mMethodType == BfMethodType_CtorNoBody) && (!methodDef->mIsStatic) && ((methodInstance->mChainType == BfMethodChainType_ChainHead) || (methodInstance->mChainType == BfMethodChainType_None)))