CodeGen.cs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. // CodeGen.cs
  2. // (C) Sergey Chaban ([email protected])
  3. using System;
  4. using System.Collections;
  5. using System.Reflection;
  6. using System.Reflection.Emit;
  7. namespace Mono.ILASM {
  8. public class CodeGen {
  9. private string name;
  10. private AssemblyBuilder asmbld;
  11. private ModuleBuilder modbld;
  12. private Types refTypes = new Types (); // FIXME: postpone init
  13. private ArrayList classes;
  14. /// <summary>
  15. /// </summary>
  16. /// <param name="name"></param>
  17. public CodeGen (string name)
  18. {
  19. SetName (name);
  20. }
  21. /// <summary>
  22. /// </summary>
  23. public CodeGen ()
  24. {
  25. }
  26. /// <summary>
  27. /// </summary>
  28. /// <param name="name"></param>
  29. public void SetName (string name)
  30. {
  31. this.name = name;
  32. AppDomain appDomain = AppDomain.CurrentDomain;
  33. AssemblyName asmName = new AssemblyName();
  34. asmName.Name = name + "_asmname";
  35. asmbld = appDomain.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.RunAndSave);
  36. // FIXME: exe/lib
  37. modbld = asmbld.DefineDynamicModule(name, name + ".exe");
  38. }
  39. /// <summary>
  40. /// </summary>
  41. public ModuleBuilder ModBuilder {
  42. get {
  43. return modbld;
  44. }
  45. }
  46. /// <summary>
  47. /// </summary>
  48. public Types RefTypes {
  49. get {
  50. return refTypes;
  51. }
  52. }
  53. /// <summary>
  54. /// </summary>
  55. public int ClassCount {
  56. get {
  57. return (classes == null) ? 0 : classes.Count;
  58. }
  59. }
  60. /// <summary>
  61. /// </summary>
  62. /// <param name="clazz"></param>
  63. public void AddClass (Class clazz)
  64. {
  65. if (classes == null) classes = new ArrayList ();
  66. classes.Add (clazz);
  67. }
  68. /// <summary>
  69. /// </summary>
  70. public void Emit ()
  71. {
  72. if (ClassCount != 0) {
  73. foreach (Class c in classes) {
  74. c.Emit (this);
  75. }
  76. }
  77. asmbld.Save ("TestIL.exe");
  78. }
  79. }
  80. }