* ExternMethodRef.cs: Accept and add calling conventions. Add
[mono.git] / mcs / ilasm / codegen / ExternTable.cs
1 //
2 // Mono.ILASM.ExternTable.cs
3 //
4 // Author(s):
5 //  Jackson Harper (Jackson@LatitudeGeo.com)
6 //
7 // (C) 2003 Jackson Harper, All rights reserved
8 //
9
10 using System;
11 using System.Collections;
12 using System.Reflection;
13
14 namespace Mono.ILASM {
15
16         public class ExternTable {
17
18                 protected class ExternAssembly {
19
20                         public PEAPI.AssemblyRef AssemblyRef;
21
22                         protected PEAPI.PEFile pefile;
23                         protected Hashtable type_table;
24
25                         public ExternAssembly (PEAPI.PEFile pefile, string name,
26                                 AssemblyName asmb_name)
27                         {
28                                 type_table = new Hashtable ();
29                                 this.pefile = pefile;
30                                 AssemblyRef = pefile.AddExternAssembly (name);
31                         }
32
33                         public PEAPI.ClassRef GetType (string name_space, string name)
34                         {
35                                 string full_name = String.Format ("{0}.{1}",
36                                         name_space, name);
37                                 PEAPI.ClassRef klass = type_table[full_name] as PEAPI.ClassRef;
38
39                                 if (klass != null)
40                                         return klass;
41
42                                 klass = (PEAPI.ClassRef) AssemblyRef.AddClass (name_space, name);
43                                 type_table[full_name] = klass;
44
45                                 return klass;
46                         }
47
48                         public PEAPI.ClassRef GetValueType (string name_space, string name)
49                         {
50                                 string full_name = String.Format ("{0}.{1}",
51                                         name_space, name);
52                                 PEAPI.ClassRef klass = type_table[full_name] as PEAPI.ClassRef;
53
54                                 if (klass != null)
55                                         return klass;
56
57                                 klass = (PEAPI.ClassRef) AssemblyRef.AddValueClass (name_space, name);
58                                 type_table[full_name] = klass;
59
60                                 return klass;
61                         }
62                 }
63
64                 PEAPI.PEFile pefile;
65                 Hashtable assembly_table;
66
67                 public ExternTable (PEAPI.PEFile pefile)
68                 {
69                         this.pefile = pefile;
70
71                         // Add mscorlib
72                         string mscorlib_name = "mscorlib";
73                         AssemblyName mscorlib = new AssemblyName ();
74                         mscorlib.Name = mscorlib_name;
75                         AddAssembly (mscorlib_name, mscorlib);
76
77                         // Also need to alias corlib, normally corlib and
78                         // mscorlib are used interchangably
79                         assembly_table["corlib"] = assembly_table["mscorlib"];
80                 }
81
82                 public void AddAssembly (string name, AssemblyName asmb_name)
83                 {
84                         if (assembly_table == null) {
85                                 assembly_table = new Hashtable ();
86                         } else if (assembly_table.Contains (name)) {
87                                 // Maybe this is an error??
88                                 return;
89                         }
90
91                         assembly_table[name] = new ExternAssembly (pefile, name, asmb_name);
92                 }
93
94                 public PEAPI.ClassRef GetClass (string asmb_name, string name_space, string name)
95                 {
96                         ExternAssembly ext_asmb;
97                         ext_asmb = assembly_table[asmb_name] as ExternAssembly;
98
99                         if (ext_asmb == null)
100                                 throw new Exception (String.Format ("Assembly {0} not defined.", asmb_name));
101
102                         return ext_asmb.GetType (name_space, name);
103                 }
104
105                 public PEAPI.ClassRef GetClass (string asmb_name, string full_name)
106                 {
107                         ExternAssembly ext_asmb;
108                         ext_asmb = assembly_table[asmb_name] as ExternAssembly;
109
110                         if (ext_asmb == null)
111                                 throw new Exception (String.Format ("Assembly {0} not defined.", asmb_name));
112
113                         string name_space, name;
114
115                         GetNameAndNamespace (full_name, out name_space, out name);
116
117                         return ext_asmb.GetType (name_space, name);
118                 }
119
120                  public PEAPI.ClassRef GetValueClass (string asmb_name, string full_name)
121                 {
122                         ExternAssembly ext_asmb;
123                         ext_asmb = assembly_table[asmb_name] as ExternAssembly;
124
125                         if (ext_asmb == null)
126                                 throw new Exception (String.Format ("Assembly {0} not defined.", asmb_name));
127
128                         string name_space, name;
129
130                         GetNameAndNamespace (full_name, out name_space, out name);
131
132                         return ext_asmb.GetValueType (name_space, name);
133                 }
134
135                 public static void GetNameAndNamespace (string full_name,
136                         out string name_space, out string name) {
137
138                         int last_dot = full_name.LastIndexOf ('.');
139
140                         if (last_dot < 0) {
141                                 name_space = String.Empty;
142                                 name = full_name;
143                                 return;
144                         }
145
146                         name_space = full_name.Substring (0, last_dot);
147                         name = full_name.Substring (last_dot + 1);
148                 }
149
150         }
151 }
152