PageRenderTime 47ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/IronBrainFuck/JIT/BrainMethod.cs

http://ironbrainfuck.codeplex.com
C# | 62 lines | 37 code | 5 blank | 20 comment | 0 complexity | 8c205a460c7385a060eadd58c7f58b27 MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Reflection;
  6. using System.Reflection.Emit;
  7. using System.Text;
  8. namespace ZackFlame.IronBrainFuck.JIT
  9. {
  10. /// <summary>
  11. /// Представляет скомпилированную в IL BrainFuck программу.
  12. /// </summary>
  13. public sealed class BrainMethod
  14. {
  15. private DynamicMethod compiledProgram;
  16. internal DynamicMethod CompiledProgram
  17. {
  18. get { return compiledProgram; }
  19. }
  20. /// <summary>
  21. /// Возвращает исходный код BrainFuck программы.
  22. /// </summary>
  23. public string SourceCode { get; private set; }
  24. /// <summary>
  25. /// Инициализирует новый экземпляр класса-обёртки BrainMethod для
  26. /// скомпилированной BrainFuck программы.
  27. /// </summary>
  28. /// <param name="sourceCode">Исходный код BrainFuck программы.</param>
  29. /// <param name="compiledProgram">Скомпилированная программа.</param>
  30. internal BrainMethod(string sourceCode, DynamicMethod compiledProgram)
  31. {
  32. SourceCode = sourceCode;
  33. this.compiledProgram = compiledProgram;
  34. }
  35. /// <summary>
  36. /// Выполняет скомпилированную программу.
  37. /// </summary>
  38. /// <param name="cells">Массив ячеек памяти BrainFuck машины.</param>
  39. /// <param name="cellIndex">Номер текущей ячейки BrainFuck машины.</param>
  40. /// <param name="input">Входной поток для считывания BrainFuck программаой.</param>
  41. /// <param name="output">Выходной поток для вывода BrainFuck программой.</param>
  42. /// <returns>Номер текущей ячейки BrainFuck машины после исполнения программы.</returns>
  43. public UInt16 Execute(UInt16[] cells, UInt16 cellIndex,
  44. TextReader input, TextWriter output)
  45. {
  46. try
  47. {
  48. return (UInt16)compiledProgram.Invoke(null,
  49. new object[] { cells, cellIndex, input, output });
  50. }
  51. catch (TargetInvocationException ex)
  52. {
  53. throw ex.InnerException;
  54. }
  55. }
  56. }
  57. }