Author: jbevain
Date: 2005-11-01 11:35:02 -0500 (Tue, 01 Nov 2005)
New Revision: 52450
Modified:
trunk/cecil/lib/ChangeLog
trunk/cecil/lib/Mono.Cecil.Signatures/SignatureReader.cs
trunk/cecil/lib/Mono.Cecil/AssemblyInfo.cs
trunk/cecil/lib/Mono.Cecil/FunctionPointerType.cs
trunk/cecil/lib/Mono.Cecil/ReflectionReader.cs
Log:
2005-11-01 Jb Evain <[EMAIL PROTECTED]>
* Mono.Cecil/FunctionPointerType.cs
Mono.Cecil/ReflectionReader.cs
Mono.Cecil.Signatures/SignatureReader.cs:
Work on function pointers.
* Mono.Cecil/AssemblyInfo.cs:
Increase Cecil SVN version.
Modified: trunk/cecil/lib/ChangeLog
===================================================================
--- trunk/cecil/lib/ChangeLog 2005-11-01 15:48:33 UTC (rev 52449)
+++ trunk/cecil/lib/ChangeLog 2005-11-01 16:35:02 UTC (rev 52450)
@@ -1,5 +1,13 @@
2005-11-01 Jb Evain <[EMAIL PROTECTED]>
+ * Mono.Cecil/FunctionPointerType.cs
+ Mono.Cecil/ReflectionReader.cs
+ Mono.Cecil.Signatures/SignatureReader.cs:
+ Work on function pointers.
+
+ * Mono.Cecil/AssemblyInfo.cs:
+ Increase Cecil SVN version.
+
* Mono.Cecil/ArrayType.cs
Mono.Cecil/MethodSpecification.cs
Mono.Cecil/TypeSpecification.cs
Modified: trunk/cecil/lib/Mono.Cecil/AssemblyInfo.cs
===================================================================
--- trunk/cecil/lib/Mono.Cecil/AssemblyInfo.cs 2005-11-01 15:48:33 UTC (rev
52449)
+++ trunk/cecil/lib/Mono.Cecil/AssemblyInfo.cs 2005-11-01 16:35:02 UTC (rev
52450)
@@ -41,5 +41,5 @@
[assembly: CLSCompliant (false)]
[assembly: ComVisible (false)]
-[assembly: AssemblyVersion ("0.1.0.0")]
+[assembly: AssemblyVersion ("0.1.1.1")]
Modified: trunk/cecil/lib/Mono.Cecil/FunctionPointerType.cs
===================================================================
--- trunk/cecil/lib/Mono.Cecil/FunctionPointerType.cs 2005-11-01 15:48:33 UTC
(rev 52449)
+++ trunk/cecil/lib/Mono.Cecil/FunctionPointerType.cs 2005-11-01 16:35:02 UTC
(rev 52450)
@@ -29,11 +29,10 @@
namespace Mono.Cecil {
using System;
+ using System.Text;
- using Mono.Cecil.Signatures;
+ public sealed class FunctionPointerType : TypeSpecification,
IFunctionPointerType {
- public sealed class FunctionPointerType : TypeReference,
IFunctionPointerType {
-
MethodReference m_function;
public bool HasThis {
@@ -75,18 +74,27 @@
}
public override string FullName {
- get { return m_function.ToString (); }
+ get {
+ StringBuilder sb = new StringBuilder ();
+ sb.Append (m_function.Name);
+ sb.Append (" ");
+ sb.Append
(m_function.ReturnType.ReturnType.FullName);
+ sb.Append (" *(");
+ for (int i = 0; i <
m_function.Parameters.Count; i++) {
+ if (i > 0)
+ sb.Append (",");
+ sb.Append (m_function.Parameters
[i].ParameterType.FullName);
+ }
+ sb.Append (")");
+ return sb.ToString ();
+ }
}
- public FunctionPointerType (bool hasThis, bool explicitThis,
MethodCallingConvention callConv,
- ParameterDefinitionCollection parameters,
MethodReturnType retType) :
- base (string.Empty, string.Empty)
+ public FunctionPointerType (bool hasThis, bool explicitThis,
MethodCallingConvention callConv, MethodReturnType retType) :
+ base (retType.ReturnType)
{
- m_function = new MethodReference ("function", hasThis,
explicitThis, callConv);
- m_function.DeclaringType = this;
+ m_function = new MethodReference ("method", hasThis,
explicitThis, callConv);
m_function.ReturnType = retType;
- foreach (ParameterDefinition param in parameters)
- (m_function.Parameters as
ParameterDefinitionCollection).Add (param);
}
}
}
Modified: trunk/cecil/lib/Mono.Cecil/ReflectionReader.cs
===================================================================
--- trunk/cecil/lib/Mono.Cecil/ReflectionReader.cs 2005-11-01 15:48:33 UTC
(rev 52449)
+++ trunk/cecil/lib/Mono.Cecil/ReflectionReader.cs 2005-11-01 16:35:02 UTC
(rev 52450)
@@ -914,18 +914,18 @@
return new PointerType (SearchCoreType
(Constants.Void));
return new PointerType (GetTypeRefFromSig
(pointer.PtrType, context));
case ElementType.FnPtr :
- // not very sure of this
FNPTR funcptr = t as FNPTR;
- ParameterDefinitionCollection parameters = new
ParameterDefinitionCollection (null);
+ FunctionPointerType fnptr = new
FunctionPointerType (funcptr.Method.HasThis, funcptr.Method.ExplicitThis,
+ funcptr.Method.MethCallConv,
GetMethodReturnType (funcptr.Method, context));
+
for (int i = 0; i < funcptr.Method.ParamCount;
i++) {
Param p = funcptr.Method.Parameters [i];
- ParameterDefinition pdef = new
ParameterDefinition (p.ByRef ? new ReferenceType (
- GetTypeRefFromSig
(p.Type, context)) : GetTypeRefFromSig (p.Type, context));
- parameters.Add (pdef);
+ fnptr.Parameters.Add
(BuildParameterDefinition (
+ string.Concat ("A_", i),
+ i, (ParamAttributes) 0,
+ p, context));
}
- return new FunctionPointerType
(funcptr.Method.HasThis, funcptr.Method.ExplicitThis,
- funcptr.Method.MethCallConv,
- parameters, GetMethodReturnType
(funcptr.Method, context));
+ return fnptr;
case ElementType.Var:
VAR var = t as VAR;
return context.Type.GenericParameters
[var.Index];
Modified: trunk/cecil/lib/Mono.Cecil.Signatures/SignatureReader.cs
===================================================================
--- trunk/cecil/lib/Mono.Cecil.Signatures/SignatureReader.cs 2005-11-01
15:48:33 UTC (rev 52449)
+++ trunk/cecil/lib/Mono.Cecil.Signatures/SignatureReader.cs 2005-11-01
16:35:02 UTC (rev 52450)
@@ -199,48 +199,13 @@
public override void VisitMethodDefSig (MethodDefSig methodDef)
{
int start;
- Utilities.ReadCompressedInteger (m_blobData, (int)
methodDef.BlobIndex, out start);
- methodDef.CallingConvention = m_blobData [start];
- start++;
- methodDef.HasThis = (methodDef.CallingConvention &
0x20) != 0;
- methodDef.ExplicitThis = (methodDef.CallingConvention &
0x40) != 0;
- if ((methodDef.CallingConvention & 0x5) != 0)
- methodDef.MethCallConv |=
MethodCallingConvention.VarArg;
- else if ((methodDef.CallingConvention & 0x10) != 0) {
- methodDef.MethCallConv |=
MethodCallingConvention.Generic;
- methodDef.GenericParameterCount =
Utilities.ReadCompressedInteger (m_blobData, start, out start);
- } else
- methodDef.MethCallConv |=
MethodCallingConvention.Default;
-
- methodDef.ParamCount = Utilities.ReadCompressedInteger
(m_blobData, start, out start);
- methodDef.RetType = this.ReadRetType (m_blobData,
start, out start);
- methodDef.Parameters = this.ReadParameters
(methodDef.ParamCount, m_blobData, start);
+ ReadMethodDefSig (methodDef,
m_root.Streams.BlobHeap.Read (methodDef.BlobIndex), 0, out start);
}
public override void VisitMethodRefSig (MethodRefSig methodRef)
{
int start;
- Utilities.ReadCompressedInteger (m_blobData, (int)
methodRef.BlobIndex, out start);
- methodRef.CallingConvention = m_blobData [start];
- methodRef.HasThis = (methodRef.CallingConvention &
0x20) != 0;
- methodRef.ExplicitThis = (methodRef.CallingConvention &
0x40) != 0;
- if ((methodRef.CallingConvention & 0x1) != 0)
- methodRef.MethCallConv |=
MethodCallingConvention.C;
- else if ((methodRef.CallingConvention & 0x2) != 0)
- methodRef.MethCallConv |=
MethodCallingConvention.StdCall;
- else if ((methodRef.CallingConvention & 0x3) != 0)
- methodRef.MethCallConv |=
MethodCallingConvention.ThisCall;
- else if ((methodRef.CallingConvention & 0x4) != 0)
- methodRef.MethCallConv |=
MethodCallingConvention.FastCall;
- else if ((methodRef.CallingConvention & 0x5) != 0)
- methodRef.MethCallConv |=
MethodCallingConvention.VarArg;
- else
- methodRef.MethCallConv |=
MethodCallingConvention.Default;
- methodRef.ParamCount = Utilities.ReadCompressedInteger
(m_blobData, start + 1, out start);
- methodRef.RetType = this.ReadRetType (m_blobData,
start, out start);
- int sentpos;
- methodRef.Parameters = this.ReadParameters
(methodRef.ParamCount, m_blobData, start, out sentpos);
- methodRef.Sentinel = sentpos;
+ ReadMethodRefSig (methodRef,
m_root.Streams.BlobHeap.Read (methodRef.BlobIndex), 0, out start);
}
public override void VisitFieldSig (FieldSig field)
@@ -274,6 +239,50 @@
localvar.LocalVariables = this.ReadLocalVariables
(localvar.Count, m_blobData, start);
}
+ void ReadMethodDefSig (MethodDefSig methodDef, byte [] data,
int pos, out int start)
+ {
+ methodDef.CallingConvention = data [pos];
+ start = pos + 1;
+ methodDef.HasThis = (methodDef.CallingConvention &
0x20) != 0;
+ methodDef.ExplicitThis = (methodDef.CallingConvention &
0x40) != 0;
+ if ((methodDef.CallingConvention & 0x5) != 0)
+ methodDef.MethCallConv |=
MethodCallingConvention.VarArg;
+ else if ((methodDef.CallingConvention & 0x10) != 0) {
+ methodDef.MethCallConv |=
MethodCallingConvention.Generic;
+ methodDef.GenericParameterCount =
Utilities.ReadCompressedInteger (data, start, out start);
+ } else
+ methodDef.MethCallConv |=
MethodCallingConvention.Default;
+
+ methodDef.ParamCount = Utilities.ReadCompressedInteger
(data, start, out start);
+ methodDef.RetType = this.ReadRetType (data, start, out
start);
+ methodDef.Parameters = this.ReadParameters
(methodDef.ParamCount, data, start);
+ }
+
+ void ReadMethodRefSig (MethodRefSig methodRef, byte [] data,
int pos, out int start)
+ {
+ methodRef.CallingConvention = data [pos];
+ start = pos + 1;
+ methodRef.HasThis = (methodRef.CallingConvention &
0x20) != 0;
+ methodRef.ExplicitThis = (methodRef.CallingConvention &
0x40) != 0;
+ if ((methodRef.CallingConvention & 0x1) != 0)
+ methodRef.MethCallConv |=
MethodCallingConvention.C;
+ else if ((methodRef.CallingConvention & 0x2) != 0)
+ methodRef.MethCallConv |=
MethodCallingConvention.StdCall;
+ else if ((methodRef.CallingConvention & 0x3) != 0)
+ methodRef.MethCallConv |=
MethodCallingConvention.ThisCall;
+ else if ((methodRef.CallingConvention & 0x4) != 0)
+ methodRef.MethCallConv |=
MethodCallingConvention.FastCall;
+ else if ((methodRef.CallingConvention & 0x5) != 0)
+ methodRef.MethCallConv |=
MethodCallingConvention.VarArg;
+ else
+ methodRef.MethCallConv |=
MethodCallingConvention.Default;
+ methodRef.ParamCount = Utilities.ReadCompressedInteger
(data, start, out start);
+ methodRef.RetType = this.ReadRetType (data, start, out
start);
+ int sentpos;
+ methodRef.Parameters = this.ReadParameters
(methodRef.ParamCount, data, start, out sentpos);
+ methodRef.Sentinel = sentpos;
+ }
+
LocalVarSig.LocalVariable [] ReadLocalVariables (int length,
byte [] data, int pos)
{
int start = pos;
@@ -433,16 +442,15 @@
p.CustomMods = this.ReadCustomMods (data,
start, out start);
p.PtrType = this.ReadType (data, start, out
start);
return p;
- case ElementType.FnPtr : // TODO does it work ?
- pos++;
+ case ElementType.FnPtr :
FNPTR fp = new FNPTR ();
- if ((data [pos] & 0x5) != 0) {
- MethodRefSig mr = new MethodRefSig
((uint) pos);
- mr.Accept (this);
+ if ((data [start] & 0x5) != 0) {
+ MethodRefSig mr = new MethodRefSig
((uint) start);
+ ReadMethodRefSig (mr, data, start, out
start);
fp.Method = mr;
} else {
- MethodDefSig md = new MethodDefSig
((uint) pos);
- md.Accept (this);
+ MethodDefSig md = new MethodDefSig
((uint) start);
+ ReadMethodDefSig (md, data, start, out
start);
fp.Method = md;
}
return fp;
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches