/// <inheritdoc /> public void Assign(Snapshot snapshot, MemoryPath path, MemoryEntry value, bool forceStrongWrite) { if (snapshot.AssignInfo == null) { snapshot.AssignInfo = new AssignInfo(); } MemoryIndexModificationList pathModifications = snapshot.AssignInfo.GetOrCreatePathModification(path); // Collecting all sources of the data MemoryEntryCollector entryCollector = new MemoryEntryCollector(snapshot); entryCollector.ProcessRootMemoryEntry(value); // Collecting all locations where to assign into TreeIndexCollector treeCollector = new TreeIndexCollector(snapshot); treeCollector.PostProcessAliases = true; treeCollector.ProcessPath(path); // Provides an assign operation AssignWorker worker = new AssignWorker(Factories, snapshot, entryCollector, treeCollector, pathModifications); worker.ForceStrongWrite = forceStrongWrite; worker.Assign(); }
/// <inheritdoc /> public void AssignAlias(Snapshot snapshot, MemoryPath targetPath, MemoryPath sourcePath) { if (snapshot.AssignInfo == null) { snapshot.AssignInfo = new AssignInfo(); } // Collects memory location of alias sources TreeIndexCollector aliasSourcesCollector = new TreeIndexCollector(snapshot); aliasSourcesCollector.ProcessPath(sourcePath); // Creates missing source locations and collect source data AliasWorker aliasWorker = new AliasWorker(Factories, snapshot, aliasSourcesCollector, snapshot.AssignInfo.AliasAssignModifications); aliasWorker.CollectAliases(); // Collects target locations TreeIndexCollector aliasTargetCollector = new TreeIndexCollector(snapshot); aliasTargetCollector.ProcessPath(targetPath); // Creates missing target locations, create aliases and assign source data AssignWorker assignWorker = new AssignWorker(Factories, snapshot, aliasWorker.EntryCollector, aliasTargetCollector, snapshot.AssignInfo.AliasAssignModifications); assignWorker.AssignAliasesIntoCollectedIndexes = true; assignWorker.Assign(); }
/// <inheritdoc /> public void Assign(Snapshot snapshot, Memory.MemoryPath path, AnalysisFramework.Memory.MemoryEntry value, bool forceStrongWrite) { TemporaryIndex temporaryIndex = snapshot.CreateTemporary(); MergeWithinSnapshotWorker mergeWorker = new MergeWithinSnapshotWorker(snapshot); mergeWorker.MergeMemoryEntry(temporaryIndex, value); AssignCollector collector = new AssignCollector(snapshot); collector.ProcessPath(path); if (forceStrongWrite) { collector.SetAllToMust(); } AssignWorker worker = new AssignWorker(snapshot); worker.Assign(collector, temporaryIndex); snapshot.ReleaseTemporary(temporaryIndex); }