2 // support.cs: Support routines to work around the fact that System.Reflection.Emit
3 // can not introspect types that are being constructed
6 // Miguel de Icaza (miguel@ximian.com)
8 // (C) 2001 Ximian, Inc (http://www.ximian.com)
13 using System.Reflection;
14 using System.Collections;
15 using System.Reflection.Emit;
17 namespace Mono.CSharp {
19 public interface ParameterData {
20 Type ParameterType (int pos);
22 string ParameterDesc (int pos);
23 Parameter.Modifier ParameterModifier (int pos);
26 public class ReflectionParameters : ParameterData {
28 bool last_arg_is_params;
30 public ReflectionParameters (ParameterInfo [] pi)
36 int count = pi.Length-1;
39 a = pi [count].GetCustomAttributes (TypeManager.param_array_type, false);
43 last_arg_is_params = true;
47 public Type ParameterType (int pos)
49 if (last_arg_is_params && pos >= pi.Length - 1)
50 return pi [pi.Length -1].ParameterType;
52 return pi [pos].ParameterType;
55 public string ParameterDesc (int pos)
57 StringBuilder sb = new StringBuilder ();
65 if (pos >= pi.Length - 1 && last_arg_is_params)
66 sb.Append ("params ");
68 sb.Append (TypeManager.CSharpName (ParameterType (pos)));
70 return sb.ToString ();
74 public Parameter.Modifier ParameterModifier (int pos)
76 if (pos >= pi.Length - 1)
77 if (last_arg_is_params)
78 return Parameter.Modifier.PARAMS;
80 Type t = pi [pos].ParameterType;
82 return Parameter.Modifier.OUT;
84 return Parameter.Modifier.NONE;
95 public class InternalParameters : ParameterData {
98 Parameters parameters;
100 public InternalParameters (Type [] param_types, Parameters parameters)
102 this.param_types = param_types;
103 this.parameters = parameters;
106 public InternalParameters (TypeContainer tc, Parameters parameters)
107 : this (parameters.GetParameterInfo (tc), parameters)
113 if (param_types == null)
116 return param_types.Length;
120 public Type ParameterType (int pos)
122 if (param_types == null)
125 int len = parameters.FixedParameters.Length;
128 return parameters.FixedParameters [pos].ParameterType;
130 return parameters.ArrayParameter.ParameterType;
133 // Return the internal type.
135 //return p.ParameterType;
138 public string ParameterDesc (int pos)
143 if (pos >= parameters.FixedParameters.Length)
144 p = parameters.ArrayParameter;
146 p = parameters.FixedParameters [pos];
148 if (p.ModFlags == Parameter.Modifier.REF)
150 else if (p.ModFlags == Parameter.Modifier.OUT)
152 else if (p.ModFlags == Parameter.Modifier.PARAMS)
155 Type t = ParameterType (pos);
157 return tmp + TypeManager.CSharpName (t);
160 public Parameter.Modifier ParameterModifier (int pos)
162 if (pos >= parameters.FixedParameters.Length)
163 return parameters.ArrayParameter.ModFlags;
165 Parameter.Modifier m = parameters.FixedParameters [pos].ModFlags;
168 // We use a return value of "OUT" for "reference" parameters.
169 // both out and ref flags in the source map to reference parameters.
171 if (m == Parameter.Modifier.OUT || m == Parameter.Modifier.REF)
172 return Parameter.Modifier.OUT;
174 return Parameter.Modifier.NONE;
180 class PtrHashtable : Hashtable {
181 class PtrComparer : IComparer {
182 public int Compare (object x, object y)
191 public PtrHashtable ()
193 comparer = new PtrComparer ();
198 // Compares member infos based on their name and
199 // also allows one argument to be a string
201 class MemberInfoCompare : IComparer {
203 public int Compare (object a, object b)
205 if (a == null || b == null){
206 Console.WriteLine ("Invalid information passed");
207 throw new Exception ();
211 return String.Compare ((string) a, ((MemberInfo)b).Name);
214 return String.Compare (((MemberInfo)a).Name, (string) b);
216 return String.Compare (((MemberInfo)a).Name, ((MemberInfo)b).Name);
222 public object Second;
224 public Pair (object f, object s)