| 3735 | } |
| 3736 | |
| 3737 | void BfModule::AddDependency(BfType* usedType, BfType* userType, BfDependencyMap::DependencyFlags flags, BfDepContext* depContext) |
| 3738 | { |
| 3739 | if (usedType == userType) |
| 3740 | return; |
| 3741 | |
| 3742 | if (((flags & BfDependencyMap::DependencyFlag_ConstValue) != 0) && (mContext->mCurTypeState != NULL) && (mContext->mCurTypeState->mResolveKind == BfTypeState::ResolveKind_FieldType)) |
| 3743 | { |
| 3744 | // This can be an `int32[UsedType.cVal]` type reference |
| 3745 | flags = (BfDependencyMap::DependencyFlags)(flags | BfDependencyMap::DependencyFlag_ValueTypeSizeDep); |
| 3746 | } |
| 3747 | |
| 3748 | if ((mCurMethodInstance != NULL) && (mCurMethodInstance->mIsAutocompleteMethod)) |
| 3749 | { |
| 3750 | if (userType->IsMethodRef()) |
| 3751 | { |
| 3752 | // We cannot short-circuit dependencies because of method group ref counting |
| 3753 | } |
| 3754 | else |
| 3755 | return; |
| 3756 | } |
| 3757 | |
| 3758 | if (usedType->IsSpecializedByAutoCompleteMethod()) |
| 3759 | { |
| 3760 | if ((flags & (BfDependencyMap::DependencyFlag_TypeGenericArg | BfDependencyMap::DependencyFlag_MethodGenericArg | |
| 3761 | BfDependencyMap::DependencyFlag_OuterType | BfDependencyMap::DependencyFlag_DerivedFrom)) == 0) |
| 3762 | return; |
| 3763 | } |
| 3764 | |
| 3765 | // if (usedType->IsBoxed()) |
| 3766 | // { |
| 3767 | // NOP; |
| 3768 | // auto underlyingType = usedType->GetUnderlyingType()->ToTypeInstance(); |
| 3769 | // if ((underlyingType != NULL) && (underlyingType->IsInstanceOf(mCompiler->mSizedArrayTypeDef))) |
| 3770 | // { |
| 3771 | // BfLogSysM("AddDependency UsedType:%p UserType:%p Method:%p\n", usedType, userType, mCurMethodInstance); |
| 3772 | // } |
| 3773 | // } |
| 3774 | |
| 3775 | // TODO: It seems this was bogus - it kept the root array from being marked as a dependency (for example) |
| 3776 | // BfType* origUsedType = usedType; |
| 3777 | bool isDataAccess = ((flags & (BfDependencyMap::DependencyFlag_ReadFields | BfDependencyMap::DependencyFlag_LocalUsage | BfDependencyMap::DependencyFlag_Allocates)) != 0); |
| 3778 | // if (isDataAccess) |
| 3779 | // { |
| 3780 | // while (true) |
| 3781 | // { |
| 3782 | // if ((usedType->IsPointer()) || (usedType->IsRef()) || (usedType->IsSizedArray())) |
| 3783 | // usedType = usedType->GetUnderlyingType(); |
| 3784 | // else if (usedType->IsArray()) |
| 3785 | // { |
| 3786 | // usedType = ((BfTypeInstance*)usedType)->mGenericTypeInfo->mTypeGenericArguments[0]; |
| 3787 | // } |
| 3788 | // else |
| 3789 | // break; |
| 3790 | // } |
| 3791 | // } |
| 3792 | |
| 3793 | if ((mCurMethodState != NULL) && (mCurMethodState->mHotDataReferenceBuilder != NULL) && (usedType != mCurTypeInstance) && (isDataAccess)) |
| 3794 | { |
no test coverage detected