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

[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
  };





reply via email to

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