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

Method HandleTupleVariableDeclaration

IDEHelper/Compiler/BfStmtEvaluator.cpp:2188–2334  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2186}
2187
2188void BfModule::HandleTupleVariableDeclaration(BfVariableDeclaration* varDecl, BfTupleExpression* tupleExpr, BfTypedValue initTupleValue, bool isReadOnly, bool isConst, bool forceAddr, BfIRBlock* declBlock)
2189{
2190 BfTypeInstance* initTupleType = NULL;
2191 if ((initTupleValue) && (initTupleValue.mType->IsTuple()))
2192 initTupleType = (BfTypeInstance*)initTupleValue.mType;
2193
2194 CheckTupleVariableDeclaration(tupleExpr, initTupleValue.mType);
2195 mBfIRBuilder->PopulateType(initTupleValue.mType);
2196
2197 for (int varIdx = 0; varIdx < (int)tupleExpr->mValues.size(); varIdx++)
2198 {
2199 BfType* resolvedType = NULL;
2200 BfTypedValue initValue;
2201 if ((initTupleType != NULL) && (varIdx < (int)initTupleType->mFieldInstances.size()))
2202 {
2203 auto fieldInstance = &initTupleType->mFieldInstances[varIdx];
2204 auto fieldDef = fieldInstance->GetFieldDef();
2205 resolvedType = fieldInstance->GetResolvedType();
2206 if (fieldInstance->mDataIdx != -1)
2207 {
2208 if (initTupleValue.IsAddr())
2209 {
2210 initValue = BfTypedValue(mBfIRBuilder->CreateInBoundsGEP(initTupleValue.mValue, 0, fieldInstance->mDataIdx), resolvedType, true);
2211 initValue = LoadValue(initValue);
2212 }
2213 else
2214 initValue = ExtractValue(initTupleValue, fieldInstance, fieldInstance->mDataIdx);
2215 }
2216
2217 BfTupleNameNode* tupleNameNode = NULL;
2218 if (varIdx < (int)tupleExpr->mNames.size())
2219 tupleNameNode = tupleExpr->mNames[varIdx];
2220
2221 if (!fieldDef->IsUnnamedTupleField())
2222 {
2223 if (tupleNameNode != NULL)
2224 {
2225 if (fieldDef->mName != tupleNameNode->mNameNode->ToString())
2226 {
2227 Fail(StrFormat("Mismatched tuple field name, expected '%s'", fieldDef->mName.c_str()), tupleNameNode->mNameNode);
2228 }
2229 }
2230 }
2231 else if ((tupleNameNode != NULL) && (tupleNameNode->mNameNode != NULL))
2232 {
2233 Fail(StrFormat("Unexpected tuple field name, expected unnamed tuple field", fieldDef->mName.c_str()), tupleNameNode->mNameNode);
2234 }
2235 }
2236 else
2237 {
2238 resolvedType = mContext->mBfObjectType;
2239 initValue = GetDefaultTypedValue(resolvedType);
2240 }
2241
2242 BfExpression* varNameNode = tupleExpr->mValues[varIdx];
2243 if (!varNameNode->IsExact<BfIdentifierNode>())
2244 {
2245 if (BfTupleExpression* innerTupleExpr = BfNodeDynCast<BfTupleExpression>(varNameNode))

Callers 1

VisitMethod · 0.80

Calls 15

BfTypedValueClass · 0.85
FailFunction · 0.85
BfIRValueClass · 0.85
GetFieldDefMethod · 0.80
GetResolvedTypeMethod · 0.80
IsAddrMethod · 0.80
CreateInBoundsGEPMethod · 0.80
IsUnnamedTupleFieldMethod · 0.80
CheckEmptyStartMethod · 0.80
GetSourceDataMethod · 0.80
CheckTypeRefMethod · 0.80
GetTokenMethod · 0.80

Tested by

no test coverage detected