projects
/
mono.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
In .:
[mono.git]
/
mcs
/
gmcs
/
support.cs
diff --git
a/mcs/gmcs/support.cs
b/mcs/gmcs/support.cs
old mode 100755
(executable)
new mode 100644
(file)
index
f3e6941
..
c709135
--- a/
mcs/gmcs/support.cs
+++ b/
mcs/gmcs/support.cs
@@
-21,11
+21,12
@@
namespace Mono.CSharp {
public interface ParameterData {
Type ParameterType (int pos);
GenericConstraints GenericConstraints (int pos);
public interface ParameterData {
Type ParameterType (int pos);
GenericConstraints GenericConstraints (int pos);
- bool HasArrayParameter { get; }
int Count { get; }
int Count { get; }
+ bool HasParams { get; }
string ParameterName (int pos);
string ParameterDesc (int pos);
Parameter.Modifier ParameterModifier (int pos);
string ParameterName (int pos);
string ParameterDesc (int pos);
Parameter.Modifier ParameterModifier (int pos);
+ string GetSignatureForError ();
}
public class ReflectionParameters : ParameterData {
}
public class ReflectionParameters : ParameterData {
@@
-50,9
+51,9
@@
namespace Mono.CSharp {
if (mb.Mono_IsInflatedMethod) {
MethodInfo generic = mb.GetGenericMethodDefinition ();
if (mb.Mono_IsInflatedMethod) {
MethodInfo generic = mb.GetGenericMethodDefinition ();
- gpd =
Invocation
.GetParameterData (generic);
+ gpd =
TypeManager
.GetParameterData (generic);
- last_arg_is_params = gpd.Has
ArrayParameter
;
+ last_arg_is_params = gpd.Has
Params
;
return;
}
return;
}
@@
-68,9
+69,17
@@
namespace Mono.CSharp {
last_arg_is_params = true;
}
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)
}
public Type ParameterType (int pos)
@@
-99,6
+108,9
@@
namespace Mono.CSharp {
public string ParameterName (int 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)
if (last_arg_is_params && pos >= pi.Length - 1)
return pi [pi.Length - 1].Name;
else if (is_varargs && pos >= pi.Length)
@@
-129,7
+141,7
@@
namespace Mono.CSharp {
if (pos >= pi.Length - 1 && last_arg_is_params)
sb.Append ("params ");
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 ();
return sb.ToString ();
@@
-137,16
+149,17
@@
namespace Mono.CSharp {
public Parameter.Modifier ParameterModifier (int pos)
{
public Parameter.Modifier ParameterModifier (int pos)
{
- int len = pi.Length;
-
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 (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){
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;
return Parameter.Modifier.ISBYREF | Parameter.Modifier.OUT;
else
return Parameter.Modifier.ISBYREF | Parameter.Modifier.REF;
@@
-160,6
+173,12
@@
namespace Mono.CSharp {
return is_varargs ? pi.Length + 1 : pi.Length;
}
}
return is_varargs ? pi.Length + 1 : pi.Length;
}
}
+
+ public bool HasParams {
+ get {
+ return this.last_arg_is_params;
+ }
+ }
}
public class InternalParameters : ParameterData {
}
public class InternalParameters : ParameterData {
@@
-196,8
+215,10
@@
namespace Mono.CSharp {
}
}
}
}
- public bool HasArrayParameter {
- get { return Parameters.ArrayParameter != null; }
+ public bool HasParams {
+ get {
+ return Parameters.ArrayParameter != null;
+ }
}
Parameter GetParameter (int pos)
}
Parameter GetParameter (int pos)
@@
-212,6
+233,18
@@
namespace Mono.CSharp {
return Parameters.ArrayParameter;
}
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)
public Type ParameterType (int pos)
{
if (has_varargs && pos >= count)
@@
-244,7
+277,12
@@
namespace Mono.CSharp {
if (has_varargs && pos >= count)
return "__arglist";
if (has_varargs && pos >= count)
return "__arglist";
- string tmp = String.Empty;
+ Type t = ParameterType (pos);
+ return (ModifierDesc (pos) + " " + TypeManager.CSharpName (t).Replace ("&", "")).TrimStart ();
+ }
+
+ public string ModifierDesc (int pos)
+ {
Parameter p = GetParameter (pos);
//
Parameter p = GetParameter (pos);
//
@@
-252,15
+290,13
@@
namespace Mono.CSharp {
// extra flag ISBYREF will be set as well
//
if ((p.ModFlags & Parameter.Modifier.REF) != 0)
// 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)
}
public Parameter.Modifier ParameterModifier (int pos)
@@
-472,10
+508,20
@@
namespace Mono.CSharp {
// buffer.
if ((value >= buffer_start) && (value < buffer_start + buffer_size)) {
int byte_offset = value - buffer_start;
// 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;
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--;
pos--;
+ }
return;
}
return;
}