dotgnu-pnet-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dotgnu-pnet-commits] pnet ChangeLog ilasm/ilasm_build.c image/class....


From: Klaus Treichel
Subject: [dotgnu-pnet-commits] pnet ChangeLog ilasm/ilasm_build.c image/class....
Date: Sun, 15 Jul 2007 19:55:24 +0000

CVSROOT:        /cvsroot/dotgnu-pnet
Module name:    pnet
Changes by:     Klaus Treichel <ktreichel>      07/07/15 19:55:24

Modified files:
        .              : ChangeLog 
        ilasm          : ilasm_build.c 
        image          : class.c member.c misc_token.c program.h 
        include        : il_program.h 

Log message:
        Add more ilasm generics stuff (Generic member access).

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/pnet/ChangeLog?cvsroot=dotgnu-pnet&r1=1.3477&r2=1.3478
http://cvs.savannah.gnu.org/viewcvs/pnet/ilasm/ilasm_build.c?cvsroot=dotgnu-pnet&r1=1.29&r2=1.30
http://cvs.savannah.gnu.org/viewcvs/pnet/image/class.c?cvsroot=dotgnu-pnet&r1=1.35&r2=1.36
http://cvs.savannah.gnu.org/viewcvs/pnet/image/member.c?cvsroot=dotgnu-pnet&r1=1.30&r2=1.31
http://cvs.savannah.gnu.org/viewcvs/pnet/image/misc_token.c?cvsroot=dotgnu-pnet&r1=1.10&r2=1.11
http://cvs.savannah.gnu.org/viewcvs/pnet/image/program.h?cvsroot=dotgnu-pnet&r1=1.24&r2=1.25
http://cvs.savannah.gnu.org/viewcvs/pnet/include/il_program.h?cvsroot=dotgnu-pnet&r1=1.56&r2=1.57

Patches:
Index: ChangeLog
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/ChangeLog,v
retrieving revision 1.3477
retrieving revision 1.3478
diff -u -b -r1.3477 -r1.3478
--- ChangeLog   8 Jul 2007 20:13:38 -0000       1.3477
+++ ChangeLog   15 Jul 2007 19:55:23 -0000      1.3478
@@ -1,4 +1,25 @@
-2007-07-08  Klaus Treickel  <address@hidden>
+2007-07-15  Klaus Treichel  <address@hidden>
+
+       * ilasm/ilasm_build.c: Handle TypeSpec parents for MemberRefs in
+       ILAsmResolveMember. (Needed to access members of generic classes).
+
+       * image/class.c: Add the function ILClassCreateWrapper for creating
+       wrapper classes around TypeSpecs (Generic classes and Arrays) which can 
be
+       used as MemberRef parents.
+
+       * image/member.c: Add the function ILMemberRefCreate for creating
+       MemberRefs.
+
+       * image/misc_token.c: Make sure that there are no duplicate TypeSpecs in
+       the image (as required by the ECMA specs).
+
+       * image/program.h: Remove the declaration of ILMemberRef.
+
+       * include/il_program.h: Add the declaration of ILMemberRef. Add the
+       prototypes for ILClassCreateWrapper and ILMemberRefCreate. Add some 
helper
+       macros for accessing members of MemberRefs.
+
+2007-07-08  Klaus Treichel  <address@hidden>
 
        * ilasm/ilasm_grammar.y: Set the abstract attribute automatically for
        interface declarations. Change the reference for method generic 
parameters

Index: ilasm/ilasm_build.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/ilasm/ilasm_build.c,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -b -r1.29 -r1.30
--- ilasm/ilasm_build.c 3 Jul 2007 20:25:26 -0000       1.29
+++ ilasm/ilasm_build.c 15 Jul 2007 19:55:24 -0000      1.30
@@ -803,8 +803,6 @@
        ILTypeSpec *spec;
        ILClass *classInfo;
        ILMember *member;
-       ILMethod *method;
-       ILField *field;
 
        /* Convert TypeSpec tokens into class tokens */
        if((spec = ILProgramItemToTypeSpec(scope)) != 0)
@@ -829,8 +827,25 @@
        /* Look for a name and signature match on a member */
        if((member = ILClassNextMemberMatch(classInfo, 0, kind, name, sig)) != 
0)
        {
+               if(spec)
+               {
+                       ILMemberRef *memberRef = 
ILMemberRefCreate(ILToProgramItem(spec),
+                                                                               
                           0, kind, name, sig);
+
+                       if(!memberRef)
+                       {
+                               ILAsmPrintMessage(ILAsmFilename, ILAsmLineNum,
+                                                                 "cannot 
create member ref `%s'", name);
+                               ILAsmErrors = 1;
+                               return 0;
+                       }
+                       return ILMemberRef_Token(memberRef);
+               }
+               else
+               {
                return ILMember_Token(member);
        }
+       }
 
        /* Ignore the "class complete" check if this is a vararg call site,
           because we can always add vararg calls to a complete class */
@@ -852,6 +867,8 @@
           be fixed up later when we encounter the real definition */
        if(kind == IL_META_MEMBERKIND_METHOD)
        {
+               ILMethod *method;
+
                method = ILMethodCreate(classInfo, (ILToken)IL_MAX_UINT32,
                                                                name, 0);
                if(!method)
@@ -860,10 +877,29 @@
                }
                ILMemberSetSignature((ILMember *)method, sig);
                ILMethodSetCallConv(method, ILType_CallConv(sig));
+               if(spec)
+               {
+                       ILMemberRef *memberRef = 
ILMemberRefCreate(ILToProgramItem(spec),
+                                                                               
                           0, kind, name, sig);
+
+                       if(!memberRef)
+                       {
+                               ILAsmPrintMessage(ILAsmFilename, ILAsmLineNum,
+                                                                 "cannot 
create member ref `%s'", name);
+                               ILAsmErrors = 1;
+                               return 0;
+                       }
+                       return ILMemberRef_Token(memberRef);
+               }
+               else
+               {
                return ILMethod_Token(method);
        }
+       }
        else
        {
+               ILField *field;
+
                field = ILFieldCreate(classInfo, (ILToken)IL_MAX_UINT32,
                                                          name, 0);
                if(!field)
@@ -871,8 +907,25 @@
                        ILAsmOutOfMemory();
                }
                ILMemberSetSignature((ILMember *)field, sig);
+               if(spec)
+               {
+                       ILMemberRef *memberRef = 
ILMemberRefCreate(ILToProgramItem(spec),
+                                                                               
                           0, kind, name, sig);
+
+                       if(!memberRef)
+                       {
+                               ILAsmPrintMessage(ILAsmFilename, ILAsmLineNum,
+                                                                 "cannot 
create member ref `%s'", name);
+                               ILAsmErrors = 1;
+                               return 0;
+                       }
+                       return ILMemberRef_Token(memberRef);
+               }
+               else
+               {
                return ILField_Token(field);
        }
+       }
 }
 
 ILMethod *ILAsmMethodCreate(ILClass *classInfo, const char *name,

Index: image/class.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/image/class.c,v
retrieving revision 1.35
retrieving revision 1.36
diff -u -b -r1.35 -r1.36
--- image/class.c       8 Jul 2007 20:13:39 -0000       1.35
+++ image/class.c       15 Jul 2007 19:55:24 -0000      1.36
@@ -306,6 +306,34 @@
        return info;
 }
 
+ILClass *ILClassCreateWrapper(ILProgramItem *scope, ILToken token,
+                                                         ILType *type)
+{
+       ILImage *image = scope->image;
+       ILClass *info;
+
+       /* Allocate space for the class information block */
+       info = ILMemStackAlloc(&(image->memStack), ILClass);
+       if(!info)
+       {
+               return 0;
+       }
+
+       /* Initialize the class fields */
+       info->programItem.image = image;
+
+       /* Set the token code for the class */
+       info->programItem.token = token;
+
+       /* Set the synthetic type */
+       info->synthetic = type;
+
+       info->parent = 0;
+       info->ext = 0;
+
+       return info;
+}
+
 ILClass *ILClassCreate(ILProgramItem *scope, ILToken token, const char *name,
                                           const char *namespace, ILClass 
*parent)
 {

Index: image/member.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/image/member.c,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -b -r1.30 -r1.31
--- image/member.c      1 Jun 2007 07:35:35 -0000       1.30
+++ image/member.c      15 Jul 2007 19:55:24 -0000      1.31
@@ -249,6 +249,88 @@
 }
 
 /*
+ * Create a MemberRef.
+ */
+ILMemberRef *ILMemberRefCreate(ILProgramItem *owner, ILToken token,
+                                                          ILUInt32 kind, const 
char *name,
+                                                          ILType *signature)
+{
+       ILTypeSpec *spec;
+       ILMember *member;
+       ILMemberRef *memberRef = 0;
+       ILImage *image = owner->image;
+
+       /* There shall be no duplicates in the MemberRefs. */
+       while((memberRef = (ILMemberRef *)ILImageNextToken(image,
+                                                                               
                           IL_META_TOKEN_MEMBER_REF,
+                                                                               
                           memberRef)))
+       {
+               ILClass *oldOwner = memberRef->member.owner;
+               ILToken oldToken = ILClass_Token(oldOwner);
+
+               if(owner->token != oldToken)
+               {
+                       continue;
+               }
+               if(strcmp(name, memberRef->member.name))
+               {
+                       continue;
+               }
+               if(!ILTypeIdentical(memberRef->member.signature, signature))
+               {
+                       continue;
+               }
+               /* The MemberRef found is identical. */
+               return memberRef;
+       }
+
+       memberRef = ILMemStackAlloc(&(image->memStack), ILMemberRef);
+       if(!memberRef)
+       {
+               return 0;
+       }
+
+       memberRef->member.name = _ILContextPersistString(image, name);
+       if(!(memberRef->member.name))
+       {
+               return 0;
+       }
+
+       if((spec = ILProgramItemToTypeSpec(owner)) != 0)
+       {
+               memberRef->member.owner = ILTypeSpecGetClass(spec);
+       }
+       else if((member = ILProgramItemToMember(owner)) != 0)
+       {
+               memberRef->member.owner = ILMemberGetOwner(member);
+       }
+       else
+       {
+               memberRef->member.owner = 0;
+       }
+       if(memberRef->member.owner == 0)
+       {
+               return 0;
+       }
+       memberRef->member.nextMember = 0;
+       memberRef->member.programItem.image = image;
+       memberRef->member.kind = kind;
+       memberRef->member.attributes = 0;
+       memberRef->member.signature = signature;
+       memberRef->member.signatureBlob = 0;
+
+       /* Set the token for the MemberRef */
+       if(token != 0 || image->type == IL_IMAGETYPE_BUILDING)
+       {
+               if(!_ILImageSetToken(image, &(memberRef->member.programItem), 
token, IL_META_TOKEN_MEMBER_REF))
+               {
+                       return 0;
+               }
+       }
+       return memberRef;
+}
+
+/*
  * Common function for creating members and attaching them to a class.
  */
 static ILMember *MemberCreate(ILClass *info, ILToken token,

Index: image/misc_token.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/image/misc_token.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -b -r1.10 -r1.11
--- image/misc_token.c  12 Jun 2004 13:13:41 -0000      1.10
+++ image/misc_token.c  15 Jul 2007 19:55:24 -0000      1.11
@@ -28,6 +28,22 @@
 {
        ILTypeSpec *spec;
 
+       if(token == 0)
+       {               
+               /* There shall be no duplicates in the TypeSpecs. */
+               spec = 0;
+
+               while((spec = (ILTypeSpec *)ILImageNextToken(image,
+                                                                               
                         IL_META_TOKEN_TYPE_SPEC,
+                                                                               
                         spec)))
+               {
+                       if(ILTypeIdentical(spec->type, type))
+                       {
+                               return spec;
+                       }
+               }
+       }
+
        /* Allocate space for the TypeSpec block from the memory stack */
        spec = ILMemStackAlloc(&(image->memStack), ILTypeSpec);
        if(!spec)

Index: image/program.h
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/image/program.h,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -b -r1.24 -r1.25
--- image/program.h     1 Jul 2007 14:15:17 -0000       1.24
+++ image/program.h     15 Jul 2007 19:55:24 -0000      1.25
@@ -437,7 +437,6 @@
 /*
  * Information about a reference member.
  */
-typedef struct _tagILMemberRef ILMemberRef;
 struct _tagILMemberRef
 {
        ILMember                member;                         /* Common 
member fields */

Index: include/il_program.h
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/include/il_program.h,v
retrieving revision 1.56
retrieving revision 1.57
diff -u -b -r1.56 -r1.57
--- include/il_program.h        3 Jul 2007 20:25:26 -0000       1.56
+++ include/il_program.h        15 Jul 2007 19:55:24 -0000      1.57
@@ -64,6 +64,7 @@
 typedef struct _tagILGenericPar                ILGenericPar;
 typedef struct _tagILGenericConstraint ILGenericConstraint;
 typedef struct _tagILMethodSpec                ILMethodSpec;
+typedef struct _tagILMemberRef         ILMemberRef;
 
 /*
  * Iterate over the list of attributes that are associated
@@ -487,6 +488,14 @@
                                                  const char *name, const char 
*nspace);
 
 /*
+ * Create a wrapper class for a type (usually a TypeSpec) in the same
+ * image as the type. The class has no classname.
+ * Returns NULL if out of memory.
+ */
+ILClass *ILClassCreateWrapper(ILProgramItem *scope, ILToken token,
+                                                         ILType *type);
+
+/*
  * Resolve cross-image links for a class.
  */
 ILClass *ILClassResolve(ILClass *info);
@@ -923,6 +932,13 @@
 #define        IL_META_MEMBERKIND_REF                  7
 
 /*
+ * Create a MemberRef.
+ */
+ILMemberRef *ILMemberRefCreate(ILProgramItem *owner, ILToken token,
+                                                          ILUInt32 kind, const 
char *name,
+                                                          ILType *signature);
+
+/*
  * Create a reference member from a regular member.
  */
 ILMember *ILMemberCreateRef(ILMember *member, ILToken token);
@@ -1015,6 +1031,14 @@
        (ILMemberGetKind((ILMember *)(member)) == IL_META_MEMBERKIND_REF)
 
 /*
+ * Helper Macros for querying information about MemberRefs.
+ */
+#define        ILMemberRef_Token(memberRef)            
(ILProgramItem_Token((memberRef)))
+#define        ILMemberRef_Name(memberRef)                     
(ILMemberGetName((ILMember *)(memberRef)))
+#define        ILMemberRef_Signature(memberRef)        
(ILMemberGetSignature((ILMember *)(memberRef)))
+
+
+/*
  * Create a new method and attach it to a class.
  * Returns NULL if out of memory.
  */




reply via email to

[Prev in Thread] Current Thread [Next in Thread]