mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-08 19:48:20 +02:00
Improvements to method instance mIsIntrinsic handling
This commit is contained in:
parent
1805316b70
commit
cfd2bab9fb
3 changed files with 38 additions and 47 deletions
|
@ -420,6 +420,7 @@ BfCompiler::BfCompiler(BfSystem* bfSystem, bool isResolveOnly)
|
||||||
mEnumTypeDef = NULL;
|
mEnumTypeDef = NULL;
|
||||||
mFriendAttributeTypeDef = NULL;
|
mFriendAttributeTypeDef = NULL;
|
||||||
mComptimeAttributeTypeDef = NULL;
|
mComptimeAttributeTypeDef = NULL;
|
||||||
|
mIntrinsicAttributeTypeDef = NULL;
|
||||||
mConstEvalAttributeTypeDef = NULL;
|
mConstEvalAttributeTypeDef = NULL;
|
||||||
mNoExtensionAttributeTypeDef = NULL;
|
mNoExtensionAttributeTypeDef = NULL;
|
||||||
mCheckedAttributeTypeDef = NULL;
|
mCheckedAttributeTypeDef = NULL;
|
||||||
|
@ -7275,6 +7276,7 @@ bool BfCompiler::DoCompile(const StringImpl& outputDirectory)
|
||||||
mFriendAttributeTypeDef = _GetRequiredType("System.FriendAttribute");
|
mFriendAttributeTypeDef = _GetRequiredType("System.FriendAttribute");
|
||||||
mNoStaticCtorAttributeTypeDef = _GetRequiredType("System.NoStaticCtorAttribute");
|
mNoStaticCtorAttributeTypeDef = _GetRequiredType("System.NoStaticCtorAttribute");
|
||||||
mComptimeAttributeTypeDef = _GetRequiredType("System.ComptimeAttribute");
|
mComptimeAttributeTypeDef = _GetRequiredType("System.ComptimeAttribute");
|
||||||
|
mIntrinsicAttributeTypeDef = _GetRequiredType("System.IntrinsicAttribute");
|
||||||
mConstEvalAttributeTypeDef = _GetRequiredType("System.ConstEvalAttribute");
|
mConstEvalAttributeTypeDef = _GetRequiredType("System.ConstEvalAttribute");
|
||||||
mNoExtensionAttributeTypeDef = _GetRequiredType("System.NoExtensionAttribute");
|
mNoExtensionAttributeTypeDef = _GetRequiredType("System.NoExtensionAttribute");
|
||||||
mCheckedAttributeTypeDef = _GetRequiredType("System.CheckedAttribute");
|
mCheckedAttributeTypeDef = _GetRequiredType("System.CheckedAttribute");
|
||||||
|
|
|
@ -448,6 +448,7 @@ public:
|
||||||
BfTypeDef* mFriendAttributeTypeDef;
|
BfTypeDef* mFriendAttributeTypeDef;
|
||||||
BfTypeDef* mNoStaticCtorAttributeTypeDef;
|
BfTypeDef* mNoStaticCtorAttributeTypeDef;
|
||||||
BfTypeDef* mComptimeAttributeTypeDef;
|
BfTypeDef* mComptimeAttributeTypeDef;
|
||||||
|
BfTypeDef* mIntrinsicAttributeTypeDef;
|
||||||
BfTypeDef* mConstEvalAttributeTypeDef;
|
BfTypeDef* mConstEvalAttributeTypeDef;
|
||||||
BfTypeDef* mNoExtensionAttributeTypeDef;
|
BfTypeDef* mNoExtensionAttributeTypeDef;
|
||||||
BfTypeDef* mCheckedAttributeTypeDef;
|
BfTypeDef* mCheckedAttributeTypeDef;
|
||||||
|
|
|
@ -8248,6 +8248,9 @@ void BfModule::CheckStaticAccess(BfTypeInstance* typeInstance)
|
||||||
|
|
||||||
BfIRFunction BfModule::GetIntrinsic(BfMethodInstance* methodInstance, bool reportFailure)
|
BfIRFunction BfModule::GetIntrinsic(BfMethodInstance* methodInstance, bool reportFailure)
|
||||||
{
|
{
|
||||||
|
if (!methodInstance->mIsIntrinsic)
|
||||||
|
return BfIRFunction();
|
||||||
|
|
||||||
auto methodOwner = methodInstance->GetOwner();
|
auto methodOwner = methodInstance->GetOwner();
|
||||||
auto methodDef = methodInstance->mMethodDef;
|
auto methodDef = methodInstance->mMethodDef;
|
||||||
auto methodDeclaration = methodDef->GetMethodDeclaration();
|
auto methodDeclaration = methodDef->GetMethodDeclaration();
|
||||||
|
@ -8258,14 +8261,8 @@ BfIRFunction BfModule::GetIntrinsic(BfMethodInstance* methodInstance, bool repor
|
||||||
if (methodInstance->GetCustomAttributes() == NULL)
|
if (methodInstance->GetCustomAttributes() == NULL)
|
||||||
return BfIRFunction();
|
return BfIRFunction();
|
||||||
|
|
||||||
for (auto& customAttribute : methodInstance->GetCustomAttributes()->mAttributes)
|
auto customAttribute = methodInstance->GetCustomAttributes()->Get(mCompiler->mIntrinsicAttributeTypeDef);
|
||||||
{
|
auto constant = methodOwner->mConstHolder->GetConstant(customAttribute->mCtorArgs[0]);
|
||||||
String typeName = TypeToString(customAttribute.mType);
|
|
||||||
if ((typeName == "System.IntrinsicAttribute") && (customAttribute.mCtorArgs.size() > 0))
|
|
||||||
{
|
|
||||||
methodInstance->mIsIntrinsic = true;
|
|
||||||
|
|
||||||
auto constant = methodOwner->mConstHolder->GetConstant(customAttribute.mCtorArgs[0]);
|
|
||||||
String error;
|
String error;
|
||||||
|
|
||||||
if ((constant != NULL) && (constant->mTypeCode == BfTypeCode_StringId))
|
if ((constant != NULL) && (constant->mTypeCode == BfTypeCode_StringId))
|
||||||
|
@ -8274,15 +8271,6 @@ BfIRFunction BfModule::GetIntrinsic(BfMethodInstance* methodInstance, bool repor
|
||||||
auto entry = mContext->mStringObjectIdMap[stringId];
|
auto entry = mContext->mStringObjectIdMap[stringId];
|
||||||
String intrinName = entry.mString;
|
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);
|
int intrinId = BfIRCodeGen::GetIntrinsicId(intrinName);
|
||||||
if (intrinId != -1)
|
if (intrinId != -1)
|
||||||
{
|
{
|
||||||
|
@ -8303,15 +8291,12 @@ BfIRFunction BfModule::GetIntrinsic(BfMethodInstance* methodInstance, bool repor
|
||||||
else if (reportFailure)
|
else if (reportFailure)
|
||||||
error = StrFormat("Unable to find intrinsic '%s'", entry.mString.c_str());
|
error = StrFormat("Unable to find intrinsic '%s'", entry.mString.c_str());
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else if (reportFailure)
|
else if (reportFailure)
|
||||||
error = "Intrinsic name must be a constant string";
|
error = "Intrinsic name must be a constant string";
|
||||||
|
|
||||||
if (reportFailure)
|
if (reportFailure)
|
||||||
{
|
{
|
||||||
Fail(error, customAttribute.mRef);
|
Fail(error, customAttribute->mRef);
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return BfIRFunction();
|
return BfIRFunction();
|
||||||
|
@ -24228,6 +24213,9 @@ void BfModule::GetMethodCustomAttributes(BfMethodInstance* methodInstance)
|
||||||
|
|
||||||
if (customAttributes != NULL)
|
if (customAttributes != NULL)
|
||||||
{
|
{
|
||||||
|
if (customAttributes->Contains(mCompiler->mIntrinsicAttributeTypeDef))
|
||||||
|
methodInstance->mIsIntrinsic = true;
|
||||||
|
|
||||||
auto linkNameAttr = customAttributes->Get(mCompiler->mCallingConventionAttributeTypeDef);
|
auto linkNameAttr = customAttributes->Get(mCompiler->mCallingConventionAttributeTypeDef);
|
||||||
if (linkNameAttr != NULL)
|
if (linkNameAttr != NULL)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue