[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Dotgnu-pnet-commits] CVS: pnet/image generic.c,NONE,1.1 Makefile.am,1.
From: |
Rhys Weatherley <address@hidden> |
Subject: |
[Dotgnu-pnet-commits] CVS: pnet/image generic.c,NONE,1.1 Makefile.am,1.14,1.15 image.h,1.19,1.20 meta_build.c,1.19,1.20 meta_index.c,1.5,1.6 meta_types.c,1.6,1.7 meta_writer.c,1.6,1.7 opdef.c,1.4,1.5 program.h,1.12,1.13 sig_parse.c,1.6,1.7 sig_writer.c,1.5,1.6 test_macros.c,1.8,1.9 |
Date: |
Tue, 18 Feb 2003 00:25:12 -0500 |
Update of /cvsroot/dotgnu-pnet/pnet/image
In directory subversions:/tmp/cvs-serv8588/image
Modified Files:
Makefile.am image.h meta_build.c meta_index.c meta_types.c
meta_writer.c opdef.c program.h sig_parse.c sig_writer.c
test_macros.c
Added Files:
generic.c
Log Message:
Add support for Generic IL to "image", "ilasm", and "ildasm"; some
syntax extensions for Generic C#, but no semantic analysis (yet).
--- NEW FILE ---
/*
* generic.c - Process generic information from an image file.
*
* Copyright (C) 2003 Southern Storm Software, Pty Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "program.h"
#ifdef __cplusplus
extern "C" {
#endif
ILGenericPar *ILGenericParCreate(ILImage *image, ILToken token,
ILProgramItem
*owner, ILUInt32 number)
{
ILGenericPar *genPar;
ILClass *classInfo;
/* Allocate space for the GenericPar block from the memory stack */
genPar = ILMemStackAlloc(&(image->memStack), ILGenericPar);
if(!genPar)
{
return 0;
}
/* Set the GenericPar information fields */
genPar->ownedItem.programItem.image = image;
genPar->ownedItem.owner = owner;
genPar->number = (ILUInt16)number;
genPar->flags = 0;
genPar->name = 0;
genPar->kind = 0;
genPar->constraint = 0;
/* Assign a token code to the GenericPar information block */
if(!_ILImageSetToken(image, &(genPar->ownedItem.programItem), token,
IL_META_TOKEN_GENERIC_PAR))
{
return 0;
}
/* Mark the class as having generic parameters */
classInfo = ILProgramItemToClass(owner);
if(classInfo)
{
classInfo->attributes |= IL_META_TYPEDEF_GENERIC_PARS;
}
/* Return the GenericPar information block to the caller */
return genPar;
}
ILUInt32 ILGenericParGetNumber(ILGenericPar *genPar)
{
return genPar->number;
}
ILUInt32 ILGenericParGetFlags(ILGenericPar *genPar)
{
return genPar->flags;
}
void ILGenericParSetFlags(ILGenericPar *genPar, ILUInt32 mask, ILUInt32 value)
{
genPar->flags = (ILUInt16)((genPar->flags & ~mask) | value);
}
ILProgramItem *ILGenericParGetOwner(ILGenericPar *genPar)
{
return genPar->ownedItem.owner;
}
const char *ILGenericParGetName(ILGenericPar *genPar)
{
return genPar->name;
}
int ILGenericParSetName(ILGenericPar *genPar, const char *name)
{
genPar->name = _ILContextPersistString
(genPar->ownedItem.programItem.image, name);
return (genPar->name != 0);
}
ILProgramItem *ILGenericParGetKind(ILGenericPar *genPar)
{
return genPar->kind;
}
void ILGenericParSetKind(ILGenericPar *genPar, ILProgramItem *type)
{
genPar->kind = type;
}
ILProgramItem *ILGenericParGetConstraint(ILGenericPar *genPar)
{
return genPar->constraint;
}
void ILGenericParSetConstraint(ILGenericPar *genPar, ILProgramItem *type)
{
genPar->constraint = type;
}
/*
* Search key for "GenericParCompare".
*/
typedef struct
{
ILProgramItem *owner;
ILUInt32 number;
} ILGenericParSearchKey;
/*
* Compare GenericPar tokens looking for a match.
*/
static int GenericParCompare(void *item, void *userData)
{
ILGenericPar *genPar = (ILGenericPar *)item;
ILGenericParSearchKey *key = (ILGenericParSearchKey *)userData;
ILToken token1 =
(genPar->ownedItem.owner ? genPar->ownedItem.owner->token : 0);
ILToken token1Stripped = (token1 & ~IL_META_TOKEN_MASK);
ILToken token2 = key->owner->token;
ILToken token2Stripped = (token2 & ~IL_META_TOKEN_MASK);
if(token1Stripped < token2Stripped)
{
return -1;
}
else if(token1Stripped > token2Stripped)
{
return 1;
}
else if(token1 < token2)
{
return -1;
}
else if(token1 > token2)
{
return 1;
}
else if(genPar->number < key->number)
{
return -1;
}
else if(genPar->number > key->number)
{
return 1;
}
else
{
return 0;
}
}
ILGenericPar *ILGenericParGetFromOwner(ILProgramItem *owner, ILUInt32 number)
{
ILGenericParSearchKey key;
/* Take a short-cut if we know that the item is not generic */
if((owner->token & IL_META_TOKEN_MASK) == IL_META_TOKEN_TYPE_DEF &&
(((ILClass *)owner)->attributes & IL_META_TYPEDEF_GENERIC_PARS) == 0)
{
return 0;
}
if((owner->token & IL_META_TOKEN_MASK) == IL_META_TOKEN_METHOD_DEF &&
(ILMethod_CallConv((ILMethod *)owner) & IL_META_CALLCONV_GENERIC) ==
0)
{
return 0;
}
/* Search for the generic parameter information */
key.owner = owner;
key.number = number;
return (ILGenericPar *)ILImageSearchForToken
(owner->image, IL_META_TOKEN_GENERIC_PAR,
GenericParCompare, (void *)&key);
}
ILUInt32 ILGenericParGetNumParams(ILProgramItem *owner)
{
ILUInt32 number = 0;
while(ILGenericParGetFromOwner(owner, number) != 0)
{
++number;
}
return number;
}
ILMethodSpec *ILMethodSpecCreate(ILImage *image, ILToken token,
ILMember
*method, ILType *type)
{
ILMethodSpec *spec;
/* Allocate space for the MethodSpec block from the memory stack */
spec = ILMemStackAlloc(&(image->memStack), ILMethodSpec);
if(!spec)
{
return 0;
}
/* Set the MethodSpec information fields */
spec->programItem.image = image;
spec->method = method;
spec->type = type;
spec->typeBlob = 0;
/* Assign a token code to the MethodSpec information block */
if(!_ILImageSetToken(image, &(spec->programItem), token,
IL_META_TOKEN_METHOD_SPEC))
{
return 0;
}
/* Return the MethodSpec information block to the caller */
return spec;
}
ILMember *ILMethodSpecGetMethod(ILMethodSpec *spec)
{
return spec->method;
}
ILType *ILMethodSpecGetType(ILMethodSpec *spec)
{
return spec->type;
}
void _ILMethodSpecSetTypeIndex(ILMethodSpec *spec, ILUInt32 index)
{
spec->typeBlob = index;
}
#ifdef __cplusplus
};
#endif
Index: Makefile.am
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/image/Makefile.am,v
retrieving revision 1.14
retrieving revision 1.15
diff -C2 -r1.14 -r1.15
*** Makefile.am 16 Dec 2002 02:04:41 -0000 1.14
--- Makefile.am 18 Feb 2003 05:25:08 -0000 1.15
***************
*** 12,15 ****
--- 12,16 ----
debug_writer.c \
errors.c \
+ generic.c \
image.c \
item.c \
Index: image.h
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/image/image.h,v
retrieving revision 1.19
retrieving revision 1.20
diff -C2 -r1.19 -r1.20
*** image.h 8 Feb 2003 04:24:29 -0000 1.19
--- image.h 18 Feb 2003 05:25:08 -0000 1.20
***************
*** 734,737 ****
--- 734,749 ----
#define IL_OFFSET_NESTEDCLASS_PARENT 1
+ #define IL_OFFSET_GENERICPAR_NUMBER 0
+ #define IL_OFFSET_GENERICPAR_FLAGS 1
+ #define IL_OFFSET_GENERICPAR_OWNER 2
+ #define IL_OFFSET_GENERICPAR_NAME 3
+ #define IL_OFFSET_GENERICPAR_KIND 4
+ #define IL_OFFSET_GENERICPAR_CONSTRAINT 5
+
+ #define IL_OFFSET_METHODSPEC_METHOD 0
+ #define IL_OFFSET_METHODSPEC_INST_RAW 1
+ #define IL_OFFSET_METHODSPEC_INST 2
+ #define IL_OFFSET_METHODSPEC_INST_LEN 3
+
/*
* Get the raw data associated with a particular token.
Index: meta_build.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/image/meta_build.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -C2 -r1.19 -r1.20
*** meta_build.c 14 Feb 2003 23:55:49 -0000 1.19
--- meta_build.c 18 Feb 2003 05:25:08 -0000 1.20
***************
*** 2276,2279 ****
--- 2276,2363 ----
}
+ /*
+ * Load a generic parameter token.
+ */
+ static int Load_GenericPar(ILImage *image, ILUInt32 *values,
+ ILUInt32 *valuesNext,
ILToken token,
+ void *userData)
+ {
+ ILProgramItem *owner;
+ ILGenericPar *genPar;
+
+ /* Get the owner */
+ owner = ILProgramItem_FromToken(image,
values[IL_OFFSET_GENERICPAR_OWNER]);
+ if(!owner)
+ {
+ META_VAL_ERROR("invalid generic parameter owner");
+ return IL_LOADERR_BAD_META;
+ }
+
+ /* Generate the generic parameter record */
+ genPar = ILGenericParCreate
+ (image, token, owner,
values[IL_OFFSET_GENERICPAR_NUMBER]);
+ if(!genPar)
+ {
+ return IL_LOADERR_MEMORY;
+ }
+
+ /* Set the record's properties */
+ genPar->flags = (ILUInt16)(values[IL_OFFSET_GENERICPAR_FLAGS]);
+ if(!ILGenericParSetName(genPar, ILImageGetString
+ (image, values[IL_OFFSET_GENERICPAR_NAME])))
+ {
+ return IL_LOADERR_MEMORY;
+ }
+ ILGenericParSetKind(genPar, ILProgramItem_FromToken
+ (image, values[IL_OFFSET_GENERICPAR_KIND]));
+ ILGenericParSetConstraint(genPar, ILProgramItem_FromToken
+ (image, values[IL_OFFSET_GENERICPAR_CONSTRAINT]));
+
+ /* Done */
+ return 0;
+ }
+
+ /*
+ * Load a method specification token.
+ */
+ static int Load_MethodSpec(ILImage *image, ILUInt32 *values,
+ ILUInt32 *valuesNext,
ILToken token,
+ void *userData)
+ {
+ ILMember *method;
+ ILType *signature;
+ ILMethodSpec *spec;
+
+ /* Get the method */
+ method = ILMember_FromToken(image, values[IL_OFFSET_METHODSPEC_METHOD]);
+ if(!method)
+ {
+ META_VAL_ERROR("invalid method spec owner");
+ return IL_LOADERR_BAD_META;
+ }
+
+ /* Get the signature instantiation information */
+ signature =
+ ILTypeFromMethodDefSig(image->context, image,
+
values[IL_OFFSET_METHODSPEC_INST],
+
values[IL_OFFSET_METHODSPEC_INST_LEN]);
+ if(!signature)
+ {
+ META_VAL_ERROR("invalid method spec signature");
+ return IL_LOADERR_BAD_META;
+ }
+
+ /* Generate the method specification record */
+ spec = ILMethodSpecCreate(image, token, method, signature);
+ if(!spec)
+ {
+ return IL_LOADERR_MEMORY;
+ }
+ _ILMethodSpecSetTypeIndex(spec, values[IL_OFFSET_METHODSPEC_INST_RAW]);
+
+ /* Done */
+ return 0;
+ }
+
int _ILImageBuildMetaStructures(ILImage *image, const char *filename,
int loadFlags)
***************
*** 2363,2366 ****
--- 2447,2458 ----
EXIT_IF_ERROR(LoadTokens(image, IL_META_TOKEN_CUSTOM_ATTRIBUTE,
Load_CustomAttr, 0));
+
+ /* Load generic type parameters */
+ EXIT_IF_ERROR(LoadTokens(image, IL_META_TOKEN_GENERIC_PAR,
+ Load_GenericPar, 0));
+
+ /* Load generic method specifications */
+ EXIT_IF_ERROR(LoadTokens(image, IL_META_TOKEN_METHOD_SPEC,
+ Load_MethodSpec, 0));
/* Only do the following if we are pre-validating */
Index: meta_index.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/image/meta_index.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -r1.5 -r1.6
*** meta_index.c 15 Feb 2003 02:38:54 -0000 1.5
--- meta_index.c 18 Feb 2003 05:25:08 -0000 1.6
***************
*** 159,162 ****
--- 159,168 ----
END_DESC};
+ static ILUInt32 const GenericParOwner_Desc[] =
+ {1,
+ IL_META_TOKEN_TYPE_DEF,
+ IL_META_TOKEN_METHOD_DEF,
+ END_DESC};
+
/*
* Special field types.
***************
*** 303,306 ****
--- 309,319 ----
{TKREF_FIELD(TYPE_DEF), TKREF_FIELD(TYPE_DEF), END_FIELD};
+ static const ILUInt32 * const Fields_GenericPar[] =
+ {UINT16_FIELD, UINT16_FIELD, GenericParOwner_Desc,
+ STRREF_FIELD, TypeDefRefOrSpec_Desc, TypeDefRefOrSpec_Desc};
+
+ static const ILUInt32 * const Fields_MethodSpec[] =
+ {MethodDefOrRef_Desc, BLOBREF_FIELD};
+
/*
* Table of all field description types.
***************
*** 349,354 ****
Fields_ManifestResource, /* 28 */
Fields_NestedClass,
! 0,
! 0,
0,
0,
--- 362,367 ----
Fields_ManifestResource, /* 28 */
Fields_NestedClass,
! Fields_GenericPar,
! Fields_MethodSpec,
0,
0,
Index: meta_types.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/image/meta_types.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -r1.6 -r1.7
*** meta_types.c 8 Aug 2002 07:32:13 -0000 1.6
--- meta_types.c 18 Feb 2003 05:25:08 -0000 1.7
***************
*** 490,498 ****
/* Not reached */
default:
{
! /* Probably a method or property */
if((type1->kind__ & 0xFF) == IL_TYPE_COMPLEX_PROPERTY ||
! (type1->kind__ & IL_TYPE_COMPLEX_METHOD) != 0)
{
/* Check the property or method signature */
--- 490,506 ----
/* Not reached */
+ case IL_TYPE_COMPLEX_MVAR:
+ case IL_TYPE_COMPLEX_VAR:
+ {
+ return (ILType_VarNum(type1) == ILType_VarNum(type2));
+ }
+ /* Not reached */
+
default:
{
! /* Probably a method, property, or generic type
specification */
if((type1->kind__ & 0xFF) == IL_TYPE_COMPLEX_PROPERTY ||
! (type1->kind__ & IL_TYPE_COMPLEX_METHOD) != 0 ||
! (type1->kind__ & 0xFF) == IL_TYPE_COMPLEX_WITH)
{
/* Check the property or method signature */
***************
*** 546,549 ****
--- 554,558 ----
{
char *name;
+ char *elemName;
ILClass *info;
int len;
***************
*** 551,554 ****
--- 560,565 ----
char numbuf[80];
ILType *elemType;
+ unsigned long numParams;
+ unsigned long param;
/* Strip unnecessary prefixes from the type */
***************
*** 745,751 ****
case IL_TYPE_COMPLEX_METHOD:
{
! /* TODO */
}
! break;
default: break;
--- 756,833 ----
case IL_TYPE_COMPLEX_METHOD:
{
! name = ILTypeToName(ILTypeGetReturn(type));
! if(ILType_HasThis(type))
! {
! name = AppendString(name, " * instance
(");
! }
! else
! {
! name = AppendString(name, " * (");
! }
! numParams = ILTypeNumWithParams(type);
! for(param = 1; param <= numParams; ++param)
! {
! if(param != 1)
! {
! name = AppendString(name, ", ");
! }
! elemType = ILTypeGetParam(type, param);
! elemName = ILTypeToName(elemType);
! if(!elemName)
! {
! if(name)
! {
! ILFree(name);
! }
! return 0;
! }
! name = AppendString(name, elemName);
! ILFree(elemName);
! }
! return AppendString(name, ")");
! }
! /* Not reached */
!
! case IL_TYPE_COMPLEX_WITH:
! {
! name = ILTypeToName(ILTypeGetWithMain(type));
! name = AppendString(name, "<");
! numParams = ILTypeNumWithParams(type);
! for(param = 1; param <= numParams; ++param)
! {
! if(param != 1)
! {
! name = AppendString(name, ", ");
! }
! elemType = ILTypeGetWithParam(type,
param);
! elemName = ILTypeToName(elemType);
! if(!elemName)
! {
! if(name)
! {
! ILFree(name);
! }
! return 0;
! }
! name = AppendString(name, elemName);
! ILFree(elemName);
! }
! return AppendString(name, ">");
}
! /* Not reached */
!
! case IL_TYPE_COMPLEX_MVAR:
! {
! sprintf(numbuf, "!!%d", ILType_VarNum(type));
! return ILDupString(numbuf);
! }
! /* Not reached */
!
! case IL_TYPE_COMPLEX_VAR:
! {
! sprintf(numbuf, "!%d", ILType_VarNum(type));
! return ILDupString(numbuf);
! }
! /* Not reached */
default: break;
***************
*** 1139,1142 ****
--- 1221,1277 ----
}
return 0;
+ }
+
+ ILType *ILTypeCreateVarNum(ILContext *context, int kind, int num)
+ {
+ ILType *type = ILMemPoolCalloc(&(context->typePool), ILType);
+ if(type)
+ {
+ type->kind__ = kind;
+ type->un.num__ = num;
+ }
+ return type;
+ }
+
+ ILType *ILTypeCreateWith(ILContext *context, ILType *mainType)
+ {
+ ILType *type = ILMemPoolCalloc(&(context->typePool), ILType);
+ if(type)
+ {
+ type->kind__ = IL_TYPE_COMPLEX_WITH;
+ type->num__ = 0;
+ type->un.method__.retType__ = mainType;
+ }
+ return type;
+ }
+
+ int ILTypeAddWithParam(ILContext *context, ILType *type, ILType *paramType)
+ {
+ return ILTypeAddParam(context, type, paramType);
+ }
+
+ unsigned long ILTypeNumWithParams(ILType *type)
+ {
+ return ILTypeNumParams(type);
+ }
+
+ ILType *ILTypeGetWithParam(ILType *type, unsigned long num)
+ {
+ return ILTypeGetParam(type, num);
+ }
+
+ ILType *ILTypeGetWithParamWithPrefixes(ILType *type, unsigned long num)
+ {
+ return ILTypeGetParamWithPrefixes(type, num);
+ }
+
+ ILType *ILTypeGetWithMain(ILType *type)
+ {
+ return ILTypeGetReturn(type);
+ }
+
+ ILType *ILTypeGetWithMainWithPrefixes(ILType *type)
+ {
+ return ILTypeGetReturnWithPrefixes(type);
}
Index: meta_writer.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/image/meta_writer.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -r1.6 -r1.7
*** meta_writer.c 30 Jul 2002 04:27:03 -0000 1.6
--- meta_writer.c 18 Feb 2003 05:25:08 -0000 1.7
***************
*** 646,649 ****
--- 646,675 ----
/*
+ * Format a GenericPar token.
+ */
+ static void Format_GenericPar(ILWriter *writer, ILImage *image,
+ ILUInt32 *values, ILGenericPar
*genPar)
+ {
+ values[IL_OFFSET_GENERICPAR_NUMBER] = genPar->number;
+ values[IL_OFFSET_GENERICPAR_FLAGS] = genPar->flags;
+ values[IL_OFFSET_GENERICPAR_OWNER] = genPar->ownedItem.owner->token;
+ values[IL_OFFSET_GENERICPAR_NAME] = GetPersistString(image,
genPar->name);
+ values[IL_OFFSET_GENERICPAR_KIND] =
+ (genPar->kind ? genPar->kind->token : 0);
+ values[IL_OFFSET_GENERICPAR_CONSTRAINT] =
+ (genPar->constraint ? genPar->constraint->token : 0);
+ }
+
+ /*
+ * Format a MethodSpec token.
+ */
+ static void Format_MethodSpec(ILWriter *writer, ILImage *image,
+ ILUInt32 *values, ILMethodSpec *spec)
+ {
+ values[IL_OFFSET_METHODSPEC_METHOD] = spec->method->programItem.token;
+ values[IL_OFFSET_METHODSPEC_INST_RAW] = spec->typeBlob;
+ }
+
+ /*
* Array of all formatting routines for the known token types.
*/
***************
*** 693,698 ****
(ILFormatFunc)Format_ManifestResource, /* 28 */
(ILFormatFunc)Format_NestedClass,
! 0,
! 0,
0,
0,
--- 719,724 ----
(ILFormatFunc)Format_ManifestResource, /* 28 */
(ILFormatFunc)Format_NestedClass,
! (ILFormatFunc)Format_GenericPar,
! (ILFormatFunc)Format_MethodSpec,
0,
0,
***************
*** 857,860 ****
--- 883,903 ----
/*
+ * Write signature information for a method specification.
+ */
+ static int SigWrite_MethodSpec(ILMethodSpec *spec)
+ {
+ if(spec->type && !(spec->typeBlob))
+ {
+ spec->typeBlob =
+ ILTypeToMethodSig(spec->programItem.image, spec->type);
+ if(!(spec->typeBlob))
+ {
+ return 0;
+ }
+ }
+ return 1;
+ }
+
+ /*
* Array of all signature writing routines for the known token types.
*/
***************
*** 904,908 ****
0,
0,
! 0,
0,
0,
--- 947,951 ----
0,
0,
! (ILSigWriteFunc)SigWrite_MethodSpec,
0,
0,
***************
*** 1228,1232 ****
0,
/* 28 */
(ILSortFunc)Sort_NestedClass,
! 0,
0,
0,
--- 1271,1275 ----
0,
/* 28 */
(ILSortFunc)Sort_NestedClass,
! (ILSortFunc)Sort_OwnedItem,
0,
0,
Index: opdef.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/image/opdef.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -r1.4 -r1.5
*** opdef.c 4 Jan 2003 00:44:33 -0000 1.4
--- opdef.c 18 Feb 2003 05:25:08 -0000 1.5
***************
*** 207,213 ****
OPDEF("stelem.ref", 3, 0, IL_OPCODE_ARGS_NONE, 1)
! OPDEF("unused_A3", 0, 0, IL_OPCODE_ARGS_INVALID, 1)
! OPDEF("unused_A4", 0, 0, IL_OPCODE_ARGS_INVALID, 1)
! OPDEF("unused_A5", 0, 0, IL_OPCODE_ARGS_INVALID, 1)
OPDEF("unused_A6", 0, 0, IL_OPCODE_ARGS_INVALID, 1)
OPDEF("unused_A7", 0, 0, IL_OPCODE_ARGS_INVALID, 1)
--- 207,214 ----
OPDEF("stelem.ref", 3, 0, IL_OPCODE_ARGS_NONE, 1)
! OPDEF("ldelem", 2, 1, IL_OPCODE_ARGS_TOKEN, 5)
! OPDEF("stelem", 3, 0, IL_OPCODE_ARGS_TOKEN, 5)
! OPDEF("unbox.any", 1, 1, IL_OPCODE_ARGS_TOKEN, 5)
!
OPDEF("unused_A6", 0, 0, IL_OPCODE_ARGS_INVALID, 1)
OPDEF("unused_A7", 0, 0, IL_OPCODE_ARGS_INVALID, 1)
Index: program.h
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/image/program.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -C2 -r1.12 -r1.13
*** program.h 14 Feb 2003 00:48:46 -0000 1.12
--- program.h 18 Feb 2003 05:25:08 -0000 1.13
***************
*** 246,250 ****
#define IL_META_TYPEDEF_COMPLETE 0x40000000 /*
Definition is complete */
#define IL_META_TYPEDEF_CCTOR_ONCE 0x20000000 /*
.cctor already done */
! #define IL_META_TYPEDEF_SYSTEM_MASK 0xE0000000 /*
System flags */
/*
--- 246,251 ----
#define IL_META_TYPEDEF_COMPLETE 0x40000000 /*
Definition is complete */
#define IL_META_TYPEDEF_CCTOR_ONCE 0x20000000 /*
.cctor already done */
! #define IL_META_TYPEDEF_GENERIC_PARS 0x10000000 /* Has generic
parameters */
! #define IL_META_TYPEDEF_SYSTEM_MASK 0xF0000000 /*
System flags */
/*
***************
*** 619,622 ****
--- 620,654 ----
};
+
+ /*
+ * Information about a generic parameter.
+ */
+ struct _tagILGenericPar
+ {
+ ILOwnedItem ownedItem; /* Parent class
fields */
+ ILUInt16 number; /* Parameter
number */
+ ILUInt16 flags; /* Parameter
flags */
+ const char *name; /* Parameter name */
+ ILProgramItem *kind; /* Parameter kind */
+ ILProgramItem *constraint; /* Parameter constraint
*/
+
+ };
+
+ /*
+ * Information about a generic method specification.
+ */
+ struct _tagILMethodSpec
+ {
+ ILProgramItem programItem; /* Parent class fields */
+ ILMember *method; /* Method specification
applies to */
+ ILType *type; /* Instantiation
information */
+ ILUInt32 typeBlob; /* Blob offset
of the type */
+
+ };
+
+ /*
+ * Set the value of a MethodSpec type to an explicit blob index.
+ */
+ void _ILMethodSpecSetTypeIndex(ILMethodSpec *spec, ILUInt32 index);
#ifdef __cplusplus
Index: sig_parse.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/image/sig_parse.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -r1.6 -r1.7
*** sig_parse.c 15 May 2002 00:18:01 -0000 1.6
--- sig_parse.c 18 Feb 2003 05:25:08 -0000 1.7
***************
*** 135,138 ****
--- 135,139 ----
ILType *modifiers = 0;
ILType *type = 0;
+ ILType *tempType;
ILClass *info;
int sigKind;
***************
*** 361,364 ****
--- 362,448 ----
break;
+ case IL_META_ELEMTYPE_WITH:
+ {
+ /* Parse a generic type with parameters */
+ if(depth > 0)
+ {
+ /* Parse the main "with" type */
+ tempType = ParseElemType(context, image, reader,
+
depth - 1, categories);
+ if(tempType == ILType_Invalid)
+ {
+ return 0;
+ }
+ type = ILTypeCreateWith(context, tempType);
+ if(!type)
+ {
+ return 0;
+ }
+
+ /* Get the number of parameters */
+ if(!(reader->error) && reader->len > 0)
+ {
+ value = *((reader->data)++);
+ --(reader->len);
+ }
+ else
+ {
+ reader->error = 1;
+ return 0;
+ }
+
+ /* Parse the type parameters */
+ while(value > 0)
+ {
+ tempType = ParseElemType(context,
image, reader,
+
depth - 1, categories);
+ if(tempType == ILType_Invalid)
+ {
+ return 0;
+ }
+ if(!ILTypeAddWithParam(context, type,
tempType))
+ {
+ return 0;
+ }
+ --value;
+ }
+ }
+ }
+ break;
+
+ case IL_META_ELEMTYPE_MVAR:
+ {
+ /* Parse a generic method variable reference */
+ if(!(reader->error) && reader->len > 0)
+ {
+ value = *((reader->data)++);
+ --(reader->len);
+ type = ILTypeCreateVarNum
+ (context, IL_META_ELEMTYPE_MVAR,
(int)value);
+ }
+ else
+ {
+ reader->error = 1;
+ }
+ }
+ break;
+
+ case IL_META_ELEMTYPE_VAR:
+ {
+ /* Parse a generic class variable reference */
+ if(!(reader->error) && reader->len > 0)
+ {
+ value = *((reader->data)++);
+ --(reader->len);
+ type = ILTypeCreateVarNum
+ (context, IL_META_ELEMTYPE_VAR,
(int)value);
+ }
+ else
+ {
+ reader->error = 1;
+ }
+ }
+ break;
+
default: break;
}
***************
*** 382,385 ****
--- 466,470 ----
{
unsigned long sigKind;
+ unsigned long numGenericParams;
unsigned long numParams;
unsigned long param;
***************
*** 401,405 ****
--- 486,507 ----
case IL_META_CALLCONV_VARARG:
case IL_META_CALLCONV_UNMGD:
+ case IL_META_CALLCONV_INSTANTIATION:
{
+ /* Parse the number of generic parameters */
+ if((sigKind & IL_META_CALLCONV_GENERIC) != 0)
+ {
+ numGenericParams = ILMetaUncompressData(reader);
+ if(numGenericParams > (unsigned long)0xFF)
+ {
+ /* Cannot have this many parameters,
because "with"
+ types use a single byte for
parameter counts */
+ break;
+ }
+ }
+ else
+ {
+ numGenericParams = 0;
+ }
+
/* Parse the number of method parameters */
numParams = ILMetaUncompressData(reader);
***************
*** 418,427 ****
/* Parse the return type */
! type = ParseElemType(context, image, reader, depth - 1,
! CATEGORY_CMOD
| CATEGORY_VOID |
!
CATEGORY_TYPEDBYREF | CATEGORY_BYREF);
! if(type == ILType_Invalid)
{
! break;
}
--- 520,538 ----
/* Parse the return type */
! if((sigKind & IL_META_CALLCONV_MASK) !=
! IL_META_CALLCONV_INSTANTIATION)
{
! type = ParseElemType(context, image, reader,
depth - 1,
!
CATEGORY_CMOD | CATEGORY_VOID |
!
CATEGORY_TYPEDBYREF | CATEGORY_BYREF);
! if(type == ILType_Invalid)
! {
! break;
! }
! }
! else
! {
! /* Instantiation signatures don't have return
types */
! type = ILType_Invalid;
}
***************
*** 433,436 ****
--- 544,548 ----
}
ILTypeSetCallConv(type, sigKind);
+ ILType_SetNumGen(type, numGenericParams);
/* Parse the parameters */
Index: sig_writer.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/image/sig_writer.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -r1.5 -r1.6
*** sig_writer.c 12 Dec 2002 04:02:10 -0000 1.5
--- sig_writer.c 18 Feb 2003 05:25:08 -0000 1.6
***************
*** 513,516 ****
--- 513,545 ----
/* Not reached */
+ case IL_TYPE_COMPLEX_WITH:
+ {
+ /* Write out a generic type with parameters */
+ SIG_WRITE(IL_META_ELEMTYPE_WITH);
+ if(!WriteType(buffer,
type->un.method__.retType__, 1))
+ {
+ return 0;
+ }
+ SIG_WRITE(type->num__);
+ return WriteMethodParams(buffer, type);
+ }
+ /* Not reached */
+
+ case IL_TYPE_COMPLEX_MVAR:
+ {
+ SIG_WRITE(IL_META_ELEMTYPE_MVAR);
+ SIG_WRITE((unsigned char)(ILType_VarNum(type)));
+ return 1;
+ }
+ /* Not reached */
+
+ case IL_TYPE_COMPLEX_VAR:
+ {
+ SIG_WRITE(IL_META_ELEMTYPE_VAR);
+ SIG_WRITE((unsigned char)(ILType_VarNum(type)));
+ return 1;
+ }
+ /* Not reached */
+
case IL_TYPE_COMPLEX_METHOD:
case (IL_TYPE_COMPLEX_METHOD |
IL_TYPE_COMPLEX_METHOD_SENTINEL):
***************
*** 525,528 ****
--- 554,567 ----
SIG_WRITE(ILType_CallConv(type));
+ /* Write the number of generic parameters */
+ if((ILType_CallConv(type) &
IL_META_CALLCONV_GENERIC) != 0)
+ {
+ if(!WriteValue
+ (buffer, (unsigned
long)(ILType_NumGen(type))))
+ {
+ return 0;
+ }
+ }
+
/* Write the number of parameters */
if((type->kind__ &
IL_TYPE_COMPLEX_METHOD_SENTINEL) != 0)
***************
*** 543,549 ****
/* Write the return type */
! if(!WriteType(buffer,
type->un.method__.retType__, 1))
{
! return 0;
}
--- 582,592 ----
/* Write the return type */
! if((ILType_CallConv(type) &
IL_META_CALLCONV_MASK) !=
! IL_META_CALLCONV_INSTANTIATION)
{
! if(!WriteType(buffer,
type->un.method__.retType__, 1))
! {
! return 0;
! }
}
Index: test_macros.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/image/test_macros.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -r1.8 -r1.9
*** test_macros.c 1 Jul 2002 13:43:24 -0000 1.8
--- test_macros.c 18 Feb 2003 05:25:08 -0000 1.9
***************
*** 434,437 ****
--- 434,455 ----
}
+ void TestGenericParMacros(ILGenericPar *genPar)
+ {
+ IGNORE(ILGenericPar_Token(genPar));
+ IGNORE(ILGenericPar_Number(genPar));
+ IGNORE(ILGenericPar_Flags(genPar));
+ IGNORE(ILGenericPar_Owner(genPar));
+ IGNORE(ILGenericPar_Name(genPar));
+ IGNORE(ILGenericPar_Kind(genPar));
+ IGNORE(ILGenericPar_Constraint(genPar));
+ }
+
+ void TestMethodSpecMacros(ILMethodSpec *spec)
+ {
+ IGNORE(ILMethodSpec_Token(spec));
+ IGNORE(ILMethodSpec_Method(spec));
+ IGNORE(ILMethodSpec_Type(spec));
+ }
+
#ifdef __cplusplus
};
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Dotgnu-pnet-commits] CVS: pnet/image generic.c,NONE,1.1 Makefile.am,1.14,1.15 image.h,1.19,1.20 meta_build.c,1.19,1.20 meta_index.c,1.5,1.6 meta_types.c,1.6,1.7 meta_writer.c,1.6,1.7 opdef.c,1.4,1.5 program.h,1.12,1.13 sig_parse.c,1.6,1.7 sig_writer.c,1.5,1.6 test_macros.c,1.8,1.9,
Rhys Weatherley <address@hidden> <=
- Prev by Date:
[Dotgnu-pnet-commits] CVS: pnet/ilasm ilasm_build.c,1.19,1.20 ilasm_build.h,1.7,1.8 ilasm_grammar.y,1.29,1.30 ilasm_scanner.l,1.10,1.11
- Next by Date:
[Dotgnu-pnet-commits] CVS: pnet/ilasm ilasm_scanner.l,1.11,1.12
- Previous by thread:
[Dotgnu-pnet-commits] CVS: pnet/ilasm ilasm_build.c,1.19,1.20 ilasm_build.h,1.7,1.8 ilasm_grammar.y,1.29,1.30 ilasm_scanner.l,1.10,1.11
- Next by thread:
[Dotgnu-pnet-commits] CVS: pnet/ilasm ilasm_scanner.l,1.11,1.12
- Index(es):