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

Method LoadLocal

IDEHelper/Compiler/BfExprEvaluator.cpp:4327–4571  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

4325}
4326
4327BfTypedValue BfExprEvaluator::LoadLocal(BfLocalVariable* varDecl, bool allowRef)
4328{
4329 if (!mModule->mIsInsideAutoComplete)
4330 varDecl->mReadFromId = mModule->mCurMethodState->GetRootMethodState()->mCurAccessId++;
4331
4332 // The Beef backend prefers readonly addrs since that reduces register pressure, whereas
4333 // LLVM prefers values to avoid memory loads. This only applies to primitive types...
4334 bool preferValue = (varDecl->mResolvedType->IsPrimitiveType()) && (!mModule->IsTargetingBeefBackend());
4335
4336 BfTypedValue localResult;
4337 if (varDecl->mIsThis)
4338 {
4339 return mModule->GetThis();
4340 }
4341 else if (varDecl->mConstValue)
4342 {
4343 localResult = BfTypedValue(varDecl->mConstValue, varDecl->mResolvedType, false);
4344 }
4345 else if (varDecl->mIsSplat)
4346 {
4347 if (!varDecl->mResolvedType->IsValuelessType())
4348 localResult = BfTypedValue(varDecl->mValue, varDecl->mResolvedType, BfTypedValueKind_SplatHead);
4349 else if ((varDecl->mResolvedType->IsRef()) && (!allowRef))
4350 {
4351 BF_ASSERT(varDecl->mResolvedType->IsValuelessType());
4352 localResult = BfTypedValue(varDecl->mValue, varDecl->mResolvedType->GetUnderlyingType());
4353 }
4354 else
4355 localResult = BfTypedValue(varDecl->mValue, varDecl->mResolvedType);
4356 //BF_ASSERT(varDecl->mValue.IsArg());
4357 }
4358 else if ((varDecl->mValue) && ((varDecl->mIsReadOnly && preferValue) || (!varDecl->mAddr)))
4359 {
4360 if ((varDecl->mResolvedType->IsRef()) && (!allowRef))
4361 {
4362 BfRefType* refType = (BfRefType*)varDecl->mResolvedType;
4363 BfType* innerType = refType->mElementType;
4364
4365 if (innerType->IsGenericParam())
4366 {
4367 if (refType->mRefKind == BfRefType::RefKind_Mut)
4368 {
4369 localResult = BfTypedValue(varDecl->mValue, innerType, BfTypedValueKind_MutableValue);
4370 return localResult;
4371 }
4372 else
4373 {
4374 localResult = BfTypedValue(varDecl->mValue, innerType, BfTypedValueKind_Addr);
4375 return localResult;
4376 }
4377 }
4378
4379 localResult = BfTypedValue(varDecl->mValue, innerType, varDecl->mIsReadOnly ? BfTypedValueKind_ReadOnlyAddr : BfTypedValueKind_Addr);
4380 }
4381 else
4382 {
4383 BfTypedValueKind kind;
4384 if ((varDecl->mResolvedType->IsComposite()) && (varDecl->mValue.IsArg()))

Callers 10

VisitMethod · 0.80
EmitCtorBodyMethod · 0.80
EmitEnumToStringBodyMethod · 0.80
EmitTupleToStringBodyMethod · 0.80
ProcessMethodMethod · 0.80
ResolveArgValuesMethod · 0.80

Calls 15

BfTypedValueClass · 0.85
BfIRValueClass · 0.85
GetRootMethodStateMethod · 0.80
IsArgMethod · 0.80
GetFakeValMethod · 0.80
LoadValueMethod · 0.80
CreateTupleTypeMethod · 0.80
LoadOrAggregateValueMethod · 0.80

Tested by

no test coverage detected