| 8382 | } |
| 8383 | |
| 8384 | BfTypeInstance* BfModule::CreateTupleType(const BfTypeVector& fieldTypes, const Array<String>& fieldNames, bool allowVar) |
| 8385 | { |
| 8386 | auto baseType = (BfTypeInstance*)ResolveTypeDef(mContext->mCompiler->mValueTypeTypeDef); |
| 8387 | |
| 8388 | BfTupleType* tupleType = NULL; |
| 8389 | |
| 8390 | auto actualTupleType = mContext->mTupleTypePool.Get(); |
| 8391 | actualTupleType->Init(baseType->mTypeDef->mProject, baseType); |
| 8392 | |
| 8393 | bool isUnspecialzied = false; |
| 8394 | for (int fieldIdx = 0; fieldIdx < (int)fieldTypes.size(); fieldIdx++) |
| 8395 | { |
| 8396 | String fieldName; |
| 8397 | if (fieldIdx < (int)fieldNames.size()) |
| 8398 | fieldName = fieldNames[fieldIdx]; |
| 8399 | if (fieldName.empty()) |
| 8400 | fieldName = StrFormat("%d", fieldIdx); |
| 8401 | BfFieldDef* fieldDef = actualTupleType->AddField(fieldName); |
| 8402 | |
| 8403 | auto fieldType = fieldTypes[fieldIdx]; |
| 8404 | if ((fieldType->IsUnspecializedType()) || (fieldType->IsVar())) |
| 8405 | isUnspecialzied = true; |
| 8406 | } |
| 8407 | tupleType = actualTupleType; |
| 8408 | |
| 8409 | tupleType->mContext = mContext; |
| 8410 | tupleType->mFieldInstances.Resize(fieldTypes.size()); |
| 8411 | for (int fieldIdx = 0; fieldIdx < (int)fieldTypes.size(); fieldIdx++) |
| 8412 | { |
| 8413 | BfFieldInstance* fieldInstance = (BfFieldInstance*)&tupleType->mFieldInstances[fieldIdx]; |
| 8414 | fieldInstance->mFieldIdx = fieldIdx; |
| 8415 | BfType* fieldType = fieldTypes[fieldIdx]; |
| 8416 | if ((fieldType->IsVar()) && (!allowVar)) |
| 8417 | fieldType = mContext->mBfObjectType; |
| 8418 | fieldInstance->SetResolvedType(fieldType); |
| 8419 | fieldInstance->mOwner = tupleType; |
| 8420 | } |
| 8421 | |
| 8422 | tupleType->mIsUnspecializedType = false; |
| 8423 | tupleType->mIsUnspecializedTypeVariation = false; |
| 8424 | if (isUnspecialzied) |
| 8425 | { |
| 8426 | tupleType->mIsUnspecializedType = true; |
| 8427 | tupleType->mIsUnspecializedTypeVariation = true; |
| 8428 | } |
| 8429 | |
| 8430 | auto resolvedTupleType = ResolveType(tupleType); |
| 8431 | if (resolvedTupleType != tupleType) |
| 8432 | { |
| 8433 | BF_ASSERT(tupleType->mContext != NULL); |
| 8434 | tupleType->Dispose(); |
| 8435 | mContext->mTupleTypePool.GiveBack((BfTupleType*)tupleType); |
| 8436 | } |
| 8437 | |
| 8438 | return (BfTupleType*)resolvedTupleType; |
| 8439 | } |
| 8440 | |
| 8441 | BfTypeInstance* BfModule::SantizeTupleType(BfTypeInstance* tupleType) |
no test coverage detected