using System;
+using System.Collections;
namespace Mono.ILASM {
/// <summary>
/// Reference to a primitive type, ie string, object, char
/// </summary>
- public class PrimitiveTypeRef : PeapiTypeRef, ITypeRef {
+ public class PrimitiveTypeRef : BaseTypeRef {
- public PrimitiveTypeRef (PEAPI.PrimitiveType prim_type,
- string full_name) : base (prim_type, full_name)
+ private static Hashtable s_method_table = new Hashtable ();
+
+ public PrimitiveTypeRef (PEAPI.PrimitiveType type, string full_name)
+ : base (full_name)
+ {
+ this.type = type;
+ SigMod = String.Empty;
+ }
+
+ public string Name {
+ get { return full_name; }
+ }
+
+ public override void Resolve (CodeGen code_gen)
{
+ if (is_resolved)
+ return;
+ // Perform all of the types modifications
+ type = Modify (code_gen, type);
+
+ is_resolved = true;
}
/// <summary>
}
}
- public IMethodRef GetMethodRef (ITypeRef ret_type, PEAPI.CallConv call_conv,
- string name, ITypeRef[] param)
+ protected override BaseMethodRef CreateMethodRef (BaseTypeRef ret_type,
+ PEAPI.CallConv call_conv, string name, BaseTypeRef[] param, int gen_param_count)
{
- return new TypeSpecMethodRef (this, ret_type, call_conv, name, param);
+ throw new InternalErrorException ("Should not be called");
+ }
+
+ public override BaseMethodRef GetMethodRef (BaseTypeRef ret_type, PEAPI.CallConv call_conv,
+ string name, BaseTypeRef[] param, int gen_param_count)
+ {
+ /* Use FullName also here, as we are caching in a static hashtable */
+ string key = FullName + MethodDef.CreateSignature (ret_type, name, param, gen_param_count);
+ TypeSpecMethodRef mr = s_method_table [key] as TypeSpecMethodRef;
+ if (mr != null)
+ return mr;
+
+ //FIXME: generic methodref for primitive type?
+ mr = new TypeSpecMethodRef (this, call_conv, ret_type, name, param, gen_param_count);
+ s_method_table [key] = mr;
+ return mr;
}
- public IFieldRef GetFieldRef (ITypeRef ret_type, string name)
+ protected override IFieldRef CreateFieldRef (BaseTypeRef ret_type, string name)
{
- return new TypeSpecFieldRef (this, ret_type, name);
+ Report.Error ("PrimitiveType's can't have fields!");
+ return null;
}
- public IClassRef AsClassRef (CodeGen code_gen)
+ public BaseClassRef AsClassRef (CodeGen code_gen)
{
+ /*
PEAPI.ClassRef class_ref = code_gen.ExternTable.GetValueClass ("corlib", FullName);
ExternTypeRef type_ref = new ExternTypeRef (class_ref, FullName);
type_ref.MakeArray ();
return type_ref;
+ */
+ throw new NotImplementedException ("This method is getting depricated.");
}
}