Dependencies cascade as such: DerivedFrom / StructMemberData: these change the layout of memory for the dependent classes, so not only do the dependent classes need to be rebuild, but any other classes relying on those derived classes (either by derivation, containment, or field reading) need to have their code recompiled as well. ReadFields: when ClassB depends on the data layout of ClassA, and C
| 1402 | // (obviously) doesn't change the data layout of ClassC |
| 1403 | // Calls: non-cascading dependency, since it's independent of data layout ConstValue: non-cascading data change |
| 1404 | void BfContext::TypeDataChanged(BfDependedType* dType, bool isNonStaticDataChange) |
| 1405 | { |
| 1406 | BfLogSysM("TypeDataChanged %p\n", dType); |
| 1407 | |
| 1408 | auto rebuildFlag = isNonStaticDataChange ? BfTypeRebuildFlag_NonStaticChange : BfTypeRebuildFlag_StaticChange; |
| 1409 | if ((dType->mRebuildFlags & rebuildFlag) != 0) // Already did this change? |
| 1410 | return; |
| 1411 | dType->mRebuildFlags = (BfTypeRebuildFlags)(dType->mRebuildFlags | rebuildFlag); |
| 1412 | |
| 1413 | // We need to rebuild all other types that rely on our data layout |
| 1414 | for (auto& depItr : dType->mDependencyMap) |
| 1415 | { |
| 1416 | auto dependentType = depItr.mKey; |
| 1417 | auto dependencyFlags = depItr.mValue.mFlags; |
| 1418 | |
| 1419 | auto dependentDType = dependentType->ToDependedType(); |
| 1420 | if (dependentDType != NULL) |
| 1421 | { |
| 1422 | auto dependentTypeInstance = dependentType->ToTypeInstance(); |
| 1423 | if (isNonStaticDataChange) |
| 1424 | { |
| 1425 | bool hadChange = false; |
| 1426 | |
| 1427 | if ((dependencyFlags & |
| 1428 | (BfDependencyMap::DependencyFlag_DerivedFrom | |
| 1429 | BfDependencyMap::DependencyFlag_ValueTypeMemberData | |
| 1430 | BfDependencyMap::DependencyFlag_NameReference | |
| 1431 | BfDependencyMap::DependencyFlag_ValueTypeSizeDep)) != 0) |
| 1432 | { |
| 1433 | hadChange = true; |
| 1434 | } |
| 1435 | |
| 1436 | // This case is for when we were declared as a class on a previous compilation, |
| 1437 | // but then we were changed to a struct |
| 1438 | if ((dType->IsValueType()) && |
| 1439 | (dependencyFlags & BfDependencyMap::DependencyFlag_PtrMemberData)) |
| 1440 | { |
| 1441 | hadChange = true; |
| 1442 | } |
| 1443 | |
| 1444 | if (mCompiler->IsHotCompile()) |
| 1445 | { |
| 1446 | // VData layout may be changing if there's a data change... |
| 1447 | if (dependencyFlags & BfDependencyMap::DependencyFlag_VirtualCall) |
| 1448 | { |
| 1449 | hadChange = true; |
| 1450 | } |
| 1451 | } |
| 1452 | |
| 1453 | if (hadChange) |
| 1454 | TypeDataChanged(dependentDType, true); |
| 1455 | } |
| 1456 | |
| 1457 | if (dependencyFlags & BfDependencyMap::DependencyFlag_ConstValue) |
| 1458 | { |
| 1459 | TypeDataChanged(dependentDType, false); |
| 1460 | |
| 1461 | // The ConstValue dependency may be that dependentType used one of our consts as |
nothing calls this directly
no test coverage detected