/// <summary> /// Assigns the specified collector. /// </summary> /// <param name="collector">The collector.</param> /// <param name="sourceIndex">Index of the source.</param> internal void Assign(IIndexCollector collector, MemoryIndex sourceIndex) { foreach (MemoryIndex mustIndex in collector.MustIndexes) { snapshot.DestroyMemory(mustIndex); CopyWithinSnapshotWorker copyWorker = new CopyWithinSnapshotWorker(snapshot, true); copyWorker.Copy(sourceIndex, mustIndex); } foreach (MemoryIndex mayIndex in collector.MayIndexes) { MergeWithinSnapshotWorker mergeWorker = new MergeWithinSnapshotWorker(snapshot); mergeWorker.MergeIndexes(mayIndex, sourceIndex); } MemoryEntry entry = SnapshotDataUtils.GetMemoryEntry(snapshot, snapshot.CurrentData.Readonly, sourceIndex); LocationVisitor mustVisitor = new LocationVisitor(snapshot, entry, true); foreach (ValueLocation location in collector.MustLocation) { location.Accept(mustVisitor); } LocationVisitor mayVisitor = new LocationVisitor(snapshot, entry, false); foreach (ValueLocation location in collector.MayLocaton) { location.Accept(mayVisitor); } }
/// <summary> /// Initializes a new instance of the <see cref="CopyWithinSnapshotVisitor" /> class. /// </summary> /// <param name="snapshot">The snapshot.</param> /// <param name="worker">The worker.</param> /// <param name="index">The index.</param> public CopyWithinSnapshotVisitor(Snapshot snapshot, CopyWithinSnapshotWorker worker, MemoryIndex index) { this.snapshot = snapshot; this.worker = worker; this.index = index; }