| 793 | } |
| 794 | |
| 795 | BeVTrackingList* BeVTrackingContext::MergeChanges(BeVTrackingList* prevDestEntry, BeVTrackingList* mergeFrom) |
| 796 | { |
| 797 | if (prevDestEntry == mergeFrom) |
| 798 | return prevDestEntry; |
| 799 | if (mergeFrom->mNumChanges == 0) |
| 800 | return prevDestEntry; |
| 801 | |
| 802 | SizedArray<int, 2> changes; |
| 803 | for (int changeIdx = 0; changeIdx < (int)prevDestEntry->mNumChanges; changeIdx++) |
| 804 | changes.push_back(prevDestEntry->GetChange(changeIdx)); |
| 805 | for (int changeIdx = 0; changeIdx < (int)mergeFrom->mNumChanges; changeIdx++) |
| 806 | { |
| 807 | // If there isn't already a change (whether and add or a remove) that refers to this same vreg, |
| 808 | // then we add this change as well |
| 809 | int change = mergeFrom->GetChange(changeIdx); |
| 810 | int negChange = -change - 1; |
| 811 | |
| 812 | /*if (((std::find(changes.begin(), changes.end(), change) == changes.end())) && |
| 813 | ((std::find(changes.begin(), changes.end(), negChange) == changes.end())))*/ |
| 814 | if ((!changes.Contains(change)) && (!changes.Contains(negChange))) |
| 815 | { |
| 816 | changes.push_back(change); |
| 817 | } |
| 818 | } |
| 819 | |
| 820 | int newSize = prevDestEntry->mSize; |
| 821 | int allocBytes = (int)(sizeof(int) * (2 + newSize + changes.size())); |
| 822 | auto newList = (BeVTrackingList*)mAlloc.AllocBytes(allocBytes); |
| 823 | mStats.mListBytes += allocBytes; |
| 824 | memcpy(&newList->mEntries[0], &prevDestEntry->mEntries[0], newSize * sizeof(int)); |
| 825 | for (int i = 0; i < (int)changes.size(); i++) |
| 826 | { |
| 827 | newList->mEntries[newSize + i] = changes[i]; |
| 828 | } |
| 829 | newList->mSize = newSize; |
| 830 | newList->mNumChanges = (int)changes.size(); |
| 831 | |
| 832 | return newList; |
| 833 | } |
| 834 | |
| 835 | BeVTrackingList * BeVTrackingContext::RemoveChange(BeVTrackingList* prevDestEntry, int idx) |
| 836 | { |
no test coverage detected