MCPcopy Create free account
hub / github.com/beefytech/Beef / CreateValueTypeEqualsMethod

Method CreateValueTypeEqualsMethod

IDEHelper/Compiler/BfModule.cpp:5311–5602  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

5309}
5310
5311void BfModule::CreateValueTypeEqualsMethod(bool strictEquals)
5312{
5313 if (mCurMethodInstance->mIsUnspecialized)
5314 return;
5315
5316 if (mBfIRBuilder->mIgnoreWrites)
5317 return;
5318
5319 BF_ASSERT(!mCurTypeInstance->IsBoxed());
5320
5321 auto compareType = mCurMethodInstance->mParams[0].mResolvedType;
5322 bool isValid = true;
5323
5324 auto boolType = GetPrimitiveType(BfTypeCode_Boolean);
5325 if (compareType->IsValuelessType())
5326 {
5327 mBfIRBuilder->CreateRet(GetDefaultValue(boolType));
5328 return;
5329 }
5330
5331 if (compareType->IsTypedPrimitive())
5332 {
5333 BfExprEvaluator exprEvaluator(this);
5334 BfTypedValue leftTypedVal = LoadValue(exprEvaluator.LoadLocal(mCurMethodState->mLocals[0]));
5335 BfTypedValue rightTypedVal = LoadValue(exprEvaluator.LoadLocal(mCurMethodState->mLocals[1]));
5336 auto cmpResult = mBfIRBuilder->CreateCmpEQ(leftTypedVal.mValue, rightTypedVal.mValue);
5337 mBfIRBuilder->CreateRet(cmpResult);
5338 return;
5339 }
5340
5341 auto compareDType = compareType->ToDependedType();
5342 BfTypeInstance* compareTypeInst = compareType->ToTypeInstance();
5343 if (compareTypeInst != NULL)
5344 {
5345 if (compareType->IsPrimitiveType())
5346 compareTypeInst = GetWrappedStructType(compareType);
5347 if ((compareTypeInst == NULL) || (!compareTypeInst->IsValueType()))
5348 {
5349 isValid = false;
5350 }
5351 mBfIRBuilder->PopulateType(compareTypeInst);
5352 }
5353
5354 if (!isValid)
5355 {
5356 ClearLifetimeEnds();
5357 mBfIRBuilder->CreateRet(GetDefaultValue(boolType));
5358 return;
5359 }
5360
5361 AddDependency(compareDType, mCurTypeInstance, BfDependencyMap::DependencyFlag_ReadFields);
5362
5363 auto refNode = mCurTypeInstance->mTypeDef->GetRefNode();
5364 if (refNode == NULL)
5365 refNode = mCompiler->mValueTypeTypeDef->GetRefNode();
5366 UpdateSrcPos(refNode);
5367 SetIllegalSrcPos();
5368

Callers

nothing calls this directly

Calls 15

BfTypedValueClass · 0.85
LoadLocalMethod · 0.80
CreateCmpEQMethod · 0.80
CreateCmpGTEMethod · 0.80
CreateAddMethod · 0.80
DoImplicitArgCaptureMethod · 0.80
GetDiscriminatorTypeMethod · 0.80
GetFieldDefMethod · 0.80
IsEnumCaseEntryMethod · 0.80
CreateSwitchMethod · 0.80

Tested by

no test coverage detected