Program.cs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // See https://aka.ms/new-console-template for more information
  2. using System.Reflection;
  3. using System.Runtime.CompilerServices;
  4. using JitInspect;
  5. using Lua;
  6. using Lua.Runtime;
  7. using Lua.Standard;
  8. // dotnet run --configuration Release /p:DefineConstants="CASE_MARKER"
  9. // to activate the CASE_MARKER
  10. // JitInspect can be run in Windows and Linux (MacOS is not supported yet)
  11. var luaState = LuaState.Create();
  12. luaState.OpenStandardLibraries();
  13. {
  14. await luaState.DoFileAsync((GetAbsolutePath("db.lua")));
  15. await luaState.DoFileAsync((GetAbsolutePath("events.lua")));
  16. }
  17. var closure = luaState.Load(File.ReadAllBytes(GetAbsolutePath("test.lua")),"test.lua");
  18. for (int i = 0; i < 1000; i++)
  19. {
  20. await luaState.TopLevelAccess.RunAsync(closure);
  21. luaState.MainThread.Stack.Clear();
  22. }
  23. var savePath = GetAbsolutePath("history");
  24. var thisDir = GetThisDirectoryName();
  25. var newJIitPath = Path.Join(thisDir, $"jit_{DateTime.Now:yyyy-MM-dd-HH-mm-ss}.txt");
  26. var lastJitPaths = Directory.GetFiles(thisDir).Where(x=>x.Contains("jit_"));
  27. if (!Directory.Exists(savePath))
  28. {
  29. Directory.CreateDirectory(savePath);
  30. }
  31. if (lastJitPaths.Any())
  32. {
  33. Console.WriteLine("Last:" + File.ReadAllLines(lastJitPaths.First())[^1]);
  34. foreach (var jitPath in lastJitPaths)
  35. {
  36. var last = jitPath;
  37. var dest = Path.Join(savePath, Path.GetFileName(jitPath));
  38. File.Move(last, dest);
  39. }
  40. }
  41. var method = typeof(LuaVirtualMachine).GetMethod("MoveNext", BindingFlags.Static | BindingFlags.NonPublic)!;
  42. using var disassembler = JitDisassembler.Create();
  43. var nextJitText = disassembler.Disassemble(method);
  44. File.WriteAllText(newJIitPath, nextJitText);
  45. Console.WriteLine("New:" + nextJitText.Split("\n")[^1]);
  46. static string GetThisDirectoryName([CallerFilePath] string callerFilePath = "")
  47. {
  48. return Path.GetDirectoryName(callerFilePath)!;
  49. }
  50. static string GetAbsolutePath(string relativePath, [CallerFilePath] string callerFilePath = "")
  51. {
  52. return Path.Join(Path.GetDirectoryName(callerFilePath)!, relativePath);
  53. }