Jsm.InstructionMerger.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. using OpenVIII.Fields.Scripts.Instructions;
  2. using System;
  3. using System.Collections.Generic;
  4. namespace OpenVIII.Fields.Scripts
  5. {
  6. public static partial class Jsm
  7. {
  8. public static class InstructionMerger
  9. {
  10. public static List<JsmInstruction> Merge(List<JsmInstruction> instructions, HashSet<Int32> labelIndices)
  11. {
  12. List<JsmInstruction> result = new List<JsmInstruction>(instructions.Count);
  13. for (Int32 i = 0; i < instructions.Count; i++)
  14. {
  15. JsmInstruction instruction = instructions[i];
  16. result.Add(instruction);
  17. if (labelIndices.Contains(i))
  18. continue;
  19. if (!(instructions[i] is JPF newJpf))
  20. continue;
  21. if (i + 1 < instructions.Count && instructions[i + 1] is JMP nextJmp)
  22. newJpf.Inverse(nextJmp);
  23. if (!(result[result.Count - 2] is JPF oldJpf))
  24. continue;
  25. if (oldJpf.Index != newJpf.Index)
  26. continue;
  27. Int32 currentIndex = result.LastIndex();
  28. oldJpf.Union(newJpf);
  29. result.RemoveLast();
  30. oldJpf.Index--;
  31. for (Int32 k = 0; k < instructions.Count; k++)
  32. {
  33. if (instructions[k] is IJumpToInstruction jmp && jmp.Index >= currentIndex && jmp != oldJpf)
  34. jmp.Index--;
  35. }
  36. }
  37. return result;
  38. }
  39. }
  40. }
  41. }