[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[dotgnu-pnet-commits] pnet ChangeLog ilasm/ilasm_build.c ilasm/ilasm_...
From: |
Klaus Treichel |
Subject: |
[dotgnu-pnet-commits] pnet ChangeLog ilasm/ilasm_build.c ilasm/ilasm_... |
Date: |
Sun, 01 Jul 2007 16:46:41 +0000 |
CVSROOT: /cvsroot/dotgnu-pnet
Module name: pnet
Changes by: Klaus Treichel <ktreichel> 07/07/01 16:46:41
Modified files:
. : ChangeLog
ilasm : ilasm_build.c ilasm_build.h ilasm_grammar.y
image : generic.c meta_writer.c meta_types.c
Log message:
Fix handling of generic parameters and constraints in ilasm and the
image writing.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/pnet/ChangeLog?cvsroot=dotgnu-pnet&r1=1.3473&r2=1.3474
http://cvs.savannah.gnu.org/viewcvs/pnet/ilasm/ilasm_build.c?cvsroot=dotgnu-pnet&r1=1.27&r2=1.28
http://cvs.savannah.gnu.org/viewcvs/pnet/ilasm/ilasm_build.h?cvsroot=dotgnu-pnet&r1=1.13&r2=1.14
http://cvs.savannah.gnu.org/viewcvs/pnet/ilasm/ilasm_grammar.y?cvsroot=dotgnu-pnet&r1=1.45&r2=1.46
http://cvs.savannah.gnu.org/viewcvs/pnet/image/generic.c?cvsroot=dotgnu-pnet&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/pnet/image/meta_writer.c?cvsroot=dotgnu-pnet&r1=1.16&r2=1.17
http://cvs.savannah.gnu.org/viewcvs/pnet/image/meta_types.c?cvsroot=dotgnu-pnet&r1=1.16&r2=1.17
Patches:
Index: ChangeLog
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/ChangeLog,v
retrieving revision 1.3473
retrieving revision 1.3474
diff -u -b -r1.3473 -r1.3474
--- ChangeLog 1 Jul 2007 14:15:15 -0000 1.3473
+++ ChangeLog 1 Jul 2007 16:46:40 -0000 1.3474
@@ -1,3 +1,23 @@
+2007-07-01 Klaus Treichel <address@hidden>
+
+ * ilasm/ilasm_build.c: Add the function ILAsmAddGenericPars to add
+ generic parameters and their constraints to a Type or Method.
+ Use this function in ILAsmBuildNewClass now.
+
+ * ilasm/ilasm_build.h: Add the type ILAsmGenericTypeConstraint.
+ Add the prototype for ILAsmAddGenericPars.
+
+ * ilasm/ilasm_grammar.y: Sort the keywords alphabetically and add the
+ new ECMA 4 keywords. Redo the handling of generic parameters and
+ generic parameter constraints ECMA compliant. Add the override
+ directive for overriding generic virtual methods.
+
+ * image/generic.c: Set the token in the generic constraint on creation
+ so that it will be written to the metadata.
+
+ * image/meta_writer.c: Add a function to sort the generic parameters.
+ Set the major metadata version to 2 if the IL_VERSION_MAJOR is > 1.
+
2007-07-01 Ivan de Jesus Daras Tabora <address@hidden>
* csdoc/il2doc.c: Replace the code for printing the generic parameters
Index: ilasm/ilasm_build.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/ilasm/ilasm_build.c,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -b -r1.27 -r1.28
--- ilasm/ilasm_build.c 1 Jul 2007 14:15:16 -0000 1.27
+++ ilasm/ilasm_build.c 1 Jul 2007 16:46:40 -0000 1.28
@@ -253,17 +253,71 @@
}
}
-void ILAsmBuildNewClass(const char *name, ILAsmParamInfo *genericParams,
- ILClass *parent, ILUInt32 attrs)
+void ILAsmAddGenericPars(ILProgramItem *owner, ILAsmParamInfo *genericParams)
{
- ILClass *info;
- char uniqueName[64];
ILAsmParamInfo *nextGeneric;
ILUInt32 genericNum;
ILGenericPar *genPar;
+ ILAsmGenericTypeConstraint *typeConstraint;
ILProgramItem *constraint;
+
+ genericNum = 0;
+ while(genericParams != 0)
+ {
+ nextGeneric = genericParams->next;
+ genPar = ILGenericParCreate
+ (ILAsmImage, 0, owner, genericNum);
+ if(!genPar)
+ {
+ ILAsmOutOfMemory();
+ }
+ if(!ILGenericParSetName(genPar, genericParams->name))
+ {
+ ILAsmOutOfMemory();
+ }
+ ILGenericParSetFlags(genPar, IL_MAX_UINT32,
genericParams->parameterAttrs);
+
+ typeConstraint = genericParams->firstTypeConstraint;
+ while(typeConstraint)
+ {
+ ILAsmGenericTypeConstraint *nextTypeConstraint =
typeConstraint->next;
+;
+ if(typeConstraint->type)
+ {
+ if(ILType_IsClass(typeConstraint->type) ||
+ ILType_IsValueType(typeConstraint->type))
+ {
+ constraint =
+
ILToProgramItem(ILType_ToClass(typeConstraint->type));
+ }
+ else
+ {
ILTypeSpec *spec;
+ spec = ILTypeSpecCreate(ILAsmImage, 0,
typeConstraint->type);
+ if(!spec)
+ {
+ ILAsmOutOfMemory();
+ }
+ constraint = ILToProgramItem(spec);
+ }
+ ILGenericParAddConstraint(genPar, constraint);
+ }
+ ILFree(typeConstraint);
+ typeConstraint = nextTypeConstraint;
+ }
+ ILFree(genericParams);
+ genericParams = nextGeneric;
+ ++genericNum;
+ }
+}
+
+void ILAsmBuildNewClass(const char *name, ILAsmParamInfo *genericParams,
+ ILClass *parent, ILUInt32 attrs)
+{
+ ILClass *info;
+ char uniqueName[64];
+
/* Set the default parent to "System.Object" if necessary */
if(!parent &&
(attrs & IL_META_TYPEDEF_CLASS_SEMANTICS_MASK)
@@ -340,43 +394,7 @@
ILClassSetAttrs(info, ~((ILUInt32)0), attrs);
/* Add the formal generic parameters, if necessary */
- genericNum = 0;
- while(genericParams != 0)
- {
- nextGeneric = genericParams->next;
- genPar = ILGenericParCreate
- (ILAsmImage, 0, ILToProgramItem(info),
genericNum);
- if(!genPar)
- {
- ILAsmOutOfMemory();
- }
- if(!ILGenericParSetName(genPar, genericParams->name))
- {
- ILAsmOutOfMemory();
- }
- if(genericParams->type)
- {
- if(ILType_IsClass(genericParams->type) ||
- ILType_IsValueType(genericParams->type))
- {
- constraint =
-
ILToProgramItem(ILType_ToClass(genericParams->type));
- }
- else
- {
- spec = ILTypeSpecCreate(ILAsmImage, 0,
genericParams->type);
- if(!spec)
- {
- ILAsmOutOfMemory();
- }
- constraint = ILToProgramItem(spec);
- }
- ILGenericParAddConstraint(genPar, constraint);
- }
- ILFree(genericParams);
- genericParams = nextGeneric;
- ++genericNum;
- }
+ ILAsmAddGenericPars(ILToProgramItem(info), genericParams);
/* Add the previous class to the class stack */
if(classStackSize >= classStackMax)
Index: ilasm/ilasm_build.h
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/ilasm/ilasm_build.h,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -b -r1.13 -r1.14
--- ilasm/ilasm_build.h 5 May 2007 18:15:17 -0000 1.13
+++ ilasm/ilasm_build.h 1 Jul 2007 16:46:40 -0000 1.14
@@ -36,6 +36,16 @@
#define ILASM_NESTED_CLASS_SEP_STR "\377"
/*
+ * Parsed generic type constraint.
+ */
+typedef struct _tagILAsmGenericTypeConstraint ILAsmGenericTypeConstraint;
+struct _tagILAsmGenericTypeConstraint
+{
+ ILType *type;
+ ILAsmGenericTypeConstraint *next;
+};
+
+/*
* Parsed parameter information.
*/
typedef struct _tagILAsmParamInfo ILAsmParamInfo;
@@ -46,6 +56,7 @@
ILUInt32 parameterAttrs;
const char *name;
ILAsmParamInfo *next;
+ ILAsmGenericTypeConstraint *firstTypeConstraint;
};
/*
@@ -139,6 +150,11 @@
const char **namespace);
/*
+ * Add generic parameters to a type or method.
+ */
+void ILAsmAddGenericPars(ILProgramItem *owner, ILAsmParamInfo *genericParams);
+
+/*
* Create a new class and push it onto the class stack.
*/
void ILAsmBuildNewClass(const char *name, ILAsmParamInfo *genericParams,
Index: ilasm/ilasm_grammar.y
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/ilasm/ilasm_grammar.y,v
retrieving revision 1.45
retrieving revision 1.46
diff -u -b -r1.45 -r1.46
--- ilasm/ilasm_grammar.y 1 Jul 2007 14:15:16 -0000 1.45
+++ ilasm/ilasm_grammar.y 1 Jul 2007 16:46:40 -0000 1.46
@@ -249,29 +249,37 @@
}
/*
+ * Get the number of params.
+ */
+static int GetNumParams(ILAsmParamInfo *params)
+{
+ ILUInt32 numParams = 0;
+
+ while(params != 0)
+ {
+ ++numParams;
+ params = params->next;
+ }
+
+ return numParams;
+}
+
+/*
* Create a method signature type.
*/
static ILType *CreateMethodSig(ILInt64 callingConventions,
ILType *returnType,
ILAsmParamInfo
*params,
- ILAsmParamInfo
*genericParams,
+ int numGenericParams,
int freeParams)
{
ILType *type;
ILAsmParamInfo *nextParam;
- ILUInt32 numGenericParams;
/* Set the "generic" flag if there are generic parameters */
- numGenericParams = 0;
- if(genericParams)
+ if(numGenericParams > 0)
{
callingConventions |= IL_META_CALLCONV_GENERIC;
- nextParam = genericParams;
- while(nextParam != 0)
- {
- ++numGenericParams;
- nextParam = nextParam->next;
- }
}
/* Create the main method type block */
@@ -315,7 +323,7 @@
/*
* Create a method specification token.
*/
-static ILToken CreateMethodSpec(ILToken method, ILAsmParamInfo *params)
+static ILToken CreateMethodSpec(ILToken method, ILAsmParamInfo *genericParams)
{
ILMember *member;
ILType *signature;
@@ -330,7 +338,7 @@
/* Create the method instantiation signature */
signature = CreateMethodSig(IL_META_CALLCONV_INSTANTIATION,
- ILType_Invalid,
params, 0, 1);
+ ILType_Invalid,
genericParams, 0, 1);
/* Create the MethodSpec token */
spec = ILMethodSpecCreate(ILAsmImage, 0, member, signature);
@@ -675,6 +683,7 @@
*/
%union {
ILInt64 integer;
+ ILInt16 genParAttrib;
ILIntString strValue;
ILDouble real;
struct {
@@ -735,7 +744,7 @@
} datalabel;
ILAsmOutException *exception;
ILToken token;
-
+ ILAsmGenericTypeConstraint *typeConstraint;
}
/*
@@ -781,10 +790,12 @@
%token D_HASH "`.hash'"
%token D_IMAGEBASE "`.imagebase'"
%token D_IMPLICITCOM "`.implicitcom'"
+%token D_IMPORT "`.import'"
%token D_LANGUAGE "`.language'"
%token D_LIBRARY "`.library'"
%token D_LINE "`.line'"
%token D_LOCALE "`.locale'"
+%token D_LOCALIZED "`.localized'"
%token D_LOCALS "`.locals'"
%token D_MANIFESTRES "`.manifestres'"
%token D_MAXSTACK "`.maxstack'"
@@ -799,6 +810,7 @@
%token D_OVERRIDE "`.override'"
%token D_PACK "`.pack'"
%token D_PARAM "`.param'"
+%token D_PDIRECT "`.pdirect'"
%token D_PERMISSION "`.permission'"
%token D_PERMISSIONSET "`.permissionset'"
%token D_PROCESSOR "`.processor'"
@@ -820,186 +832,196 @@
/*
* Keywords.
*/
-%token K_AT "`at'"
+%token K_ABSTRACT "`abstract'"
+%token K_ALGORITHM "`algorithm'"
+%token K_ALIGNMENT "`alignment'"
+%token K_ANSI "`ansi'"
+%token K_ANY "`any'"
+%token K_ARGLIST "`arglist'"
+%token K_ARRAY "`array'"
%token K_AS "`as'"
-%token K_IMPLICITCOM "`implicitcom'"
-%token K_IMPLICITRES "`implicitres'"
-%token K_NOAPPDOMAIN "`noappdomain'"
-%token K_NOPROCESS "`noprocess'"
-%token K_NOMACHINE "`nomachine'"
-%token K_EXTERN "`extern'"
-%token K_INSTANCE "`instance'"
-%token K_EXPLICIT "`explicit'"
-%token K_DEFAULT "`default'"
-%token K_VARARG "`vararg'"
-%token K_UNMANAGED "`unmanaged'"
-%token K_CDECL "`cdecl'"
-%token K_STDCALL "`stdcall'"
-%token K_THISCALL "`thiscall'"
-%token K_FASTCALL "`fastcall'"
-%token K_MARSHAL "`marshal'"
-%token K_IN "`in'"
-%token K_OUT "`out'"
-%token K_OPT "`opt'"
-%token K_LCID "`lcid'"
-%token K_RETVAL "`retval'"
-%token K_STATIC "`static'"
-%token K_PUBLIC "`public'"
-%token K_PRIVATE "`private'"
-%token K_FAMILY "`family'"
-%token K_INITONLY "`initonly'"
-%token K_RTSPECIALNAME "`rtspecialname'"
-%token K_SPECIALNAME "`specialname'"
%token K_ASSEMBLY "`assembly'"
-%token K_FAMANDASSEM "`famandassem'"
-%token K_FAMORASSEM "`famorassem'"
-%token K_PRIVATESCOPE "`privatescope'"
-%token K_LITERAL "`literal'"
-%token K_NOTSERIALIZED "`notserialized'"
-%token K_VALUE "`value'"
-%token K_NOT_IN_GC_HEAP "`not_in_gc_heap'"
-%token K_INTERFACE "`interface'"
-%token K_SEALED "`sealed'"
-%token K_ABSTRACT "`abstract'"
+%token K_ASSERT "`assert'"
+%token K_AT "`at'"
%token K_AUTO "`auto'"
-%token K_SEQUENTIAL "`sequential'"
-%token K_ANSI "`ansi'"
-%token K_UNICODE "`unicode'"
%token K_AUTOCHAR "`autochar'"
-%token K_IMPORT "`import'"
-%token K_SERIALIZABLE "`serializable'"
-%token K_NESTED "`nested'"
-%token K_LATEINIT "`lateinit'"
+%token K_BEFOREFIELDINIT "`beforefieldinit'"
+%token K_BLOB "`blob'"
+%token K_BLOB_OBJECT "`blob_object'"
+%token K_BOOL "`bool'"
+%token K_BOXED "`boxed'"
+%token K_BSTR "`bstr'"
+%token K_BYTEARRAY "`bytearray'"
+%token K_BYVALSTR "`byvalstr'"
+%token K_CALLMOSTDERIVED "`callmostderived'"
+%token K_CARRAY "`carray'"
+%token K_CATCH "`catch'"
+%token K_CDECL "`cdecl'"
+%token K_CF "`cf'"
+%token K_CHAR "`char'"
+%token K_CIL "`cil'"
+%token K_CLASS "`class'"
+%token K_CLSID "`clsid'"
+%token K_COMPILERCONTROLLED "`compilercontrolled'"
+%token K_CONST "`const'"
+%token K_CURRENCY "`currency'"
+%token K_CUSTOM "`custom'"
+%token K_DATE "`date'"
+%token K_DECIMAL "`decimal'"
+%token K_DEFAULT "`default'"
+%token K_DEMAND "`demand'"
+%token K_DENY "`deny'"
+%token K_DISABLEJITOPTIMIZER "`disablejitoptimizer'"
+%token K_ENABLEJITTRACKING "`enablejittracking'"
+%token K_ENDMAC "`endmac'"
+%token K_ENUM "`enum'"
+%token K_ERROR "`error'"
+%token K_EXPLICIT "`explicit'"
%token K_EXTENDS "`extends'"
-%token K_IMPLEMENTS "`implements'"
+%token K_EXTERN "`extern'"
+%token K_FALSE "`false'"
+%token K_FAMANDASSEM "`famandassem'"
+%token K_FAMILY "`family'"
+%token K_FAMORASSEM "`famorassem'"
+%token K_FASTCALL "`fastcall'"
+%token K_FAULT "`fault'"
+%token K_FIELD "`field'"
+%token K_FILETIME "`filetime'"
+%token K_FILTER "`filter'"
%token K_FINAL "`final'"
-%token K_VIRTUAL "`virtual'"
+%token K_FINALLY "`finally'"
+%token K_FIXED "`fixed'"
+%token K_FLOAT "`float'"
+%token K_FLOAT32 "`float32'"
+%token K_FLOAT64 "`float64'"
+%token K_FORWARDREF "`forwardref'"
+%token K_FROMUNMANAGED "`fromunmanaged'"
+%token K_FULLORIGIN "`fullorigin'"
+%token K_HANDLER "`handler'"
%token K_HIDEBYSIG "`hidebysig'"
-%token K_NEWSLOT "`newslot'"
-%token K_UNMANAGEDEXP "`unmanagedexp'"
-%token K_PINVOKEIMPL "`pinvokeimpl'"
-%token K_NOMANGLE "`nomangle'"
-%token K_OLE "`ole'"
-%token K_LASTERR "`lasterr'"
-%token K_WINAPI "`winapi'"
-%token K_NATIVE "`native'"
+%token K_HRESULT "`hresult'"
+%token K_IDISPATCH "`idispatch'"
%token K_IL "`il'"
-%token K_OPTIL "`optil'"
-%token K_MANAGED "`managed'"
-%token K_FORWARDREF "`forwardref'"
-%token K_RUNTIME "`runtime'"
-%token K_INTERNALCALL "`internalcall'"
-%token K_SYNCHRONIZED "`synchronized'"
-%token K_NOINLINING "`noinlining'"
-%token K_CUSTOM "`custom'"
-%token K_FIXED "`fixed'"
-%token K_SYSSTRING "`sysstring'"
-%token K_ARRAY "`array'"
-%token K_VARIANT "`variant'"
-%token K_CURRENCY "`currency'"
-%token K_SYSCHAR "`syschar'"
-%token K_VOID "`void'"
-%token K_BOOL "`bool'"
-%token K_INT8 "`int8'"
+%token K_IMPLEMENTS "`implements'"
+%token K_IMPLICITCOM "`implicitcom'"
+%token K_IMPLICITRES "`implicitres'"
+%token K_IMPORT "`import'"
+%token K_IN "`in'"
+%token K_INF "`inf'"
+%token K_INHERITCHECK "`inheritcheck'"
+%token K_INIT "`init'"
+%token K_INITONLY "`initonly'"
+%token K_INSTANCE "`instance'"
+%token K_INT "``int''"
%token K_INT16 "`int16'"
%token K_INT32 "`int32'"
%token K_INT64 "`int64'"
-%token K_FLOAT32 "`float32'"
-%token K_FLOAT64 "`float64'"
-%token K_ERROR "`error'"
-%token K_UNSIGNED "`unsigned'"
-%token K_DECIMAL "`decimal'"
-%token K_DATE "`date'"
-%token K_BSTR "`bstr'"
+%token K_INT8 "`int8'"
+%token K_INTERFACE "`interface'"
+%token K_INTERNALCALL "`internalcall'"
+%token K_IUNKNOWN "`iunknown'"
+%token K_JAVA "`java'"
+%token K_LASTERR "`lasterr'"
+%token K_LATEINIT "`lateinit'"
+%token K_LCID "`lcid'"
+%token K_LINKCHECK "`linkcheck'"
+%token K_LITERAL "`literal'"
%token K_LPSTR "`lpstr'"
-%token K_LPWSTR "`lpwstr'"
%token K_LPTSTR "`lptstr'"
-%token K_OBJECTREF "`objectref'"
-%token K_IUNKNOWN "`iunknown'"
-%token K_IDISPATCH "`idispatch'"
-%token K_STRUCT "`struct'"
-%token K_SAFEARRAY "`safearray'"
-%token K_INT "``int''"
-%token K_BYVALSTR "`byvalstr'"
-%token K_TBSTR "`tbstr'"
-%token K_LPVOID "`lpvoid'"
-%token K_ANY "`any'"
-%token K_FLOAT "`float'"
%token K_LPSTRUCT "`lpstruct'"
-%token K_NULL "`null'"
-%token K_VECTOR "`vector'"
-%token K_HRESULT "`hresult'"
-%token K_CARRAY "`carray'"
-%token K_USERDEFINED "`userdefined'"
-%token K_RECORD "`record'"
-%token K_FILETIME "`filetime'"
-%token K_BLOB "`blob'"
-%token K_STREAM "`stream'"
-%token K_STORAGE "`storage'"
-%token K_STREAMED_OBJECT "`streamed_object'"
-%token K_STORED_OBJECT "`stored_object'"
-%token K_BLOB_OBJECT "`blob_object'"
-%token K_CF "`cf'"
-%token K_CLSID "`clsid'"
+%token K_LPVOID "`lpvoid'"
+%token K_LPWSTR "`lpwstr'"
+%token K_MANAGED "`managed'"
+%token K_MARSHAL "`marshal'"
%token K_METHOD "`method'"
-%token K_CLASS "`class'"
-%token K_PINNED "`pinned'"
-%token K_MODREQ "`modreq'"
%token K_MODOPT "`modopt'"
-%token K_TYPEDREF "`typedref'"
-%token K_WCHAR "`wchar'"
-%token K_CHAR "`char'"
-%token K_FROMUNMANAGED "`fromunmanaged'"
-%token K_CALLMOSTDERIVED "`callmostderived'"
-%token K_BYTEARRAY "`bytearray'"
-%token K_WITH "`with'"
-%token K_INIT "`init'"
-%token K_TO "`to'"
-%token K_CATCH "`catch'"
-%token K_FILTER "`filter'"
-%token K_FINALLY "`finally'"
-%token K_FAULT "`fault'"
-%token K_HANDLER "`handler'"
-%token K_TLS "`tls'"
-%token K_FIELD "`field'"
-%token K_REQUEST "`request'"
-%token K_DEMAND "`demand'"
-%token K_ASSERT "`assert'"
-%token K_DENY "`deny'"
+%token K_MODREQ "`modreq'"
+%token K_NAN "`nan'"
+%token K_NATIVE "`native'"
+%token K_NESTED "`nested'"
+%token K_NEWSLOT "`newslot'"
+%token K_NOAPPDOMAIN "`noappdomain'"
+%token K_NOINLINING "`noinlining'"
+%token K_NOMACHINE "`nomachine'"
+%token K_NOMANGLE "`nomangle'"
+%token K_NOMETADATA "`nometadata'"
+%token K_NONCASDEMAND "`noncasdemand'"
+%token K_NONCASINHERITANCE "`noncasinheritance'"
+%token K_NONCASLINKDEMAND "`noncaslinkdemand'"
+%token K_NOPROCESS "`noprocess'"
+%token K_NOT_IN_GC_HEAP "`not_in_gc_heap'"
+%token K_NOTREMOTABLE "`notremotable'"
+%token K_NOTSERIALIZED "`notserialized'"
+%token K_NULL "`null'"
+%token K_NULLREF "`nullref'"
+%token K_OBJECT "`object'"
+%token K_OBJECTREF "`objectref'"
+%token K_OLE "`ole'"
+%token K_OPT "`opt'"
+%token K_OPTIL "`optil'"
+%token K_OUT "`out'"
%token K_PERMITONLY "`permitonly'"
-%token K_LINKCHECK "`linkcheck'"
-%token K_INHERITCHECK "`inheritcheck'"
+%token K_PINNED "`pinned'"
+%token K_PINVOKEIMPL "`pinvokeimpl'"
+%token K_PREJITDENY "`prejitdeny'"
+%token K_PREJITGRANT "`prejitgrant'"
+%token K_PRESERVESIG "`preservesig'"
+%token K_PRIVATE "`private'"
+%token K_PRIVATESCOPE "`privatescope'"
+%token K_PROTECTED "`protected'"
+%token K_PUBLIC "`public'"
+%token K_PUBLICKEY "`publickey'"
+%token K_READONLY "`readonly'"
+%token K_RECORD "`record'"
%token K_REQMIN "`reqmin'"
%token K_REQOPT "`reqopt'"
%token K_REQREFUSE "`reqrefuse'"
-%token K_PREJITGRANT "`prejitgrant'"
-%token K_PREJITDENY "`prejitdeny'"
-%token K_NONCASDEMAND "`noncasdemand'"
-%token K_NONCASLINKDEMAND "`noncaslinkdemand'"
-%token K_NONCASINHERITANCE "`noncasinheritance'"
-%token K_READONLY "`readonly'"
-%token K_NOMETADATA "`nometadata'"
-%token K_ALGORITHM "`algorithm'"
-%token K_FULLORIGIN "`fullorigin'"
-%token K_NAN "`nan'"
-%token K_INF "`inf'"
-%token K_PUBLICKEY "`publickey'"
-%token K_ENABLEJITTRACKING "`enablejittracking'"
-%token K_DISABLEJITOPTIMIZER "`disablejitoptimizer'"
-%token K_PRESERVESIG "`preservesig'"
-%token K_BEFOREFIELDINIT "`beforefieldinit'"
-%token K_COMPILERCONTROLLED "`compilercontrolled'"
-%token K_CIL "`cil'"
-%token K_VALUETYPE "`valuetype'"
-%token K_BOXED "`boxed'"
-%token K_STRING "`string'"
-%token K_OBJECT "`object'"
-%token K_ALIGNMENT "`alignment'"
%token K_REQSECOBJ "`reqsecobj'"
+%token K_REQUEST "`request'"
+%token K_RETVAL "`retval'"
+%token K_RTSPECIALNAME "`rtspecialname'"
+%token K_RUNTIME "`runtime'"
+%token K_SAFEARRAY "`safearray'"
+%token K_SEALED "`sealed'"
+%token K_SEQUENTIAL "`sequential'"
+%token K_SERIALIZABLE "`serializable'"
+%token K_SPECIAL "`special'"
+%token K_SPECIALNAME "`specialname'"
+%token K_STATIC "`static'"
+%token K_STDCALL "`stdcall'"
+%token K_STORAGE "`storage'"
+%token K_STORED_OBJECT "`stored_object'"
+%token K_STREAM "`stream'"
+%token K_STREAMED_OBJECT "`streamed_object'"
+%token K_STRING "`string'"
+%token K_STRUCT "`struct'"
+%token K_SYNCHRONIZED "`synchronized'"
+%token K_SYSCHAR "`syschar'"
+%token K_SYSSTRING "`sysstring'"
+%token K_TBSTR "`tbstr'"
+%token K_THISCALL "`thiscall'"
+%token K_TLS "`tls'"
+%token K_TO "`to'"
%token K_TRUE "`true'"
-%token K_FALSE "`false'"
-%token K_JAVA "`java'"
-%token K_NULLREF "`nullref'"
+%token K_TYPEDREF "`typedref'"
+%token K_UNICODE "`unicode'"
+%token K_UNMANAGED "`unmanaged'"
+%token K_UNMANAGEDEXP "`unmanagedexp'"
+%token K_UNSIGNED "`unsigned'"
+%token K_UNUSED "`unused'"
+%token K_USERDEFINED "`userdefined'"
+%token K_VALUE "`value'"
+%token K_VALUETYPE "`valuetype'"
+%token K_VARARG "`vararg'"
+%token K_VARIANT "`variant'"
+%token K_VECTOR "`vector'"
+%token K_VIRTUAL "`virtual'"
+%token K_VOID "`void'"
+%token K_VOLATILE "`volatile'"
+%token K_WCHAR "`wchar'"
+%token K_WINAPI "`winapi'"
+%token K_WITH "`with'"
+%token K_WRAPPER "`wrapper'"
/*
* Instruction types.
@@ -1059,9 +1081,15 @@
%type <token> GenericMethodReference CustomOwner
%type <integer> DataItemCount
%type <params> FormalGenericParamsOpt FormalGenericParams
-%type <params> FormalGenericParam MethodRefGenericParamsOpt
-%type <params> MethodRefGenericParams
+%type <params> FormalGenericParam
+%type <params> MethodRefGenericParamsOpt MethodRefGenericParams
%type <type> ActualGenericParams
+%type <integer> GenericArityOpt
+%type <genParAttrib> FormalGenericParamAttribute
+%type <genParAttrib> FormalGenericParamAttributes
+%type <genParAttrib> FormalGenericParamAttributesOpt
+%type <typeConstraint> FormalGenericTypeConstraintList
+%type <typeConstraint> FormalGenericTypeConstraintsOpt
%expect 9
@@ -1375,7 +1403,7 @@
;
FormalGenericParam
- : '(' TypeSpecification ')' Identifier {
+ : FormalGenericParamAttributesOpt FormalGenericTypeConstraintsOpt
Identifier {
/* Generic parameter with a type constraint */
ILAsmParamInfo *param;
param = (ILAsmParamInfo
*)ILMalloc(sizeof(ILAsmParamInfo));
@@ -1383,32 +1411,86 @@
{
ILAsmOutOfMemory();
}
- param->type = $2.type;
- param->nativeType.string = "";
- param->nativeType.len = 0;
- param->parameterAttrs = 0;
- param->name = $4.string;
+ param->type = 0;
+ param->name = $3.string;
+ param->parameterAttrs = $1;
+ param->firstTypeConstraint = $2;
param->next = 0;
$$.paramFirst = param;
$$.paramLast = param;
}
- | Identifier {
- /* Generic parameter with no constraints */
- ILAsmParamInfo *param;
- param = (ILAsmParamInfo
*)ILMalloc(sizeof(ILAsmParamInfo));
- if(!param)
+ ;
+
+FormalGenericTypeConstraintsOpt
+ : /* empty */
{ $$ = 0; }
+ | '(' FormalGenericTypeConstraintList ')' { $$ = $2; }
+ ;
+
+FormalGenericTypeConstraintList
+ : TypeSpecification {
+ ILAsmGenericTypeConstraint *constraint;
+
+ constraint = (ILAsmGenericTypeConstraint
*)ILMalloc(sizeof(ILAsmGenericTypeConstraint));
+ if(!constraint)
{
ILAsmOutOfMemory();
}
- param->type = 0;
- param->nativeType.string = "";
- param->nativeType.len = 0;
- param->parameterAttrs = 0;
- param->name = $1.string;
- param->next = 0;
- $$.paramFirst = param;
- $$.paramLast = param;
+ constraint->type = $1.type;
+ constraint->next = 0;
+ $$ = constraint;
}
+ | FormalGenericTypeConstraintList ',' TypeSpecification {
+ ILAsmGenericTypeConstraint *constraint;
+ ILAsmGenericTypeConstraint *constraintEntry =
$1;
+
+ constraint = (ILAsmGenericTypeConstraint
*)ILMalloc(sizeof(ILAsmGenericTypeConstraint));
+ if(!constraint)
+ {
+ ILAsmOutOfMemory();
+ }
+ constraint->type = $3.type;
+ constraint->next = 0;
+ /* Append the new type at the end of the list.
*/
+ while(constraintEntry->next != 0)
+ {
+ constraintEntry = constraintEntry->next;
+ }
+ constraintEntry->next = constraint;
+ $$ = $1;
+ }
+ ;
+
+FormalGenericParamAttributesOpt
+ : /* empty */ { $$ =
IL_META_GENPARAM_NONE; }
+ | FormalGenericParamAttributes { $$ = $1; }
+ ;
+
+FormalGenericParamAttributes
+ : FormalGenericParamAttribute { $$ = $1; }
+ | FormalGenericParamAttributes FormalGenericParamAttribute {
+ if(($1 & $2) != 0)
+ {
+ yyerror("duplicate generic
parameter attribute");
+ }
+ else if(($2 & (IL_META_GENPARAM_CLASS_CONST |
+
IL_META_GENPARAM_VALUETYPE_CONST)) != 0)
+ {
+ if(($1 & (IL_META_GENPARAM_CLASS_CONST |
+
IL_META_GENPARAM_VALUETYPE_CONST)) != 0)
+ {
+ yyerror("only either class or
valuetype constraint can be specified");
+ }
+ }
+ $$ = ($1 | $2);
+ }
+ ;
+
+FormalGenericParamAttribute
+ : '+' { $$ =
IL_META_GENPARAM_COVARIANT; }
+ | '-' { $$ =
IL_META_GENPARAM_CONTRAVARIANT; }
+ | K_CLASS { $$ =
IL_META_GENPARAM_CLASS_CONST; }
+ | K_VALUETYPE { $$ =
IL_META_GENPARAM_VALUETYPE_CONST; }
+ | D_CTOR { $$ =
IL_META_GENPARAM_CTOR_CONST; }
;
ClassAttributes
@@ -1581,6 +1663,42 @@
}
}
}
+ | D_OVERRIDE K_METHOD CallingConventions Type TypeSpecification
COLON_COLON
+ MethodName GenericArityOpt '(' OptSignatureArguments
')' K_WITH
+ K_METHOD CallingConventions Type TypeSpecification
COLON_COLON
+ MethodName GenericArityOpt '(' OptSignatureArguments
')' {
+ ILType *sig;
+ ILOverride *over;
+ ILToken token;
+ ILMethod *decl;
+ ILMethod *body;
+
+ /* Create a signature block for the method to
override */
+ sig = CreateMethodSig($3, $4, $10.paramFirst,
$8, 1);
+
+ /* Create a MemberRef for the first part of the
override */
+ token = ILAsmResolveMember($5.item, $7.string,
sig,
+
IL_META_MEMBERKIND_METHOD);
+ decl = ILMethod_FromToken(ILAsmImage, token);
+
+ /* Create a signature block for the overriding
method */
+ sig = CreateMethodSig($14, $15, $21.paramFirst,
$19, 1);
+
+ /* Create a MemberRef for the second part of
the override */
+ token = ILAsmResolveMember($16.item,
$18.string, sig,
+
IL_META_MEMBERKIND_METHOD);
+ body = ILMethod_FromToken(ILAsmImage, token);
+
+ /* Create the override block */
+ if(decl && body)
+ {
+ over = ILOverrideCreate(ILAsmClass, 0,
decl, body);
+ if(!over)
+ {
+ ILAsmOutOfMemory();
+ }
+ }
+ }
;
/*
@@ -2030,12 +2148,6 @@
ILType *sig;
ILMethod *method;
ILUInt32 callConv;
- ILAsmParamInfo *genericParams;
- ILAsmParamInfo *nextGeneric;
- ILUInt32 genericNum;
- ILGenericPar *genPar;
- ILProgramItem *constraint;
- ILTypeSpec *spec;
/* Create the method definition */
callConv = (ILUInt32)($3);
@@ -2047,7 +2159,7 @@
callConv |= IL_META_CALLCONV_HASTHIS;
}
sig = CreateMethodSig(callConv, $5.type,
$9.paramFirst,
-
$7.paramFirst, 0);
+
GetNumParams($7.paramFirst), 0);
method = ILAsmMethodCreate
(ILAsmClass, $6.string,
$2.flags, sig);
ILMethodSetImplAttrs(method, ~0,
(ILUInt16)($11));
@@ -2065,45 +2177,7 @@
}
/* Add the formal generic parameters to the
method */
- genericNum = 0;
- genericParams = $7.paramFirst;
- while(genericParams != 0)
- {
- nextGeneric = genericParams->next;
- genPar = ILGenericParCreate
- (ILAsmImage, 0,
ILToProgramItem(method), genericNum);
- if(!genPar)
- {
- ILAsmOutOfMemory();
- }
- if(!ILGenericParSetName(genPar,
genericParams->name))
- {
- ILAsmOutOfMemory();
- }
- if(genericParams->type)
- {
-
if(ILType_IsClass(genericParams->type) ||
-
ILType_IsValueType(genericParams->type))
- {
- constraint =
ILToProgramItem
-
(ILType_ToClass(genericParams->type));
- }
- else
- {
- spec = ILTypeSpecCreate
- (ILAsmImage, 0,
genericParams->type);
- if(!spec)
- {
-
ILAsmOutOfMemory();
- }
- constraint =
ILToProgramItem(spec);
- }
-
ILGenericParAddConstraint(genPar, constraint);
- }
- ILFree(genericParams);
- genericParams = nextGeneric;
- ++genericNum;
- }
+ ILAsmAddGenericPars(ILToProgramItem(method),
$7.paramFirst);
/* The current scope is now the method */
ILAsmBuildPushScope(method);
@@ -2262,6 +2336,11 @@
| K_NOINLINING { $$ = IL_META_METHODIMPL_NO_INLINING; }
;
+GenericArityOpt
+ : /* empty */ { $$ = 0; }
+ | '<' '[' Integer32 ']' '>' { $$ = $3; }
+ ;
+
MethodDeclarations
: /* empty */ {
ILAsmOutFinalizeMethod((ILMethod
*)ILAsmCurrScope);
@@ -2649,7 +2728,8 @@
MethodName MethodRefGenericParamsOpt
'(' OptSignatureArguments ')' {
ILType *sig;
- sig = CreateMethodSig($1, $2, $8.paramFirst,
$6.paramFirst, 1);
+ sig = CreateMethodSig($1, $2, $8.paramFirst,
+
GetNumParams($6.paramFirst), 1);
$$ = ILAsmResolveMember($3.item, $5.string, sig,
IL_META_MEMBERKIND_METHOD);
if($6.paramFirst)
@@ -2660,8 +2740,8 @@
| CallingConventions Type MethodName MethodRefGenericParamsOpt
'(' OptSignatureArguments ')' {
/* Reference a method in the global module
class */
- ILType *sig = CreateMethodSig
- ($1, $2, $6.paramFirst,
$4.paramFirst, 1);
+ ILType *sig = CreateMethodSig($1, $2,
$6.paramFirst,
+
GetNumParams($4.paramFirst), 1);
$$ =
ILAsmResolveMember(ILToProgramItem(ILAsmModuleClass),
$3.string, sig,
IL_META_MEMBERKIND_METHOD);
@@ -2678,7 +2758,8 @@
'(' OptSignatureArguments ')' {
ILType *sig;
sig = CreateMethodSig($1 |
IL_META_CALLCONV_HASTHIS,
- $2,
$8.paramFirst, $6.paramFirst, 1);
+ $2,
$8.paramFirst,
+
GetNumParams($6.paramFirst), 1);
$$ = ILAsmResolveMember($3.item, $5.string, sig,
IL_META_MEMBERKIND_METHOD);
if($6.paramFirst)
@@ -2691,7 +2772,7 @@
/* Reference a method in the global module
class */
ILType *sig = CreateMethodSig
($1 | IL_META_CALLCONV_HASTHIS,
- $2, $6.paramFirst, $4.paramFirst,
1);
+ $2, $6.paramFirst,
GetNumParams($4.paramFirst), 1);
$$ =
ILAsmResolveMember(ILToProgramItem(ILAsmModuleClass),
$3.string, sig,
IL_META_MEMBERKIND_METHOD);
@@ -2709,37 +2790,35 @@
MethodRefGenericParams
: Type {
- ILAsmParamInfo *param;
- param = (ILAsmParamInfo
*)ILMalloc(sizeof(ILAsmParamInfo));
- if(!param)
+ ILAsmParamInfo *genericParam;
+ genericParam = (ILAsmParamInfo
*)ILMalloc(sizeof(ILAsmParamInfo));
+ if(!genericParam)
{
ILAsmOutOfMemory();
}
- param->type = $1;
- param->nativeType.string = "";
- param->nativeType.len = 0;
- param->parameterAttrs = 0;
- param->name = 0;
- param->next = 0;
- $$.paramFirst = param;
- $$.paramLast = param;
+ genericParam->type = $1;
+ genericParam->parameterAttrs = 0;
+ genericParam->name = 0;
+ genericParam->firstTypeConstraint = 0;
+ genericParam->next = 0;
+ $$.paramFirst = genericParam;
+ $$.paramLast = genericParam;
}
| MethodRefGenericParams ',' Type {
- ILAsmParamInfo *param;
- param = (ILAsmParamInfo
*)ILMalloc(sizeof(ILAsmParamInfo));
- if(!param)
+ ILAsmParamInfo *genericParam;
+ genericParam = (ILAsmParamInfo
*)ILMalloc(sizeof(ILAsmParamInfo));
+ if(!genericParam)
{
ILAsmOutOfMemory();
}
- param->type = $3;
- param->nativeType.string = "";
- param->nativeType.len = 0;
- param->parameterAttrs = 0;
- param->name = 0;
- param->next = 0;
- $1.paramLast->next = param;
+ genericParam->type = $3;
+ genericParam->parameterAttrs = 0;
+ genericParam->name = 0;
+ genericParam->firstTypeConstraint = 0;
+ genericParam->next = 0;
+ $1.paramLast->next = genericParam;
$$.paramFirst = $1.paramFirst;
- $$.paramLast = param;
+ $$.paramLast = genericParam;
}
;
@@ -3394,6 +3473,7 @@
param->nativeType.len = 0;
param->parameterAttrs = 0;
param->name = 0;
+ param->firstTypeConstraint = 0;
param->next = 0;
$$.paramFirst = param;
$$.paramLast = param;
@@ -3409,6 +3489,7 @@
param->nativeType = $2.nativeType;
param->parameterAttrs = $1;
param->name = 0;
+ param->firstTypeConstraint = 0;
param->next = 0;
$$.paramFirst = param;
$$.paramLast = param;
@@ -3424,6 +3505,7 @@
param->nativeType = $2.nativeType;
param->parameterAttrs = $1;
param->name = $3.string;
+ param->firstTypeConstraint = 0;
param->next = 0;
$$.paramFirst = param;
$$.paramLast = param;
Index: image/generic.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/image/generic.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- image/generic.c 1 Jul 2007 14:15:16 -0000 1.5
+++ image/generic.c 1 Jul 2007 16:46:41 -0000 1.6
@@ -131,6 +131,14 @@
(*last)->constraint = constraint;
(*last)->nextConstraint = 0;
+ /* Assign a token code to the GenericConstraint information block */
+ if(!_ILImageSetToken(genPar->ownedItem.programItem.image,
+
&((*last)->ownedItem.programItem), 0,
+
IL_META_TOKEN_GENERIC_CONSTRAINT))
+ {
+ return 0;
+ }
+
return (*last);
}
Index: image/meta_writer.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/image/meta_writer.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -b -r1.16 -r1.17
--- image/meta_writer.c 1 Jul 2007 14:15:16 -0000 1.16
+++ image/meta_writer.c 1 Jul 2007 16:46:41 -0000 1.17
@@ -711,7 +711,7 @@
ILGenericConstraint *genCon)
{
values[IL_OFFSET_GENERICCON_PARAM] =
- (genCon->parameter ? genCon->parameter->token : 0);
+ (genCon->parameter ? ((ILProgramItem
*)genCon->parameter)->token : 0);
values[IL_OFFSET_GENERICCON_CONSTRAINT] =
(genCon->constraint ? genCon->constraint->token : 0);
}
@@ -1295,6 +1295,54 @@
}
/*
+ * Sort the GenericPar table.
+ */
+static int Sort_GenericPar(ILGenericPar **genPar1, ILGenericPar **genPar2)
+{
+ ILToken token1 = (*genPar1)->ownedItem.owner->token;
+ ILToken token2 = (*genPar2)->ownedItem.owner->token;
+ ILToken tokenNum1 = (token1 & ~IL_META_TOKEN_MASK);
+ ILToken tokenNum2 = (token2 & ~IL_META_TOKEN_MASK);
+
+ /* Compare the bottom parts of the token first, because
+ the table must be sorted on its encoded value, not
+ on the original value. Encoded values put the token
+ type in the low order bits */
+ if(tokenNum1 < tokenNum2)
+ {
+ return -1;
+ }
+ else if(tokenNum1 > tokenNum2)
+ {
+ return 1;
+ }
+ else if(token1 < token2)
+ {
+ return -1;
+ }
+ else if(token1 > token2)
+ {
+ return 1;
+ }
+ else
+ {
+ if((*genPar1)->number < (*genPar2)->number)
+ {
+ return -1;
+ }
+ else if((*genPar1)->number > (*genPar2)->number)
+ {
+ return 1;
+ }
+ else
+ {
+ /* We never should get here. */
+ return 0;
+ }
+ }
+}
+
+/*
* Array of all sorting routines for the known token types.
*/
typedef int (*ILSortFunc)(const void *e1, const void *e2);
@@ -1341,9 +1389,9 @@
0,
0,
/* 28 */
(ILSortFunc)Sort_NestedClass,
- (ILSortFunc)Sort_OwnedItem,
- 0,
+ (ILSortFunc)Sort_GenericPar,
0,
+ (ILSortFunc)Sort_OwnedItem,
0,
0,
0,
@@ -1532,7 +1580,11 @@
/* Write the metadata index header */
IL_WRITE_UINT32(buffer, 0); /* Reserved */
+#if IL_VERSION_MAJOR > 1
+ buffer[4] = 0x02; /*
Major version */
+#else
buffer[4] = 0x01; /*
Major version */
+#endif
buffer[5] = 0x00; /*
Minor version */
buffer[6] = (unsigned char)sizeFlags; /* Section size flags */
buffer[7] = 0x00; /*
Reserved */
Index: image/meta_types.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/image/meta_types.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -b -r1.16 -r1.17
--- image/meta_types.c 10 Jul 2004 13:12:30 -0000 1.16
+++ image/meta_types.c 1 Jul 2007 16:46:41 -0000 1.17
@@ -620,6 +620,19 @@
{
return 0;
}
+#if IL_VERSION_MAJOR > 1
+ /* Check if the number of generic parameters
match */
+ if((type1->kind__ & IL_TYPE_COMPLEX_METHOD) !=
0)
+ {
+ if((ILType_CallConv(type1) &
IL_META_CALLCONV_GENERIC) != 0)
+ {
+ if(ILType_NumGen(type1) !=
ILType_NumGen(type2))
+ {
+ return 0;
+ }
+ }
+ }
+#endif
if(!ILTypeIdentical(type1->un.method__.retType__,
type2->un.method__.retType__))
{
- [dotgnu-pnet-commits] pnet ChangeLog ilasm/ilasm_build.c ilasm/ilasm_...,
Klaus Treichel <=