2 // Mono.ILASM.GenericTypeInst
5 // Jackson Harper (Jackson@LatitudeGeo.com)
6 // Ankit Jain (JAnkit@novell.com)
8 // (C) 2003 Latitude Geographics Group, All rights reserved
9 // (C) 2005 Novell, Inc (http://www.novell.com)
14 using System.Collections;
16 namespace Mono.ILASM {
18 public class GenericTypeInst : ModifiableType, IGenericTypeRef {
20 private IClassRef class_ref;
21 private PEAPI.Type ptype;
22 private PEAPI.GenericTypeInst p_gen_inst;
23 private bool is_valuetypeinst;
24 private bool is_resolved;
25 private GenericArguments gen_args;
26 private string sig_mod;
27 private bool is_added; /* Added to PEFile (to TypeSpec table) ? */
28 private static Hashtable method_table = new Hashtable ();
30 public GenericTypeInst (IClassRef class_ref, GenericArguments gen_args, bool is_valuetypeinst)
31 : this (class_ref, gen_args, is_valuetypeinst, null, null)
35 public GenericTypeInst (IClassRef class_ref, GenericArguments gen_args, bool is_valuetypeinst,
36 string sig_mod, ArrayList conv_list)
38 if (class_ref is GenericTypeInst)
39 throw new ArgumentException (String.Format ("Cannot create nested GenericInst, '{0}' '{1}'", class_ref.FullName, gen_args.ToString ()));
41 this.class_ref = class_ref;
42 this.gen_args = gen_args;
43 this.is_valuetypeinst = is_valuetypeinst;
44 this.sig_mod = sig_mod;
46 if (conv_list != null)
47 ConversionList = conv_list;
52 public PEAPI.Type PeapiType {
56 public string FullName {
57 get { return class_ref.FullName + gen_args.ToString () + SigMod; }
60 public PEAPI.Class PeapiClass {
61 get { return (PEAPI.Class) ptype; }
64 public override string SigMod {
65 get { return sig_mod; }
66 set { sig_mod = value; }
69 public IClassRef Clone ()
71 //Clone'd instance shares the class_ref and gen_args,
72 //as its basically used to create modified types (arrays etc)
73 return new GenericTypeInst (class_ref, gen_args, is_valuetypeinst, sig_mod,
74 (ArrayList) ConversionList.Clone () );
77 public void MakeValueClass ()
79 class_ref.MakeValueClass ();
82 public GenericTypeInst GetGenericTypeInst (GenericArguments gen_args)
84 throw new Exception (String.Format ("Invalid attempt to create '{0}''{1}'", FullName, gen_args.ToString ()));
87 public PEAPI.Type ResolveInstance (CodeGen code_gen, GenericArguments gen_args)
89 throw new Exception (String.Format ("Invalid attempt to create '{0}''{1}'", FullName, gen_args.ToString ()));
92 public void ResolveNoTypeSpec (CodeGen code_gen)
97 class_ref.Resolve (code_gen);
98 p_gen_inst = (PEAPI.GenericTypeInst) class_ref.ResolveInstance (code_gen, gen_args);
100 ptype = Modify (code_gen, p_gen_inst);
105 public void Resolve (CodeGen code_gen)
107 ResolveNoTypeSpec (code_gen);
111 code_gen.PEFile.AddGenericClass ((PEAPI.GenericTypeInst) p_gen_inst);
115 public void Resolve (GenericParameters type_gen_params, GenericParameters method_gen_params)
117 throw new Exception ("Not implemented yet");
120 public IMethodRef GetMethodRef (ITypeRef ret_type, PEAPI.CallConv call_conv,
121 string meth_name, ITypeRef[] param, int gen_param_count)
123 string key = FullName + MethodDef.CreateSignature (ret_type, meth_name, param, gen_param_count);
124 TypeSpecMethodRef mr = method_table [key] as TypeSpecMethodRef;
126 mr = new TypeSpecMethodRef (this, ret_type, call_conv, meth_name, param, gen_param_count);
127 method_table [key] = mr;
133 public IFieldRef GetFieldRef (ITypeRef ret_type, string field_name)
135 return new TypeSpecFieldRef (this, ret_type, field_name);