| 5309 | } |
| 5310 | |
| 5311 | void 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 |
nothing calls this directly
no test coverage detected