From 0cf3e2283d73b20ff8b28d457f757a13cdcf3d6c Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Fri, 24 Jun 2022 07:35:02 -0700 Subject: [PATCH] Cache sized array length during typeref resolution --- BeefLibs/corlib/src/Compiler.bf | 3 +++ IDEHelper/Compiler/BfCompiler.cpp | 3 ++- IDEHelper/Compiler/BfCompiler.h | 3 ++- IDEHelper/Compiler/BfModule.cpp | 4 ++++ IDEHelper/Compiler/BfModuleTypeUtils.cpp | 10 ++-------- IDEHelper/Compiler/BfResolvedTypeUtils.cpp | 11 ++++++----- IDEHelper/Compiler/BfResolvedTypeUtils.h | 1 + 7 files changed, 20 insertions(+), 15 deletions(-) diff --git a/BeefLibs/corlib/src/Compiler.bf b/BeefLibs/corlib/src/Compiler.bf index 7f881fba..1be6d59d 100644 --- a/BeefLibs/corlib/src/Compiler.bf +++ b/BeefLibs/corlib/src/Compiler.bf @@ -283,6 +283,9 @@ namespace System [LinkName("#CompileRev")] public static extern int32 CompileRev; + [LinkName("#NextId")] + public static extern int64 NextId; + [Comptime(ConstEval=true)] public static void Assert(bool cond) { diff --git a/IDEHelper/Compiler/BfCompiler.cpp b/IDEHelper/Compiler/BfCompiler.cpp index 0d120bee..a25743a4 100644 --- a/IDEHelper/Compiler/BfCompiler.cpp +++ b/IDEHelper/Compiler/BfCompiler.cpp @@ -353,7 +353,8 @@ BfCompiler::BfCompiler(BfSystem* bfSystem, bool isResolveOnly) mIsResolveOnly = isResolveOnly; mResolvePassData = NULL; mPassInstance = NULL; - mRevision = 0; + mRevision = 0; + mUniqueId = 0; mLastRevisionAborted = false; gBfCompiler = this; mSystem = bfSystem; diff --git a/IDEHelper/Compiler/BfCompiler.h b/IDEHelper/Compiler/BfCompiler.h index 22c4cfb4..3a8a9ab9 100644 --- a/IDEHelper/Compiler/BfCompiler.h +++ b/IDEHelper/Compiler/BfCompiler.h @@ -323,7 +323,8 @@ public: bool mIsResolveOnly; BfResolvePassData* mResolvePassData; Dictionary> mAttributeTypeOptionMap; - int mRevision; + int mRevision; + int64 mUniqueId; bool mLastRevisionAborted; BfContext* mContext; BfCodeGen mCodeGen; diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 73d908e7..de639e4a 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -14615,6 +14615,10 @@ BfTypedValue BfModule::GetCompilerFieldValue(const StringImpl& str) { return BfTypedValue(mBfIRBuilder->CreateConst(BfTypeCode_Int32, mCompiler->mRevision), GetPrimitiveType(BfTypeCode_Int32)); } + if (str == "#NextId") + { + return BfTypedValue(mBfIRBuilder->CreateConst(BfTypeCode_Int64, ++mCompiler->mUniqueId), GetPrimitiveType(BfTypeCode_Int32)); + } if (str == "#ModuleName") { return BfTypedValue(GetStringObjectValue(mModuleName), ResolveTypeDef(mCompiler->mStringTypeDef)); diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 784b9735..97ed5661 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -11272,16 +11272,10 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula BfExpression* sizeExpr = BfNodeDynCast(arrayTypeRef->mParams[0]); BF_ASSERT(sizeExpr != NULL); if (sizeExpr != NULL) - { - BfConstResolver constResolver(this); + { BfType* intType = GetPrimitiveType(BfTypeCode_IntPtr); - constResolver.mExpectingType = intType; - constResolver.mBfEvalExprFlags = (BfEvalExprFlags)(constResolver.mBfEvalExprFlags | BfEvalExprFlags_AllowGenericConstValue); BfTypedValue typedVal; - { - SetAndRestoreValue prevIgnoreErrors(mIgnoreErrors, true); - typedVal = constResolver.Resolve(sizeExpr, NULL, BfConstResolveFlag_ArrayInitSize); - } + lookupCtx.mResolvedValueMap.TryGetValue(sizeExpr, &typedVal); if (typedVal.mKind == BfTypedValueKind_GenericConstValue) { BfUnknownSizedArrayType* arrayType = new BfUnknownSizedArrayType(); diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp index 0005f41a..edbb8072 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp @@ -3545,8 +3545,10 @@ int BfResolvedTypeSet::DoHash(BfTypeReference* typeRef, LookupContext* ctx, BfHa constResolver.mBfEvalExprFlags = (BfEvalExprFlags)(constResolver.mBfEvalExprFlags | BfEvalExprFlags_AllowGenericConstValue); constResolver.mExpectingType = intType; BfTypedValue typedVal = constResolver.Resolve(sizeExpr, NULL, BfConstResolveFlag_ArrayInitSize); + if (typedVal.mKind == BfTypedValueKind_GenericConstValue) { + ctx->mResolvedValueMap[sizeExpr] = typedVal; int elemHash = Hash(typedVal.mType, ctx, BfHashFlag_None, hashSeed); hashVal = ((hashVal ^ elemHash) << 5) - hashVal; return hashVal; @@ -3558,6 +3560,7 @@ int BfResolvedTypeSet::DoHash(BfTypeReference* typeRef, LookupContext* ctx, BfHa SetAndRestoreValue prevIgnoreWrites(ctx->mModule->mBfIRBuilder->mIgnoreWrites, true); typedVal = ctx->mModule->Cast(sizeExpr, typedVal, intType); } + ctx->mResolvedValueMap[sizeExpr] = typedVal; if (typedVal) { @@ -4804,12 +4807,9 @@ bool BfResolvedTypeSet::Equals(BfType* lhs, BfTypeReference* rhs, LookupContext* BF_ASSERT(sizeExpr != NULL); if (sizeExpr != NULL) { - SetAndRestoreValue prevIgnoreError(ctx->mModule->mIgnoreErrors, true); - BfConstResolver constResolver(ctx->mModule); BfType* intType = ctx->mModule->GetPrimitiveType(BfTypeCode_IntPtr); - constResolver.mBfEvalExprFlags = (BfEvalExprFlags)(constResolver.mBfEvalExprFlags | BfEvalExprFlags_AllowGenericConstValue); - constResolver.mExpectingType = intType; - BfTypedValue typedVal = constResolver.Resolve(sizeExpr, NULL, BfConstResolveFlag_ArrayInitSize); + BfTypedValue typedVal; + ctx->mResolvedValueMap.TryGetValue(sizeExpr, &typedVal); if (typedVal.mKind == BfTypedValueKind_GenericConstValue) { if (!lhs->IsUnknownSizedArrayType()) @@ -4820,6 +4820,7 @@ bool BfResolvedTypeSet::Equals(BfType* lhs, BfTypeReference* rhs, LookupContext* } if (typedVal) typedVal = ctx->mModule->Cast(sizeExpr, typedVal, intType); + if (typedVal) { if (lhs->IsUnknownSizedArrayType()) diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.h b/IDEHelper/Compiler/BfResolvedTypeUtils.h index f2f69ec6..323001db 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.h +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.h @@ -2622,6 +2622,7 @@ public: BfTypeInstance* mRootOuterTypeInstance; BfType* mRootResolvedType; Dictionary mResolvedTypeMap; + Dictionary mResolvedValueMap; BfResolveTypeRefFlags mResolveFlags; BfCallingConvention mCallingConvention; bool mHadVar;