2 // Mono.ILASM.PrimitiveTypeRef
5 // Jackson Harper (Jackson@LatitudeGeo.com)
7 // (C) 2003 Jackson Harper, All rights reserved
12 using System.Collections;
14 namespace Mono.ILASM {
17 /// Reference to a primitive type, ie string, object, char
19 public class PrimitiveTypeRef : BaseTypeRef {
21 private static Hashtable s_method_table = new Hashtable ();
23 public PrimitiveTypeRef (PEAPI.PrimitiveType type, string full_name)
24 : this (type, full_name, null, String.Empty)
28 public PrimitiveTypeRef (PEAPI.PrimitiveType type, string full_name, ArrayList conv_list, string sig_mod)
29 : base (full_name, conv_list, sig_mod)
33 SigMod = String.Empty;
36 public override BaseTypeRef Clone ()
38 return new PrimitiveTypeRef ((PEAPI.PrimitiveType) type, full_name,
39 (ArrayList) ConversionList.Clone (), sig_mod);
43 get { return full_name; }
46 public override void Resolve (CodeGen code_gen)
51 // Perform all of the types modifications
52 type = Modify (code_gen, type);
58 /// Primitive types can be created like this System.String instead
59 /// of like a normal type that would be [mscorlib]System.String This
60 /// method returns a proper primitive type if the supplied name is
61 /// the name of a primitive type.
63 public static PrimitiveTypeRef GetPrimitiveType (string full_name)
67 return new PrimitiveTypeRef (PEAPI.PrimitiveType.String, full_name);
69 return new PrimitiveTypeRef (PEAPI.PrimitiveType.Object, full_name);
75 protected override BaseMethodRef CreateMethodRef (BaseTypeRef ret_type,
76 PEAPI.CallConv call_conv, string name, BaseTypeRef[] param, int gen_param_count)
78 throw new InternalErrorException ("Should not be called");
81 public override BaseMethodRef GetMethodRef (BaseTypeRef ret_type, PEAPI.CallConv call_conv,
82 string name, BaseTypeRef[] param, int gen_param_count)
84 /* Use FullName also here, as we are caching in a static hashtable */
85 string key = FullName + MethodDef.CreateSignature (ret_type, call_conv, name, param, gen_param_count, true);
86 TypeSpecMethodRef mr = s_method_table [key] as TypeSpecMethodRef;
90 //FIXME: generic methodref for primitive type?
91 mr = new TypeSpecMethodRef (this, call_conv, ret_type, name, param, gen_param_count);
92 s_method_table [key] = mr;
96 protected override IFieldRef CreateFieldRef (BaseTypeRef ret_type, string name)
98 Report.Error ("PrimitiveType's can't have fields!");
102 public BaseClassRef AsClassRef (CodeGen code_gen)
105 PEAPI.ClassRef class_ref = code_gen.ExternTable.GetValueClass ("corlib", FullName);
106 ExternTypeRef type_ref = new ExternTypeRef (class_ref, FullName);
108 // TODO: Need to do the rest of the conversion (in order)
110 type_ref.MakeArray ();
114 throw new NotImplementedException ("This method is getting depricated.");