private void MergeSubroutineHelper(InstructionState s2)
{
if (subroutines == null || s2.subroutines == null)
{
if (subroutines != null)
{
subroutines = null;
changed = true;
}
}
else
{
SubroutinesCopyOnWrite();
List<Subroutine> ss1 = subroutines;
subroutines = new List<Subroutine>();
foreach (Subroutine ss2 in s2.subroutines)
{
foreach (Subroutine ss in ss1)
{
if (ss.SubroutineIndex == ss2.SubroutineIndex)
{
subroutines.Add(ss);
for (int i = 0; i < ss.LocalsModified.Length; i++)
{
if (ss2.LocalsModified[i] && !ss.LocalsModified[i])
{
ss.LocalsModified[i] = true;
changed = true;
}
}
}
}
}
if (ss1.Count != subroutines.Count)
{
changed = true;
}
}
if (s2.callsites > callsites)
{
//Console.WriteLine("s2.callsites = {0}, callsites = {1}", s2.callsites, callsites);
callsites = s2.callsites;
changed = true;
}
}