mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-08 19:48:20 +02:00
Added RefType, changed how CRepr types are represented
This commit is contained in:
parent
716f7b3638
commit
0c946de3ca
13 changed files with 311 additions and 40 deletions
|
@ -4335,11 +4335,9 @@ void BfModule::CreateValueTypeEqualsMethod(bool strictEquals)
|
|||
|
||||
auto baseTypeInst = compareTypeInst->mBaseType;
|
||||
if ((baseTypeInst != NULL) && (baseTypeInst->mTypeDef != mCompiler->mValueTypeTypeDef))
|
||||
{
|
||||
BfTypedValue leftOrigValue(mCurMethodState->mLocals[0]->mValue, compareTypeInst, true);
|
||||
BfTypedValue rightOrigValue(mCurMethodState->mLocals[1]->mValue, compareTypeInst, true);
|
||||
BfTypedValue leftValue = Cast(NULL, leftOrigValue, baseTypeInst);
|
||||
BfTypedValue rightValue = Cast(NULL, rightOrigValue, baseTypeInst);
|
||||
{
|
||||
BfTypedValue leftValue = Cast(NULL, leftTypedVal, baseTypeInst);
|
||||
BfTypedValue rightValue = Cast(NULL, rightTypedVal, baseTypeInst);
|
||||
EmitEquals(leftValue, rightValue, exitBB, strictEquals);
|
||||
}
|
||||
}
|
||||
|
@ -4639,6 +4637,8 @@ BfIRValue BfModule::CreateTypeData(BfType* type, Dictionary<int, int>& usedStrin
|
|||
}
|
||||
else if (type->IsPointer())
|
||||
typeDataSource = ResolveTypeDef(mCompiler->mReflectPointerType)->ToTypeInstance();
|
||||
else if (type->IsRef())
|
||||
typeDataSource = ResolveTypeDef(mCompiler->mReflectRefType)->ToTypeInstance();
|
||||
else if (type->IsSizedArray())
|
||||
typeDataSource = ResolveTypeDef(mCompiler->mReflectSizedArrayType)->ToTypeInstance();
|
||||
else
|
||||
|
@ -4700,6 +4700,11 @@ BfIRValue BfModule::CreateTypeData(BfType* type, Dictionary<int, int>& usedStrin
|
|||
typeCode = BfTypeCode_Pointer;
|
||||
typeFlags |= BfTypeFlags_Pointer;
|
||||
}
|
||||
else if (type->IsRef())
|
||||
{
|
||||
typeCode = BfTypeCode_Pointer;
|
||||
typeFlags |= BfTypeFlags_Pointer;
|
||||
}
|
||||
|
||||
if (type->IsObject())
|
||||
{
|
||||
|
@ -4781,6 +4786,23 @@ BfIRValue BfModule::CreateTypeData(BfType* type, Dictionary<int, int>& usedStrin
|
|||
mBfIRBuilder->GlobalVar_SetAlignment(typeDataVar, mSystem->mPtrSize);
|
||||
typeDataVar = mBfIRBuilder->CreateBitCast(typeDataVar, mBfIRBuilder->MapType(mContext->mBfTypeType));
|
||||
}
|
||||
else if (type->IsRef())
|
||||
{
|
||||
auto refType = (BfRefType*)type;
|
||||
SizedArray<BfIRValue, 3> refTypeDataParms =
|
||||
{
|
||||
typeData,
|
||||
GetConstValue(refType->mElementType->mTypeId, typeIdType),
|
||||
GetConstValue((int8)refType->mRefKind, byteType),
|
||||
};
|
||||
|
||||
auto reflectRefType = ResolveTypeDef(mCompiler->mReflectRefType)->ToTypeInstance();
|
||||
auto refTypeData = mBfIRBuilder->CreateConstStruct(mBfIRBuilder->MapTypeInst(reflectRefType, BfIRPopulateType_Full), refTypeDataParms);
|
||||
typeDataVar = mBfIRBuilder->CreateGlobalVariable(mBfIRBuilder->MapTypeInst(reflectRefType), true,
|
||||
BfIRLinkageType_External, refTypeData, typeDataName);
|
||||
mBfIRBuilder->GlobalVar_SetAlignment(typeDataVar, mSystem->mPtrSize);
|
||||
typeDataVar = mBfIRBuilder->CreateBitCast(typeDataVar, mBfIRBuilder->MapType(mContext->mBfTypeType));
|
||||
}
|
||||
else if (type->IsSizedArray())
|
||||
{
|
||||
auto sizedArrayType = (BfSizedArrayType*)type;
|
||||
|
@ -6190,6 +6212,7 @@ BfIRValue BfModule::CreateTypeData(BfType* type, Dictionary<int, int>& usedStrin
|
|||
SizedArray<BfIRValue, 32> typeDataVals =
|
||||
{
|
||||
typeData,
|
||||
|
||||
castedClassVData, // mTypeClassVData
|
||||
typeNameConst, // mName
|
||||
namespaceConst, // mNamespace
|
||||
|
@ -12823,9 +12846,10 @@ void BfModule::DoLocalVariableDebugInfo(BfLocalVariable* localVarDef, bool doAli
|
|||
|
||||
BfLocalVariable* BfModule::AddLocalVariableDef(BfLocalVariable* localVarDef, bool addDebugInfo, bool doAliasValue, BfIRValue declareBefore, BfIRInitType initType)
|
||||
{
|
||||
if ((localVarDef->mValue) && (!localVarDef->mAddr) && (IsTargetingBeefBackend()))
|
||||
if ((localVarDef->mValue) && (!localVarDef->mAddr) && (IsTargetingBeefBackend()) && (!localVarDef->mResolvedType->IsValuelessType()))
|
||||
{
|
||||
if ((!localVarDef->mValue.IsConst()) && (!localVarDef->mValue.IsArg()) && (!localVarDef->mValue.IsFake()))
|
||||
if ((!localVarDef->mValue.IsConst()) &&
|
||||
(!localVarDef->mValue.IsArg()) && (!localVarDef->mValue.IsFake()))
|
||||
{
|
||||
mBfIRBuilder->CreateValueScopeRetain(localVarDef->mValue);
|
||||
mCurMethodState->mCurScope->mHadScopeValueRetain = true;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue