[Top][All Lists]
[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.
*/
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [dotgnu-pnet-commits] pnet ChangeLog ilasm/ilasm_build.c image/class....,
Klaus Treichel <=