Program.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. using Lua.CodeAnalysis.Syntax;
  2. using Lua.CodeAnalysis.Compilation;
  3. using Lua.Runtime;
  4. using Lua;
  5. using Lua.Standard;
  6. using System.Reflection;
  7. var state = LuaState.Create();
  8. state.OpenStandardLibraries();
  9. state.Environment["wait"] = LuaFunction.Create(async (@args, ct) =>
  10. {
  11. await Task.Delay(TimeSpan.FromSeconds(args[0].Read<double>()), ct);
  12. return default!;
  13. });
  14. state.Environment["dumpframe"] = LuaFunction.Create((@args, ct) =>
  15. {
  16. var thread = state.CurrentThread;
  17. Console.WriteLine(thread.GetCallStackFrames()[^2]);
  18. return default;
  19. });
  20. state.Environment["dumpstack"] = LuaFunction.Create((@args, ct) =>
  21. {
  22. var thread = state.CurrentThread;
  23. thread.GetType().GetMethod("DumpStackValues", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)!.Invoke(thread, null);
  24. return default;
  25. });
  26. try
  27. {
  28. var source = File.ReadAllText("test.lua");
  29. var syntaxTree = LuaSyntaxTree.Parse(source, "test.lua");
  30. Console.WriteLine("Source Code " + new string('-', 50));
  31. var debugger = new DisplayStringSyntaxVisitor();
  32. Console.WriteLine(debugger.GetDisplayString(syntaxTree));
  33. var chunk = LuaCompiler.Default.Compile(syntaxTree, "test.lua");
  34. DebugChunk(chunk, 0);
  35. Console.WriteLine("Output " + new string('-', 50));
  36. var results = new LuaValue[64];
  37. var resultCount = await state.RunAsync(chunk, results);
  38. Console.WriteLine("Result " + new string('-', 50));
  39. for (int i = 0; i < resultCount; i++)
  40. {
  41. Console.WriteLine(results[i]);
  42. }
  43. Console.WriteLine("End " + new string('-', 50));
  44. }
  45. catch (Exception ex)
  46. {
  47. Console.WriteLine(ex);
  48. }
  49. static void DebugChunk(Chunk chunk, int id)
  50. {
  51. Console.WriteLine($"Chunk[{id}]" + new string('=', 50));
  52. Console.WriteLine($"Parameters:{chunk.ParameterCount}");
  53. Console.WriteLine("Instructions " + new string('-', 50));
  54. var index = 0;
  55. foreach (var inst in chunk.Instructions.ToArray())
  56. {
  57. Console.WriteLine($"[{index}]\t{chunk.SourcePositions[index]}\t\t{inst}");
  58. index++;
  59. }
  60. Console.WriteLine("Constants " + new string('-', 50)); index = 0;
  61. foreach (var constant in chunk.Constants.ToArray())
  62. {
  63. Console.WriteLine($"[{index}]\t{constant}");
  64. index++;
  65. }
  66. Console.WriteLine("UpValues " + new string('-', 50)); index = 0;
  67. foreach (var upValue in chunk.UpValues.ToArray())
  68. {
  69. Console.WriteLine($"[{index}]\t{upValue.Name}\t{(upValue.IsInRegister ? 1 : 0)}\t{upValue.Index}");
  70. index++;
  71. }
  72. Console.WriteLine();
  73. var nestedChunkId = 0;
  74. foreach (var localChunk in chunk.Functions)
  75. {
  76. DebugChunk(localChunk, nestedChunkId);
  77. nestedChunkId++;
  78. }
  79. }