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

Method TypeDataChanged

IDEHelper/Compiler/BfContext.cpp:1404–1498  ·  view source on GitHub ↗

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

Source from the content-addressed store, hash-verified

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
1404void 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

Callers

nothing calls this directly

Calls 5

ToDependedTypeMethod · 0.45
ToTypeInstanceMethod · 0.45
IsValueTypeMethod · 0.45
IsHotCompileMethod · 0.45
IsTypeAliasMethod · 0.45

Tested by

no test coverage detected