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

Reply via email to