*** empty log message ***
[mono.git] / mcs / class / Microsoft.JScript / Microsoft.JScript / CodeGenerator.cs
1 //
2 // CodeGenerator.cs
3 //
4 // Author:
5 //      Cesar Lopez Nataren (cesar@ciencias.unam.mx)
6 //
7 // (C) 2003, Cesar Lopez Nataren
8 //
9
10 using System;
11 using System.Reflection;
12 using System.Reflection.Emit;
13 using System.Threading;
14
15 namespace Microsoft.JScript {
16
17         internal class EmitContext {
18
19                 internal TypeBuilder type_builder;
20                 internal ILGenerator ig;
21
22                 internal EmitContext (TypeBuilder type)
23                 {
24                         type_builder = type;
25                 }
26         }
27
28         public class CodeGenerator {
29
30                 private static string MODULE = "JScript Module";
31
32                 internal static string mod_name;
33                 internal static AppDomain app_domain;
34                 internal static AssemblyName assembly_name;
35                 internal static AssemblyBuilder assembly_builder;
36                 internal static ModuleBuilder module_builder;
37
38                 internal static void Init (string file_name)
39                 {
40                         app_domain = Thread.GetDomain ();
41
42                         assembly_name = new AssemblyName ();
43                         assembly_name.Name =  trim_extension (file_name);
44
45                         mod_name = MODULE;
46
47                         assembly_builder = app_domain.DefineDynamicAssembly (
48                                              assembly_name,
49                                              AssemblyBuilderAccess.RunAndSave);
50
51                         module_builder = assembly_builder.DefineDynamicModule (
52                                                 mod_name,
53                                                 assembly_name.Name + ".exe", 
54                                                 false);
55                 }
56
57                 internal static string trim_extension (string file_name)
58                 {
59                         int index = file_name.IndexOf ('.');
60
61                         if (index < 0)
62                                 return file_name;
63                         else
64                                 return file_name.Substring (0, index);
65                 }
66
67                 internal static void Save (string target_name)
68                 {
69                         assembly_builder.Save (target_name);
70                 }
71
72                 internal static void Emit (AST prog)
73                 {
74                         if (prog == null)
75                                 return;
76
77                         TypeBuilder type_builder;
78                         type_builder = module_builder.DefineType ("JScript 0");
79                         EmitContext ec = new EmitContext (type_builder);
80
81                         prog.Emit (ec);
82
83                         ec.type_builder.CreateType ();
84                 }
85
86                 public static void Run (string file_name, AST prog)
87                 {
88                         CodeGenerator.Init (file_name);
89                         CodeGenerator.Emit (prog);
90
91                         CodeGenerator.Save (trim_extension (file_name) + 
92                                             ".exe");
93                 }       
94         }
95 }