Browse Source

Improvements to method instance mIsIntrinsic handling

Brian Fiete 6 tháng trước cách đây
mục cha
commit
cfd2bab9fb

+ 2 - 0
IDEHelper/Compiler/BfCompiler.cpp

@@ -420,6 +420,7 @@ BfCompiler::BfCompiler(BfSystem* bfSystem, bool isResolveOnly)
 	mEnumTypeDef = NULL;
 	mFriendAttributeTypeDef = NULL;
 	mComptimeAttributeTypeDef = NULL;
+	mIntrinsicAttributeTypeDef = NULL;
 	mConstEvalAttributeTypeDef = NULL;
 	mNoExtensionAttributeTypeDef = NULL;
 	mCheckedAttributeTypeDef = NULL;
@@ -7275,6 +7276,7 @@ bool BfCompiler::DoCompile(const StringImpl& outputDirectory)
 	mFriendAttributeTypeDef = _GetRequiredType("System.FriendAttribute");
 	mNoStaticCtorAttributeTypeDef = _GetRequiredType("System.NoStaticCtorAttribute");
 	mComptimeAttributeTypeDef = _GetRequiredType("System.ComptimeAttribute");
+	mIntrinsicAttributeTypeDef = _GetRequiredType("System.IntrinsicAttribute");
 	mConstEvalAttributeTypeDef = _GetRequiredType("System.ConstEvalAttribute");
 	mNoExtensionAttributeTypeDef = _GetRequiredType("System.NoExtensionAttribute");
 	mCheckedAttributeTypeDef = _GetRequiredType("System.CheckedAttribute");

+ 1 - 0
IDEHelper/Compiler/BfCompiler.h

@@ -448,6 +448,7 @@ public:
 	BfTypeDef* mFriendAttributeTypeDef;
 	BfTypeDef* mNoStaticCtorAttributeTypeDef;
 	BfTypeDef* mComptimeAttributeTypeDef;
+	BfTypeDef* mIntrinsicAttributeTypeDef;
 	BfTypeDef* mConstEvalAttributeTypeDef;
 	BfTypeDef* mNoExtensionAttributeTypeDef;
 	BfTypeDef* mCheckedAttributeTypeDef;

+ 35 - 47
IDEHelper/Compiler/BfModule.cpp

@@ -8248,6 +8248,9 @@ void BfModule::CheckStaticAccess(BfTypeInstance* typeInstance)
 
 BfIRFunction BfModule::GetIntrinsic(BfMethodInstance* methodInstance, bool reportFailure)
 {
+	if (!methodInstance->mIsIntrinsic)
+		return BfIRFunction();
+
 	auto methodOwner = methodInstance->GetOwner();
 	auto methodDef = methodInstance->mMethodDef;
 	auto methodDeclaration = methodDef->GetMethodDeclaration();
@@ -8258,61 +8261,43 @@ BfIRFunction BfModule::GetIntrinsic(BfMethodInstance* methodInstance, bool repor
 	if (methodInstance->GetCustomAttributes() == NULL)
 		return BfIRFunction();
 
-	for (auto& customAttribute : methodInstance->GetCustomAttributes()->mAttributes)
-	{
-		String typeName = TypeToString(customAttribute.mType);
-		if ((typeName == "System.IntrinsicAttribute") && (customAttribute.mCtorArgs.size() > 0))
-		{
-			methodInstance->mIsIntrinsic = true;
+	auto customAttribute = methodInstance->GetCustomAttributes()->Get(mCompiler->mIntrinsicAttributeTypeDef);
+	auto constant = methodOwner->mConstHolder->GetConstant(customAttribute->mCtorArgs[0]);
+	String error;
 
-			auto constant = methodOwner->mConstHolder->GetConstant(customAttribute.mCtorArgs[0]);
-			String error;
+	if ((constant != NULL) && (constant->mTypeCode == BfTypeCode_StringId))
+	{
+		int stringId = constant->mInt32;
+		auto entry = mContext->mStringObjectIdMap[stringId];
+		String intrinName = entry.mString;
 
-			if ((constant != NULL) && (constant->mTypeCode == BfTypeCode_StringId))
+		int intrinId = BfIRCodeGen::GetIntrinsicId(intrinName);
+		if (intrinId != -1)
+		{
+			if (intrinId == BfIRIntrinsic_Malloc)
 			{
-				int stringId = constant->mInt32;
-				auto entry = mContext->mStringObjectIdMap[stringId];
-				String intrinName = entry.mString;
-
-// 				if (intrinName.StartsWith(":"))
-// 				{
-// 					SizedArray<BfIRType, 2> paramTypes;
-// 					for (auto& param : methodInstance->mParams)
-// 						paramTypes.push_back(mBfIRBuilder->MapType(param.mResolvedType));
-// 					return mBfIRBuilder->GetIntrinsic(intrinName.Substring(1), mBfIRBuilder->MapType(methodInstance->mReturnType), paramTypes);
-// 				}
-// 				else
-				{
-					int intrinId = BfIRCodeGen::GetIntrinsicId(intrinName);
-					if (intrinId != -1)
-					{
-						if (intrinId == BfIRIntrinsic_Malloc)
-						{
-							return GetBuiltInFunc(BfBuiltInFuncType_Malloc);
-						}
-						else if (intrinId == BfIRIntrinsic_Free)
-						{
-							return GetBuiltInFunc(BfBuiltInFuncType_Free);
-						}
-
-						SizedArray<BfIRType, 2> paramTypes;
-						for (auto& param : methodInstance->mParams)
-							paramTypes.push_back(mBfIRBuilder->MapType(param.mResolvedType));
-						return mBfIRBuilder->GetIntrinsic(intrinName, intrinId, mBfIRBuilder->MapType(methodInstance->mReturnType), paramTypes);
-					}
-					else if (reportFailure)
-						error = StrFormat("Unable to find intrinsic '%s'", entry.mString.c_str());
-				}
+				return GetBuiltInFunc(BfBuiltInFuncType_Malloc);
 			}
-			else if (reportFailure)
-				error = "Intrinsic name must be a constant string";
-
-			if (reportFailure)
+			else if (intrinId == BfIRIntrinsic_Free)
 			{
-				Fail(error, customAttribute.mRef);
+				return GetBuiltInFunc(BfBuiltInFuncType_Free);
 			}
+
+			SizedArray<BfIRType, 2> paramTypes;
+			for (auto& param : methodInstance->mParams)
+				paramTypes.push_back(mBfIRBuilder->MapType(param.mResolvedType));
+			return mBfIRBuilder->GetIntrinsic(intrinName, intrinId, mBfIRBuilder->MapType(methodInstance->mReturnType), paramTypes);
 		}
+		else if (reportFailure)
+			error = StrFormat("Unable to find intrinsic '%s'", entry.mString.c_str());		
 	}
+	else if (reportFailure)
+		error = "Intrinsic name must be a constant string";
+
+	if (reportFailure)
+	{
+		Fail(error, customAttribute->mRef);
+	}		
 
 	return BfIRFunction();
 }
@@ -24228,6 +24213,9 @@ void BfModule::GetMethodCustomAttributes(BfMethodInstance* methodInstance)
 
 	if (customAttributes != NULL)
 	{
+		if (customAttributes->Contains(mCompiler->mIntrinsicAttributeTypeDef))
+			methodInstance->mIsIntrinsic = true;
+
 		auto linkNameAttr = customAttributes->Get(mCompiler->mCallingConventionAttributeTypeDef);
 		if (linkNameAttr != NULL)
 		{