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;
16 using System.Globalization;
18 namespace Mono.CSharp {
20 public interface ParameterData {
21 Type ParameterType (int pos);
23 string ParameterName (int pos);
24 string ParameterDesc (int pos);
25 Parameter.Modifier ParameterModifier (int pos);
28 public class ReflectionParameters : ParameterData {
30 bool last_arg_is_params = false;
32 public ReflectionParameters (ParameterInfo [] pi)
37 int count = pi.Length-1;
40 attrs = pi [count].GetCustomAttributes (TypeManager.param_array_type, true);
45 if (attrs.Length == 0)
48 last_arg_is_params = true;
52 public Type ParameterType (int pos)
54 if (last_arg_is_params && pos >= pi.Length - 1)
55 return pi [pi.Length - 1].ParameterType;
57 Type t = pi [pos].ParameterType;
63 public string ParameterName (int pos)
65 if (last_arg_is_params && pos >= pi.Length - 1)
66 return pi [pi.Length - 1].Name;
71 public string ParameterDesc (int pos)
73 StringBuilder sb = new StringBuilder ();
78 Type partype = ParameterType (pos);
80 partype = partype.GetElementType ();
87 if (pos >= pi.Length - 1 && last_arg_is_params)
88 sb.Append ("params ");
90 sb.Append (TypeManager.CSharpName (partype));
92 return sb.ToString ();
96 public Parameter.Modifier ParameterModifier (int pos)
101 if (last_arg_is_params)
102 return Parameter.Modifier.PARAMS;
104 Type t = pi [pos].ParameterType;
106 if ((pi [pos].Attributes & ParameterAttributes.Out) != 0)
107 return Parameter.Modifier.ISBYREF | Parameter.Modifier.OUT;
109 return Parameter.Modifier.ISBYREF | Parameter.Modifier.REF;
112 return Parameter.Modifier.NONE;
123 public class InternalParameters : ParameterData {
126 public readonly Parameters Parameters;
128 public InternalParameters (Type [] param_types, Parameters parameters)
130 this.param_types = param_types;
131 this.Parameters = parameters;
134 public InternalParameters (DeclSpace ds, Parameters parameters)
135 : this (parameters.GetParameterInfo (ds), parameters)
141 if (param_types == null)
144 return param_types.Length;
148 Parameter GetParameter (int pos)
150 Parameter [] fixed_pars = Parameters.FixedParameters;
151 if (fixed_pars != null){
152 int len = fixed_pars.Length;
154 return Parameters.FixedParameters [pos];
157 return Parameters.ArrayParameter;
160 public Type ParameterType (int pos)
162 if (param_types == null)
165 return GetParameter (pos).ExternalType ();
169 public string ParameterName (int pos)
171 return GetParameter (pos).Name;
174 public string ParameterDesc (int pos)
176 string tmp = String.Empty;
177 Parameter p = GetParameter (pos);
180 // We need to and for REF/OUT, because if either is set the
181 // extra flag ISBYREF will be set as well
183 if ((p.ModFlags & Parameter.Modifier.REF) != 0)
185 else if ((p.ModFlags & Parameter.Modifier.OUT) != 0)
187 else if (p.ModFlags == Parameter.Modifier.PARAMS)
190 Type t = ParameterType (pos);
192 return tmp + TypeManager.CSharpName (t);
195 public Parameter.Modifier ParameterModifier (int pos)
197 Parameter.Modifier mod = GetParameter (pos).ModFlags;
199 if ((mod & (Parameter.Modifier.REF | Parameter.Modifier.OUT)) != 0)
200 mod |= Parameter.Modifier.ISBYREF;
207 class PtrHashtable : Hashtable {
208 class PtrComparer : IComparer {
209 public int Compare (object x, object y)
218 public PtrHashtable ()
220 comparer = new PtrComparer ();
225 // Compares member infos based on their name and
226 // also allows one argument to be a string
228 class MemberInfoCompare : IComparer {
230 public int Compare (object a, object b)
232 if (a == null || b == null){
233 Console.WriteLine ("Invalid information passed");
234 throw new Exception ();
238 return String.Compare ((string) a, ((MemberInfo)b).Name);
241 return String.Compare (((MemberInfo)a).Name, (string) b);
243 return String.Compare (((MemberInfo)a).Name, ((MemberInfo)b).Name);
249 public object Second;
251 public Pair (object f, object s)