diff options
Diffstat (limited to 'mcs/ilasm/codegen/GenericParamRef.cs')
-rw-r--r-- | mcs/ilasm/codegen/GenericParamRef.cs | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/mcs/ilasm/codegen/GenericParamRef.cs b/mcs/ilasm/codegen/GenericParamRef.cs new file mode 100644 index 00000000000..cbebce70a04 --- /dev/null +++ b/mcs/ilasm/codegen/GenericParamRef.cs @@ -0,0 +1,116 @@ +// +// Mono.ILASM.GenericParamRef +// +// Author(s): +// Jackson Harper (Jackson@LatitudeGeo.com) +// Ankit Jain (JAnkit@novell.com) +// +// (C) 2003 Jackson Harper, All rights reserved +// (C) 2006 Novell, Inc (http://www.novell.com) +// + + +using System; +using System.Collections; + +namespace Mono.ILASM { + + public class GenericParamRef : BaseGenericTypeRef { + + /* PEAPI.Type type: Might get modified */ + /* Unmodified GenParam */ + private PEAPI.GenParam param; + private bool is_added; /* Added to TypeSpec table ? */ + private static Hashtable param_table = new Hashtable (); + + public GenericParamRef (PEAPI.GenParam gen_param, string full_name) + : this (gen_param, full_name, null) + { + } + + public GenericParamRef (PEAPI.GenParam gen_param, string full_name, ArrayList conv_list) + : base (full_name, false, conv_list, "") + { + this.type = gen_param; + this.param = gen_param; + is_added = false; + } + + public override string FullName { + get { + return (param.Type == PEAPI.GenParamType.Var ? "!" : "!!") + + param.Index + sig_mod; + } + } + + public override void MakeValueClass () + { + throw new InternalErrorException ("Not supported"); + } + + public override BaseClassRef Clone () + { + return new GenericParamRef (param, full_name, (ArrayList) ConversionList.Clone ()); + } + + public override void ResolveNoTypeSpec (CodeGen code_gen) + { + if (is_resolved) + return; + + type = Modify (code_gen, type); + is_resolved = true; + } + + public override void Resolve (CodeGen code_gen) + { + ResolveNoTypeSpec (code_gen); + if (is_added) + return; + + string key = param.Type.ToString () + param.Index.ToString (); + PEAPI.GenParam val = (PEAPI.GenParam) param_table [key]; + if (val == null) { + code_gen.PEFile.AddGenericParam (param); + param_table [key] = param; + } else { + /* Set this instance's "type" to the cached + PEAPI.GenParam, after applying modifications */ + type = Modify (code_gen, val); + } + + is_added = true; + } + + public override void Resolve (GenericParameters type_gen_params, GenericParameters method_gen_params) + { + if (param.Name == "") { + /* Name wasn't specified */ + return; + } + + if (param.Type == PEAPI.GenParamType.MVar && method_gen_params != null) + param.Index = method_gen_params.GetGenericParamNum (param.Name); + else if (type_gen_params != null) + param.Index = type_gen_params.GetGenericParamNum (param.Name); + + if (param.Index < 0) + Report.Error (String.Format ("Invalid {0}type parameter '{1}'", + (param.Type == PEAPI.GenParamType.MVar ? "method " : ""), + param.Name)); + } + + protected override BaseMethodRef CreateMethodRef (BaseTypeRef ret_type, PEAPI.CallConv call_conv, + string name, BaseTypeRef[] param, int gen_param_count) + { + return new TypeSpecMethodRef (this, call_conv, ret_type, name, param, gen_param_count); + } + + protected override IFieldRef CreateFieldRef (BaseTypeRef ret_type, string name) + { + return new TypeSpecFieldRef (this, ret_type, name); + } + } + +} + |