1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-10 04:22:20 +02:00

Reworked !hasRequiredTypes state

This commit is contained in:
Brian Fiete 2021-02-07 06:00:34 -08:00
parent 5f5c752f5d
commit eddbf7a984
11 changed files with 104 additions and 77 deletions

View file

@ -341,11 +341,10 @@ BfCompiler::HotResolveData::~HotResolveData()
BfCompiler::BfCompiler(BfSystem* bfSystem, bool isResolveOnly) BfCompiler::BfCompiler(BfSystem* bfSystem, bool isResolveOnly)
{ {
//llvm::DebugFlag = true;
memset(&mStats, 0, sizeof(mStats)); memset(&mStats, 0, sizeof(mStats));
mCompletionPct = 0; mCompletionPct = 0;
mCanceling = false; mCanceling = false;
mHasRequiredTypes = false;
mNeedsFullRefresh = false; mNeedsFullRefresh = false;
mFastFinish = false; mFastFinish = false;
mHasQueuedTypeRebuilds = false; mHasQueuedTypeRebuilds = false;
@ -6596,7 +6595,7 @@ bool BfCompiler::DoCompile(const StringImpl& outputDirectory)
BpEnter("Compile_Start"); BpEnter("Compile_Start");
bool hasRequiredTypes = true; mHasRequiredTypes = true;
//HashSet<BfTypeDef*> internalTypeDefs; //HashSet<BfTypeDef*> internalTypeDefs;
@ -6606,7 +6605,7 @@ bool BfCompiler::DoCompile(const StringImpl& outputDirectory)
if (typeDef == NULL) if (typeDef == NULL)
{ {
mPassInstance->Fail(StrFormat("Unable to find system type: %s", typeName.c_str())); mPassInstance->Fail(StrFormat("Unable to find system type: %s", typeName.c_str()));
hasRequiredTypes = false; mHasRequiredTypes = false;
} }
return typeDef; return typeDef;
}; };
@ -6722,22 +6721,18 @@ bool BfCompiler::DoCompile(const StringImpl& outputDirectory)
mContext->mBfTypeType = NULL; mContext->mBfTypeType = NULL;
mContext->mBfClassVDataPtrType = NULL; mContext->mBfClassVDataPtrType = NULL;
if (!hasRequiredTypes) if (!mHasRequiredTypes)
{ {
// Force rebuilding // Force rebuilding
BfLogSysM("Compile missing required types\n"); BfLogSysM("Compile missing required types\n");
mInInvalidState = true; mOptions.mForceRebuildIdx++;
mOptions.mForceRebuildIdx++; }
return true;
}
mSystem->CheckLockYield(); mSystem->CheckLockYield();
mContext->mScratchModule->ResolveTypeDef(mBfObjectTypeDef); mContext->mScratchModule->ResolveTypeDef(mBfObjectTypeDef);
VisitSourceExteriorNodes(); VisitSourceExteriorNodes();
//BF_ASSERT(hasRequiredTypes);
if (!mIsResolveOnly) if (!mIsResolveOnly)
{ {
HashSet<BfModule*> foundVDataModuleSet; HashSet<BfModule*> foundVDataModuleSet;
@ -6812,18 +6807,13 @@ bool BfCompiler::DoCompile(const StringImpl& outputDirectory)
if (mIsResolveOnly) if (mIsResolveOnly)
VisitAutocompleteExteriorIdentifiers(); VisitAutocompleteExteriorIdentifiers();
if (!hasRequiredTypes)
{
BfLogSysM("Missing required types\n");
}
mStats.mTypesQueued = 0; mStats.mTypesQueued = 0;
mStats.mMethodsQueued = 0; mStats.mMethodsQueued = 0;
mStats.mTypesQueued += (int)mContext->mPopulateTypeWorkList.size(); mStats.mTypesQueued += (int)mContext->mPopulateTypeWorkList.size();
mStats.mMethodsQueued += (int)mContext->mMethodWorkList.size(); mStats.mMethodsQueued += (int)mContext->mMethodWorkList.size();
if (hasRequiredTypes) //
{ {
mContext->mScratchModule->ResolveTypeDef(mBfObjectTypeDef, BfPopulateType_Full); mContext->mScratchModule->ResolveTypeDef(mBfObjectTypeDef, BfPopulateType_Full);
@ -6865,8 +6855,7 @@ bool BfCompiler::DoCompile(const StringImpl& outputDirectory)
} }
} }
if (hasRequiredTypes) ProcessPurgatory(true);
ProcessPurgatory(true);
// Mark used modules // Mark used modules
if ((mOptions.mCompileOnDemandKind != BfCompileOnDemandKind_AlwaysInclude) && (!mCanceling)) if ((mOptions.mCompileOnDemandKind != BfCompileOnDemandKind_AlwaysInclude) && (!mCanceling))
@ -6967,7 +6956,7 @@ bool BfCompiler::DoCompile(const StringImpl& outputDirectory)
} }
// Generate slot nums // Generate slot nums
if ((!mIsResolveOnly) && (hasRequiredTypes) && (!mCanceling)) if ((!mIsResolveOnly) && (!mCanceling))
{ {
if ((!IsHotCompile()) || (mHotState->mHasNewInterfaceTypes)) if ((!IsHotCompile()) || (mHotState->mHasNewInterfaceTypes))
{ {
@ -7099,12 +7088,11 @@ bool BfCompiler::DoCompile(const StringImpl& outputDirectory)
DoWorkLoop(); DoWorkLoop();
} }
if (hasRequiredTypes) ProcessPurgatory(false);
ProcessPurgatory(false);
// Old Mark used modules // Old Mark used modules
if ((!mIsResolveOnly) && (hasRequiredTypes)) if (!mIsResolveOnly)
{ {
// if ((!mPassInstance->HasFailed()) && (!mCanceling)) // if ((!mPassInstance->HasFailed()) && (!mCanceling))
// { // {
@ -7161,7 +7149,7 @@ bool BfCompiler::DoCompile(const StringImpl& outputDirectory)
String moduleListStr; String moduleListStr;
int numModulesWritten = 0; int numModulesWritten = 0;
if ((hasRequiredTypes) && (!mCanceling)) if (!mCanceling)
{ {
if (!mIsResolveOnly) if (!mIsResolveOnly)
{ {
@ -7251,8 +7239,6 @@ bool BfCompiler::DoCompile(const StringImpl& outputDirectory)
while (true) while (true)
{ {
if (!hasRequiredTypes)
break;
if (mCanceling) if (mCanceling)
mCodeGen.Cancel(); mCodeGen.Cancel();
bool isDone = mCodeGen.Finish(); bool isDone = mCodeGen.Finish();
@ -7391,8 +7377,8 @@ bool BfCompiler::DoCompile(const StringImpl& outputDirectory)
// gBEMemReporter.Report(); // gBEMemReporter.Report();
// int memReporterSize = gBEMemReporterSize; // int memReporterSize = gBEMemReporterSize;
mLastRevisionAborted = mCanceling || !hasRequiredTypes; mLastRevisionAborted = mCanceling;
bool didCancel = mCanceling && hasRequiredTypes; bool didCancel = mCanceling;
mCanceling = false; mCanceling = false;
mContext->ValidateDependencies(); mContext->ValidateDependencies();

View file

@ -323,6 +323,7 @@ public:
BfCodeGen mCodeGen; BfCodeGen mCodeGen;
String mOutputDirectory; String mOutputDirectory;
bool mCanceling; bool mCanceling;
bool mHasRequiredTypes;
bool mNeedsFullRefresh; bool mNeedsFullRefresh;
bool mFastFinish; bool mFastFinish;
bool mHasQueuedTypeRebuilds; // Infers we had a fast finish that requires a type rebuild bool mHasQueuedTypeRebuilds; // Infers we had a fast finish that requires a type rebuild

View file

@ -416,15 +416,22 @@ bool BfConstResolver::PrepareMethodArguments(BfAstNode* targetSrc, BfMethodMatch
} }
else else
{ {
if ((argValue.mValue.IsFake()) && (!argValue.mType->IsValuelessType())) bool requiresConst = false;
if ((mModule->mCurMethodInstance == NULL) || (mModule->mCurMethodInstance->mMethodDef->mMethodType != BfMethodType_Mixin))
requiresConst = true;
if ((requiresConst) && (argValue.mValue.IsFake()) && (!argValue.mType->IsValuelessType()))
{ {
if ((mModule->mCurMethodInstance == NULL) || (mModule->mCurMethodInstance->mMethodDef->mMethodType != BfMethodType_Mixin)) mModule->Fail("Expression does not evaluate to a constant value", argExpr);
{
mModule->Fail("Expression does not evaluate to a constant value", argExpr);
}
} }
llvmArgs.push_back(argValue.mValue); if (!argValue.mType->IsVar())
{
if ((!requiresConst) || (argValue.mValue.IsConst()) || (argValue.mType->IsValuelessType()))
llvmArgs.push_back(argValue.mValue);
else
llvmArgs.push_back(mModule->GetDefaultValue(argValue.mType));
}
paramIdx++; paramIdx++;
} }
argIdx++; argIdx++;

View file

@ -2917,10 +2917,21 @@ void BfContext::Cleanup()
// Clean up deleted BfTypes // Clean up deleted BfTypes
// These need to get deleted before the modules because we access mModule in the MethodInstance dtors // These need to get deleted before the modules because we access mModule in the MethodInstance dtors
for (auto type : mTypeGraveyard) for (int pass = 0; pass < 2; pass++)
{ {
BF_ASSERT(type->mRebuildFlags & BfTypeRebuildFlag_Deleted); for (int i = 0; i < (int)mTypeGraveyard.size(); i++)
delete type; {
auto type = mTypeGraveyard[i];
if (type == NULL)
continue;
bool deleteNow = (type->IsBoxed() == (pass == 0));
if (!deleteNow)
continue;
BF_ASSERT(type->mRebuildFlags & BfTypeRebuildFlag_Deleted);
delete type;
mTypeGraveyard[i] = NULL;
}
} }
mTypeGraveyard.Clear(); mTypeGraveyard.Clear();

View file

@ -1780,19 +1780,16 @@ void BfDefBuilder::Visit(BfTypeDeclaration* typeDeclaration)
if (prevRevisionTypeDef->mDefState == BfTypeDef::DefState_AwaitingNewVersion) if (prevRevisionTypeDef->mDefState == BfTypeDef::DefState_AwaitingNewVersion)
{ {
delete prevRevisionTypeDef->mNextRevision; if (prevRevisionTypeDef->mNextRevision != NULL)
{
BfLogSysM("Deleting unused nextRevision %p from prevRevision %p\n", prevRevisionTypeDef->mNextRevision, prevRevisionTypeDef);
delete prevRevisionTypeDef->mNextRevision;
}
prevRevisionTypeDef->mNextRevision = mCurTypeDef; prevRevisionTypeDef->mNextRevision = mCurTypeDef;
BF_ASSERT(mCurTypeDef->mSystem != NULL); BF_ASSERT(mCurTypeDef->mSystem != NULL);
mCurActualTypeDef = prevRevisionTypeDef; mCurActualTypeDef = prevRevisionTypeDef;
doInsertNew = false; doInsertNew = false;
} }
else
{
if (prevRevisionTypeDef->mNextRevision != NULL)
prevRevisionTypeDef = prevRevisionTypeDef->mNextRevision;
prevRevisionTypeDef = NULL;
}
} }
else else
{ {
@ -1820,8 +1817,8 @@ void BfDefBuilder::Visit(BfTypeDeclaration* typeDeclaration)
outerTypeDef->mNestedTypes.push_back(mCurActualTypeDef); outerTypeDef->mNestedTypes.push_back(mCurActualTypeDef);
} }
BfLogSysM("Creating TypeDef %p Hash:%d from TypeDecl: %p Source: %p ResolvePass: %d AutoComplete:%d\n", mCurTypeDef, mSystem->mTypeDefs.GetHash(mCurTypeDef), typeDeclaration, BfLogSysM("Creating TypeDef %p Hash:%d from TypeDecl: %p Source: %p ResolvePass: %d AutoComplete:%d PrevRevision:%d\n", mCurTypeDef, mSystem->mTypeDefs.GetHash(mCurTypeDef), typeDeclaration,
typeDeclaration->GetSourceData(), mResolvePassData != NULL, isAutoCompleteTempType); typeDeclaration->GetSourceData(), mResolvePassData != NULL, isAutoCompleteTempType, prevRevisionTypeDef);
BF_ASSERT(mCurTypeDef->mNameEx == NULL); BF_ASSERT(mCurTypeDef->mNameEx == NULL);
@ -1875,9 +1872,9 @@ void BfDefBuilder::Visit(BfTypeDeclaration* typeDeclaration)
if (mCurTypeDef->mFullHash == prevRevisionTypeDef->mFullHash) if (mCurTypeDef->mFullHash == prevRevisionTypeDef->mFullHash)
{ {
if (!mFullRefresh) if ((!mFullRefresh) && (!prevRevisionTypeDef->mForceUseNextRevision))
{ {
BfLogSys(bfParser->mSystem, "DefBuilder deleting typeDef with no changes %p\n", prevRevisionTypeDef); BfLogSys(bfParser->mSystem, "DefBuilder deleting typeDef with no changes %p prevRevision: %p\n", mCurTypeDef, prevRevisionTypeDef);
prevRevisionTypeDef->mDefState = BfTypeDef::DefState_Defined; prevRevisionTypeDef->mDefState = BfTypeDef::DefState_Defined;
BF_ASSERT(prevRevisionTypeDef->mNextRevision == mCurTypeDef); BF_ASSERT(prevRevisionTypeDef->mNextRevision == mCurTypeDef);
prevRevisionTypeDef->mNextRevision = NULL; prevRevisionTypeDef->mNextRevision = NULL;

View file

@ -10786,6 +10786,9 @@ void BfModule::ValidateCustomAttributes(BfCustomAttributes* customAttributes, Bf
void BfModule::GetCustomAttributes(BfCustomAttributes* customAttributes, BfAttributeDirective* attributesDirective, BfAttributeTargets attrTarget, bool allowNonConstArgs, BfCaptureInfo* captureInfo) void BfModule::GetCustomAttributes(BfCustomAttributes* customAttributes, BfAttributeDirective* attributesDirective, BfAttributeTargets attrTarget, bool allowNonConstArgs, BfCaptureInfo* captureInfo)
{ {
if (!mCompiler->mHasRequiredTypes)
return;
if ((attributesDirective != NULL) && (mCompiler->mResolvePassData != NULL) && if ((attributesDirective != NULL) && (mCompiler->mResolvePassData != NULL) &&
(attributesDirective->IsFromParser(mCompiler->mResolvePassData->mParser)) && (mCompiler->mResolvePassData->mSourceClassifier != NULL)) (attributesDirective->IsFromParser(mCompiler->mResolvePassData->mParser)) && (mCompiler->mResolvePassData->mSourceClassifier != NULL))
{ {
@ -11076,8 +11079,10 @@ void BfModule::GetCustomAttributes(BfCustomAttributes* customAttributes, BfAttri
if (assignExpr->mRight != NULL) if (assignExpr->mRight != NULL)
{ {
BfTypedValue result = constResolver.Resolve(assignExpr->mRight, propType); BfTypedValue result = constResolver.Resolve(assignExpr->mRight, propType);
if (result) if ((result) && (!result.mType->IsVar()))
{ {
if (!result.mValue.IsConst())
result = GetDefaultTypedValue(result.mType);
BF_ASSERT(result.mType == propType); BF_ASSERT(result.mType == propType);
CurrentAddToConstHolder(result.mValue); CurrentAddToConstHolder(result.mValue);
setProperty.mParam = result; setProperty.mParam = result;
@ -19437,7 +19442,11 @@ void BfModule::ProcessMethod(BfMethodInstance* methodInstance, bool isInlineDup)
} }
auto bodyBlock = BfNodeDynCast<BfBlock>(methodDef->mBody); auto bodyBlock = BfNodeDynCast<BfBlock>(methodDef->mBody);
if (methodDef->mBody == NULL) if (!mCompiler->mHasRequiredTypes)
{
// Skip processing to avoid errors
}
else if (methodDef->mBody == NULL)
{ {
if (methodDeclaration != NULL) if (methodDeclaration != NULL)
{ {
@ -22037,7 +22046,7 @@ void BfModule::DoMethodDeclaration(BfMethodDeclaration* methodDeclaration, bool
resolvedParamType = CreateArrayType(mContext->mBfObjectType, 1); resolvedParamType = CreateArrayType(mContext->mBfObjectType, 1);
} }
if (addParams) if ((addParams) && (resolvedParamType != NULL))
{ {
BfMethodParam methodParam; BfMethodParam methodParam;
methodParam.mResolvedType = resolvedParamType; methodParam.mResolvedType = resolvedParamType;

View file

@ -5979,11 +5979,14 @@ BfArrayType* BfModule::CreateArrayType(BfType* resolvedType, int dimensions)
BF_ASSERT(!resolvedType->IsVar()); BF_ASSERT(!resolvedType->IsVar());
BF_ASSERT(!resolvedType->IsIntUnknown()); BF_ASSERT(!resolvedType->IsIntUnknown());
auto arrayTypeDef = mCompiler->GetArrayTypeDef(dimensions);
if (arrayTypeDef == NULL)
return NULL;
auto arrayType = mContext->mArrayTypePool.Get(); auto arrayType = mContext->mArrayTypePool.Get();
delete arrayType->mGenericTypeInfo; delete arrayType->mGenericTypeInfo;
arrayType->mGenericTypeInfo = new BfGenericTypeInfo(); arrayType->mGenericTypeInfo = new BfGenericTypeInfo();
arrayType->mContext = mContext; arrayType->mContext = mContext;
arrayType->mTypeDef = mCompiler->GetArrayTypeDef(dimensions); arrayType->mTypeDef = arrayTypeDef;
arrayType->mDimensions = dimensions; arrayType->mDimensions = dimensions;
arrayType->mGenericTypeInfo->mTypeGenericArguments.clear(); arrayType->mGenericTypeInfo->mTypeGenericArguments.clear();
arrayType->mGenericTypeInfo->mTypeGenericArguments.push_back(resolvedType); arrayType->mGenericTypeInfo->mTypeGenericArguments.push_back(resolvedType);
@ -9745,7 +9748,8 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
} }
auto elementType = ResolveTypeRef(arrayTypeRef->mElementType, BfPopulateType_Declaration, BfResolveTypeRefFlag_AllowGenericParamConstValue); auto elementType = ResolveTypeRef(arrayTypeRef->mElementType, BfPopulateType_Declaration, BfResolveTypeRefFlag_AllowGenericParamConstValue);
if (elementType == NULL) auto arrayTypeDef = mCompiler->GetArrayTypeDef(arrayTypeRef->mDimensions);
if ((elementType == NULL) || (arrayTypeDef == NULL))
{ {
mContext->mResolvedTypes.RemoveEntry(resolvedEntry); mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags); return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
@ -9818,7 +9822,7 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
arrayType->mGenericTypeInfo = new BfGenericTypeInfo(); arrayType->mGenericTypeInfo = new BfGenericTypeInfo();
arrayType->mContext = mContext; arrayType->mContext = mContext;
arrayType->mDimensions = arrayTypeRef->mDimensions; arrayType->mDimensions = arrayTypeRef->mDimensions;
arrayType->mTypeDef = mCompiler->GetArrayTypeDef(arrayType->mDimensions); arrayType->mTypeDef = arrayTypeDef;
arrayType->mGenericTypeInfo->mTypeGenericArguments.push_back(elementType); arrayType->mGenericTypeInfo->mTypeGenericArguments.push_back(elementType);
resolvedEntry->mValue = arrayType; resolvedEntry->mValue = arrayType;

View file

@ -2586,6 +2586,13 @@ void BfSystem::RemoveTypeDef(BfTypeDef* typeDef)
mTypeDefs.Remove(typeDef); mTypeDefs.Remove(typeDef);
AutoCrit autoCrit(mDataLock); AutoCrit autoCrit(mDataLock);
if (typeDef->mOuterType != NULL)
{
// We are in the outer type's mNestedTypes list
BfLogSys(this, "Setting mForceUseNextRevision on outer type %p from %p\n", typeDef->mOuterType, typeDef);
typeDef->mOuterType->mForceUseNextRevision = true;
}
// This will get properly handled in UntrackName when we process the mTypeDefDeleteQueue, but this // This will get properly handled in UntrackName when we process the mTypeDefDeleteQueue, but this
// mAtomUpdateIdx increment will trigger lookup changes in BfContext::VerifyTypeLookups // mAtomUpdateIdx increment will trigger lookup changes in BfContext::VerifyTypeLookups
if (typeDef->mName != mEmptyAtom) if (typeDef->mName != mEmptyAtom)
@ -2797,6 +2804,7 @@ void BfSystem::InjectNewRevision(BfTypeDef* typeDef)
typeDef->mNextRevision = NULL; typeDef->mNextRevision = NULL;
typeDef->mDefState = BfTypeDef::DefState_Defined; typeDef->mDefState = BfTypeDef::DefState_Defined;
typeDef->mForceUseNextRevision = false;
VerifyTypeDef(typeDef); VerifyTypeDef(typeDef);
} }

View file

@ -1006,6 +1006,7 @@ public:
bool mIsNextRevision; bool mIsNextRevision;
bool mInDeleteQueue; bool mInDeleteQueue;
bool mHasEmitMembers; bool mHasEmitMembers;
bool mForceUseNextRevision;
public: public:
BfTypeDef() BfTypeDef()
@ -1048,6 +1049,7 @@ public:
mIsNextRevision = false; mIsNextRevision = false;
mInDeleteQueue = false; mInDeleteQueue = false;
mHasEmitMembers = false; mHasEmitMembers = false;
mForceUseNextRevision = false;
mDupDetectedRevision = -1; mDupDetectedRevision = -1;
mNestDepth = 0; mNestDepth = 0;
mOuterType = NULL; mOuterType = NULL;

View file

@ -6255,6 +6255,9 @@ CeMachine::~CeMachine()
auto _RemoveFunctionInfo = [&](CeFunctionInfo* functionInfo) auto _RemoveFunctionInfo = [&](CeFunctionInfo* functionInfo)
{ {
if (functionInfo->mMethodInstance != NULL)
functionInfo->mMethodInstance->mInCEMachine = false;
if (functionInfo->mCeFunction != NULL) if (functionInfo->mCeFunction != NULL)
{ {
// We don't need to actually unmap it at this point // We don't need to actually unmap it at this point
@ -6933,7 +6936,6 @@ CeFunction* CeMachine::GetFunction(BfMethodInstance* methodInstance, BfIRValue f
ceFunction->mIsVarReturn = methodInstance->mReturnType->IsVar(); ceFunction->mIsVarReturn = methodInstance->mReturnType->IsVar();
ceFunction->mCeFunctionInfo = ceFunctionInfo; ceFunction->mCeFunctionInfo = ceFunctionInfo;
ceFunction->mMethodInstance = methodInstance; ceFunction->mMethodInstance = methodInstance;
ceFunctionInfo->mMethodInstance = methodInstance; ceFunctionInfo->mMethodInstance = methodInstance;
ceFunctionInfo->mCeFunction = ceFunction; ceFunctionInfo->mCeFunction = ceFunction;
MapFunctionId(ceFunction); MapFunctionId(ceFunction);