namespace Mono.CSharp {
- public interface GenericConstraints {
- bool HasConstructor { get; }
- bool HasClassConstraint { get; }
- Type ClassConstraint { get; }
- Type[] InterfaceConstraints { get; }
- }
-
public interface ParameterData {
Type ParameterType (int pos);
GenericConstraints GenericConstraints (int pos);
- bool HasArrayParameter { get; }
int Count { get; }
+ bool HasParams { get; }
string ParameterName (int pos);
string ParameterDesc (int pos);
Parameter.Modifier ParameterModifier (int pos);
+ string GetSignatureForError ();
}
public class ReflectionParameters : ParameterData {
ParameterInfo [] pi;
+ Type[] type_params;
bool last_arg_is_params = false;
+ bool is_varargs = false;
ParameterData gpd;
- public ReflectionParameters (MethodBase method)
+ public ReflectionParameters (MethodBase mb)
{
object [] attrs;
- this.pi = method.GetParameters ();
+ ParameterInfo [] pi = mb.GetParameters ();
+ is_varargs = (mb.CallingConvention & CallingConventions.VarArgs) != 0;
+
+ this.pi = pi;
int count = pi.Length-1;
if (count < 0)
return;
- if (method.Mono_IsInflatedMethod) {
- MethodInfo generic = method.GetGenericMethodDefinition ();
- gpd = Invocation.GetParameterData (generic);
+ if (mb.Mono_IsInflatedMethod) {
+ MethodInfo generic = mb.GetGenericMethodDefinition ();
+ gpd = TypeManager.GetParameterData (generic);
- last_arg_is_params = gpd.HasArrayParameter;
+ last_arg_is_params = gpd.HasParams;
return;
}
+ if (mb.IsGenericMethodDefinition)
+ type_params = mb.GetGenericArguments ();
+
attrs = pi [count].GetCustomAttributes (TypeManager.param_array_type, true);
if (attrs == null)
return;
last_arg_is_params = true;
}
-
- public bool HasArrayParameter {
- get { return last_arg_is_params; }
+
+ public string GetSignatureForError ()
+ {
+ StringBuilder sb = new StringBuilder ("(");
+ for (int i = 0; i < pi.Length; ++i) {
+ if (i != 0)
+ sb.Append (", ");
+ sb.Append (ParameterDesc (i));
+ }
+ sb.Append (')');
+ return sb.ToString ();
}
public Type ParameterType (int pos)
{
if (last_arg_is_params && pos >= pi.Length - 1)
return pi [pi.Length - 1].ParameterType;
+ else if (is_varargs && pos >= pi.Length)
+ return TypeManager.runtime_argument_handle_type;
else {
Type t = pi [pos].ParameterType;
if (gpd != null)
return gpd.GenericConstraints (pos);
- Type t = ParameterType (pos);
- if (!t.IsGenericParameter)
+ if (type_params == null)
return null;
- return ReflectionConstraints.Create (t);
+ return new ReflectionConstraints (type_params [pos]);
}
public string ParameterName (int pos)
{
+ if (gpd != null)
+ return gpd.ParameterName (pos);
+
if (last_arg_is_params && pos >= pi.Length - 1)
return pi [pi.Length - 1].Name;
+ else if (is_varargs && pos >= pi.Length)
+ return "__arglist";
else
return pi [pos].Name;
}
public string ParameterDesc (int pos)
{
+ if (is_varargs && pos >= pi.Length)
+ return "";
+
StringBuilder sb = new StringBuilder ();
if (pi [pos].IsIn)
if (pos >= pi.Length - 1 && last_arg_is_params)
sb.Append ("params ");
- sb.Append (TypeManager.CSharpName (partype));
+ sb.Append (TypeManager.CSharpName (partype).Replace ("&", ""));
return sb.ToString ();
public Parameter.Modifier ParameterModifier (int pos)
{
- int len = pi.Length;
-
- if (pos >= len - 1)
- if (last_arg_is_params)
+ if (last_arg_is_params && pos >= pi.Length - 1)
return Parameter.Modifier.PARAMS;
+ else if (is_varargs && pos >= pi.Length)
+ return Parameter.Modifier.ARGLIST;
+ if (gpd != null)
+ return gpd.ParameterModifier (pos);
+
Type t = pi [pos].ParameterType;
if (t.IsByRef){
- if ((pi [pos].Attributes & ParameterAttributes.Out) != 0)
+ if ((pi [pos].Attributes & (ParameterAttributes.Out|ParameterAttributes.In)) == ParameterAttributes.Out)
return Parameter.Modifier.ISBYREF | Parameter.Modifier.OUT;
else
return Parameter.Modifier.ISBYREF | Parameter.Modifier.REF;
public int Count {
get {
- return pi.Length;
+ return is_varargs ? pi.Length + 1 : pi.Length;
}
}
- protected class ReflectionConstraints : GenericConstraints
- {
- bool has_ctor;
- Type class_constraint;
- Type[] iface_constraints;
-
- protected ReflectionConstraints (bool has_ctor, Type class_constr,
- Type[] iface_constrs)
- {
- this.has_ctor = has_ctor;
- this.class_constraint = class_constr;
- this.iface_constraints = iface_constrs;
- }
-
- public static GenericConstraints Create (Type t)
- {
- Type class_constr = null;
- Type[] iface_constrs = t.GetInterfaces ();
- if (iface_constrs == null)
- iface_constrs = Type.EmptyTypes;
- if (t.BaseType != TypeManager.object_type)
- class_constr = t.BaseType;
-
- return new ReflectionConstraints (
- false, class_constr, iface_constrs);
- }
-
- public bool HasConstructor {
- get { return has_ctor; }
- }
-
- public bool HasClassConstraint {
- get { return class_constraint != null; }
- }
-
- public Type ClassConstraint {
- get { return class_constraint; }
- }
-
- public Type[] InterfaceConstraints {
- get { return iface_constraints; }
+ public bool HasParams {
+ get {
+ return this.last_arg_is_params;
}
}
}
public class InternalParameters : ParameterData {
Type [] param_types;
+ bool has_varargs;
+ int count;
public readonly Parameters Parameters;
+ public readonly TypeParameter[] TypeParameters;
public InternalParameters (Type [] param_types, Parameters parameters)
{
this.param_types = param_types;
this.Parameters = parameters;
+
+ has_varargs = parameters.HasArglist;
+
+ if (param_types == null)
+ count = 0;
+ else
+ count = param_types.Length;
}
- public InternalParameters (DeclSpace ds, Parameters parameters)
- : this (parameters.GetParameterInfo (ds), parameters)
+ public InternalParameters (Type [] param_types, Parameters parameters,
+ TypeParameter [] type_params)
+ : this (param_types, parameters)
{
+ this.TypeParameters = type_params;
}
public int Count {
get {
- if (param_types == null)
- return 0;
-
- return param_types.Length;
+ return has_varargs ? count + 1 : count;
}
}
- public bool HasArrayParameter {
- get { return Parameters.ArrayParameter != null; }
+ public bool HasParams {
+ get {
+ return Parameters.ArrayParameter != null;
+ }
}
Parameter GetParameter (int pos)
return Parameters.ArrayParameter;
}
+ public string GetSignatureForError ()
+ {
+ StringBuilder sb = new StringBuilder ("(");
+ for (int i = 0; i < count; ++i) {
+ if (i != 0)
+ sb.Append (", ");
+ sb.Append (ParameterDesc (i));
+ }
+ sb.Append (')');
+ return sb.ToString ();
+ }
+
public Type ParameterType (int pos)
{
+ if (has_varargs && pos >= count)
+ return TypeManager.runtime_argument_handle_type;
+
if (param_types == null)
return null;
public GenericConstraints GenericConstraints (int pos)
{
- if (param_types == null)
+ if (TypeParameters == null)
return null;
- return GetParameter (pos).GenericConstraints;
+ return TypeParameters [pos].Constraints;
}
public string ParameterName (int pos)
{
+ if (has_varargs && pos >= count)
+ return "__arglist";
+
return GetParameter (pos).Name;
}
public string ParameterDesc (int pos)
{
- string tmp = String.Empty;
+ if (has_varargs && pos >= count)
+ return "__arglist";
+
+ Type t = ParameterType (pos);
+ return (ModifierDesc (pos) + " " + TypeManager.CSharpName (t).Replace ("&", "")).TrimStart ();
+ }
+
+ public string ModifierDesc (int pos)
+ {
Parameter p = GetParameter (pos);
//
// extra flag ISBYREF will be set as well
//
if ((p.ModFlags & Parameter.Modifier.REF) != 0)
- tmp = "ref ";
- else if ((p.ModFlags & Parameter.Modifier.OUT) != 0)
- tmp = "out ";
- else if (p.ModFlags == Parameter.Modifier.PARAMS)
- tmp = "params ";
-
- Type t = ParameterType (pos);
+ return "ref";
+ if ((p.ModFlags & Parameter.Modifier.OUT) != 0)
+ return "out";
+ if (p.ModFlags == Parameter.Modifier.PARAMS)
+ return "params";
- return tmp + TypeManager.CSharpName (t);
+ return "";
}
public Parameter.Modifier ParameterModifier (int pos)
{
+ if (has_varargs && pos >= count)
+ return Parameter.Modifier.ARGLIST;
+
Parameter.Modifier mod = GetParameter (pos).ModFlags;
if ((mod & (Parameter.Modifier.REF | Parameter.Modifier.OUT)) != 0)
}
+ public class ReflectionConstraints : GenericConstraints
+ {
+ GenericParameterAttributes attrs;
+ Type base_type;
+ Type class_constraint;
+ Type[] iface_constraints;
+
+ public ReflectionConstraints (Type t)
+ {
+ Type[] constraints = t.GetGenericParameterConstraints ();
+ if ((constraints.Length > 0) && !constraints [0].IsInterface) {
+ class_constraint = constraints [0];
+ iface_constraints = new Type [constraints.Length - 1];
+ Array.Copy (constraints, 1, iface_constraints, 0, constraints.Length - 1);
+ } else
+ iface_constraints = constraints;
+ attrs = t.GenericParameterAttributes;
+
+ if (HasValueTypeConstraint)
+ base_type = TypeManager.value_type;
+ else if (class_constraint != null)
+ base_type = class_constraint;
+ else
+ base_type = TypeManager.object_type;
+ }
+
+ public override GenericParameterAttributes Attributes {
+ get { return attrs; }
+ }
+
+ public override Type ClassConstraint {
+ get { return class_constraint; }
+ }
+
+ public override Type EffectiveBaseClass {
+ get { return base_type; }
+ }
+
+ public override Type[] InterfaceConstraints {
+ get { return iface_constraints; }
+ }
+ }
+
class PtrHashtable : Hashtable {
sealed class PtrComparer : IComparer {
private 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, false, CultureInfo.InvariantCulture);
-
- if (b is string)
- return String.Compare (((MemberInfo)a).Name, (string) b, false, CultureInfo.InvariantCulture);
-
- return String.Compare (((MemberInfo)a).Name, ((MemberInfo)b).Name, false, CultureInfo.InvariantCulture);
- }
- }
-
struct Pair {
public object First;
public object Second;
{
this.reader = reader;
this.buffer = new char [DefaultCacheSize];
+
+ // Compute the preamble size
+
+ // Let the StreamWriter autodetect the encoder
+ reader.Peek ();
+
+ reader.BaseStream.Position = 0;
+ Encoding enc = reader.CurrentEncoding;
+ // First of all, get at least a char
+
+ byte[] auxb = new byte [50];
+ int num_bytes = 0;
+ int num_chars = 0;
+ int br = 0;
+ do {
+ br = reader.BaseStream.Read (auxb, num_bytes, auxb.Length - num_bytes);
+ num_bytes += br;
+ num_chars = enc.GetCharCount (auxb, 0, num_bytes);
+ }
+ while (num_chars == 0 && br > 0);
+
+ if (num_chars != 0)
+ {
+ // Now, check which bytes at the beginning have no effect in the
+ // char count
+
+ int p = 0;
+ while (enc.GetCharCount (auxb, p, num_bytes-p) >= num_chars)
+ p++;
+
+ preamble_size = p - 1;
+ reader.BaseStream.Position = 0;
+ reader.DiscardBufferedData ();
+
+ buffer_start = preamble_size;
+ }
}
public SeekableStreamReader (Stream stream, Encoding encoding, bool detect_encoding_from_bytemarks)
int buffer_size; // in bytes
int char_count; // count buffer[] valid characters
int pos; // index into buffer[]
+ int preamble_size;
/// <remarks>
/// The difference to the StreamReader's BaseStream.Position is that this one is reliable; ie. it
// buffer.
if ((value >= buffer_start) && (value < buffer_start + buffer_size)) {
int byte_offset = value - buffer_start;
+
+ // pos is an index into a char
+ // buffer so it might be
+ // greater than the buffer
+ // length now, if the buffer
+ // contains multibyte chars
pos = byte_offset;
- // encoded characters can take more than 1 byte length
- while (reader.CurrentEncoding.GetByteCount (buffer, 0, pos) > byte_offset)
+
+ // encoded characters can take
+ // more than 1 byte length.
+ while ((pos > buffer.Length) ||
+ reader.CurrentEncoding.GetByteCount (buffer, 0, pos) > byte_offset) {
pos--;
+ }
return;
}
+
+ if (value == 0) // Skip preamble
+ value = preamble_size;
// Ok, now we need to seek.
reader.DiscardBufferedData ();