2003-10-28 cesar lopez nataren <cesar@ciencias.unam.mx>
[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
21                 internal EmitContext (TypeBuilder type)
22                 {
23                         type_builder = type;
24                 }
25         }
26
27         public class CodeGenerator {
28
29                 private static string MODULE = "JScript Module";
30
31                 internal static string mod_name;
32                 internal static AppDomain app_domain;
33                 internal static AssemblyName assembly_name;
34                 internal static AssemblyBuilder assembly_builder;
35                 internal static ModuleBuilder module_builder;
36
37                 internal static void Init (string file_name)
38                 {
39                         app_domain = Thread.GetDomain ();
40
41                         assembly_name = new AssemblyName ();
42                         assembly_name.Name =  trim_extension (file_name);
43
44                         mod_name = MODULE;
45
46                         assembly_builder = app_domain.DefineDynamicAssembly (
47                                              assembly_name,
48                                              AssemblyBuilderAccess.RunAndSave);
49
50                         module_builder = assembly_builder.DefineDynamicModule (
51                                                 mod_name,
52                                                 assembly_name.Name + ".exe", 
53                                                 false);
54                 }
55
56                 internal static string trim_extension (string file_name)
57                 {
58                         int index = file_name.IndexOf ('.');
59
60                         if (index < 0)
61                                 return file_name;
62                         else
63                                 return file_name.Substring (0, index);
64                 }
65
66                 internal static void Save (string target_name)
67                 {
68                         assembly_builder.Save (target_name);
69                 }
70
71                 internal static void Emit (AST prog)
72                 {
73                         if (prog == null)
74                                 return;
75
76                         TypeBuilder type_builder;
77                         type_builder = module_builder.DefineType ("JScript 0");
78                         EmitContext ec = new EmitContext (type_builder);
79
80                         prog.Emit (ec);
81
82                         ec.type_builder.CreateType ();
83                 }
84
85                 public static void Run (string file_name, AST prog)
86                 {
87                         CodeGenerator.Init (file_name);
88                         CodeGenerator.Emit (prog);
89
90                         CodeGenerator.Save (trim_extension (file_name) + 
91                                             ".exe");
92                 }       
93         }
94 }