// (C) 2001 Ximian, Inc (http://www.ximian.com)
//
-using System.Reflection.Emit;
-using System.Reflection;
using System;
using System.Text;
+using System.Reflection;
+using System.Collections;
+using System.Reflection.Emit;
+using System.Globalization;
-namespace CIR {
+namespace Mono.CSharp {
public interface ParameterData {
Type ParameterType (int pos);
int Count { get; }
+ string ParameterName (int pos);
string ParameterDesc (int pos);
Parameter.Modifier ParameterModifier (int pos);
}
public class ReflectionParameters : ParameterData {
ParameterInfo [] pi;
-
+ bool last_arg_is_params = false;
+
public ReflectionParameters (ParameterInfo [] pi)
{
+ object [] attrs;
+
this.pi = pi;
+
+ int count = pi.Length-1;
+
+ if (count >= 0) {
+ attrs = pi [count].GetCustomAttributes (TypeManager.param_array_type, true);
+
+ if (attrs == null)
+ return;
+
+ if (attrs.Length == 0)
+ return;
+
+ last_arg_is_params = true;
+ }
}
public Type ParameterType (int pos)
{
- return pi [pos].ParameterType;
+ if (last_arg_is_params && pos >= pi.Length - 1)
+ return pi [pi.Length - 1].ParameterType;
+ else
+ return pi [pos].ParameterType;
+ }
+
+ public string ParameterName (int pos)
+ {
+ if (last_arg_is_params && pos >= pi.Length - 1)
+ return pi [pi.Length - 1].Name;
+ else
+ return pi [pos].Name;
}
public string ParameterDesc (int pos)
if (pi [pos].IsIn)
sb.Append ("in ");
+ if (pos >= pi.Length - 1 && last_arg_is_params)
+ sb.Append ("params ");
+
sb.Append (TypeManager.CSharpName (ParameterType (pos)));
return sb.ToString ();
public Parameter.Modifier ParameterModifier (int pos)
{
- if (pi [pos].IsOut)
- return Parameter.Modifier.OUT;
-
+ int len = pi.Length;
+
+ if (pos >= len - 1)
+ if (last_arg_is_params)
+ return Parameter.Modifier.PARAMS;
+
+ Type t = pi [pos].ParameterType;
+ if (t.IsByRef)
+ return Parameter.Modifier.ISBYREF;
+
return Parameter.Modifier.NONE;
}
public class InternalParameters : ParameterData {
Type [] param_types;
- Parameters parameters;
+ public readonly Parameters Parameters;
- public InternalParameters (TypeContainer tc, Parameters parameters)
+ public InternalParameters (Type [] param_types, Parameters parameters)
+ {
+ this.param_types = param_types;
+ this.Parameters = parameters;
+ }
+
+ public InternalParameters (DeclSpace ds, Parameters parameters)
+ : this (parameters.GetParameterInfo (ds), parameters)
{
- this.param_types = parameters.GetParameterInfo (tc);
- this.parameters = parameters;
}
public int Count {
if (param_types == null)
return null;
+ Parameter [] fixed_pars = Parameters.FixedParameters;
+ if (fixed_pars != null){
+ int len = fixed_pars.Length;
+ if (pos < len)
+ return Parameters.FixedParameters [pos].ParameterType;
+ else
+ return Parameters.ArrayParameter.ParameterType;
+ } else
+ return Parameters.ArrayParameter.ParameterType;
+ }
+
+ public string ParameterName (int pos)
+ {
Parameter p;
-
- if (pos == parameters.FixedParameters.Length)
- p = parameters.ArrayParameter;
+
+ if (pos >= Parameters.FixedParameters.Length)
+ p = Parameters.ArrayParameter;
else
- p = parameters.FixedParameters [pos];
+ p = Parameters.FixedParameters [pos];
- Type t = param_types [pos];
- string name = t.FullName;
-
- if (p.ModFlags == Parameter.Modifier.REF ||
- p.ModFlags == Parameter.Modifier.OUT)
- t = Type.GetType (name.Substring (0, name.Length - 1));
-
- return t;
+ return p.Name;
}
public string ParameterDesc (int pos)
{
- string tmp = null;
+ string tmp = String.Empty;
Parameter p;
- if (pos == parameters.FixedParameters.Length)
- p = parameters.ArrayParameter;
+ if (pos >= Parameters.FixedParameters.Length)
+ p = Parameters.ArrayParameter;
else
- p = parameters.FixedParameters [pos];
+ p = Parameters.FixedParameters [pos];
if (p.ModFlags == Parameter.Modifier.REF)
tmp = "ref ";
public Parameter.Modifier ParameterModifier (int pos)
{
- if (pos == parameters.FixedParameters.Length)
- return parameters.ArrayParameter.ModFlags;
+ Parameter.Modifier mod;
+
+ if (Parameters.FixedParameters == null) {
+ if (Parameters.ArrayParameter != null)
+ mod = Parameters.ArrayParameter.ModFlags;
+ else
+ mod = Parameter.Modifier.NONE;
+ } else if (pos >= Parameters.FixedParameters.Length)
+ mod = Parameters.ArrayParameter.ModFlags;
else
- return parameters.FixedParameters [pos].ModFlags;
+ mod = Parameters.FixedParameters [pos].ModFlags;
+
+ if ((mod & (Parameter.Modifier.REF | Parameter.Modifier.OUT)) != 0)
+ mod |= Parameter.Modifier.ISBYREF;
+
+ return mod;
+ }
+
+ }
+
+ class PtrHashtable : Hashtable {
+ class PtrComparer : IComparer {
+ public int Compare (object x, object y)
+ {
+ if (x == y)
+ return 0;
+ else
+ return 1;
+ }
+ }
+
+ public PtrHashtable ()
+ {
+ comparer = new PtrComparer ();
+ }
+ }
+
+ //
+ // Compares member infos based on their name and
+ // also allows one argument to be a string
+ //
+ class MemberInfoCompare : IComparer {
+
+ public int Compare (object a, object b)
+ {
+ if (a == null || b == null){
+ Console.WriteLine ("Invalid information passed");
+ throw new Exception ();
+ }
+
+ if (a is string)
+ return String.Compare ((string) a, ((MemberInfo)b).Name);
+
+ if (b is string)
+ return String.Compare (((MemberInfo)a).Name, (string) b);
+
+ return String.Compare (((MemberInfo)a).Name, ((MemberInfo)b).Name);
}
+ }
+
+ struct Pair {
+ public object First;
+ public object Second;
+ public Pair (object f, object s)
+ {
+ First = f;
+ Second = s;
+ }
}
}