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 class.c,1.27,1.28 context.c,1.11,


From: Rhys Weatherley <address@hidden>
Subject: [Dotgnu-pnet-commits] CVS: pnet/image class.c,1.27,1.28 context.c,1.11,1.12 image.h,1.25,1.26 meta_build.c,1.26,1.27 meta_index.c,1.7,1.8 misc_token.c,1.5,1.6 program.h,1.18,1.19
Date: Fri, 13 Jun 2003 02:44:09 -0400

Update of /cvsroot/dotgnu-pnet/pnet/image
In directory subversions:/tmp/cvs-serv27392/image

Modified Files:
        class.c context.c image.h meta_build.c meta_index.c 
        misc_token.c program.h 
Log Message:


Load the class names before the TypeRef and TypeDef tables.


Index: class.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/image/class.c,v
retrieving revision 1.27
retrieving revision 1.28
diff -C2 -r1.27 -r1.28
*** class.c     15 May 2003 04:51:47 -0000      1.27
--- class.c     13 Jun 2003 06:44:04 -0000      1.28
***************
*** 27,31 ****
  ILClassName *_ILClassNameCreate(ILImage *image, ILToken token,
                                                                const char 
*name, const char *namespace,
!                                                               ILProgramItem 
*scope)
  {
        ILClassName *className;
--- 27,32 ----
  ILClassName *_ILClassNameCreate(ILImage *image, ILToken token,
                                                                const char 
*name, const char *namespace,
!                                                               ILProgramItem 
*scopeItem,
!                                                               ILClassName 
*scopeName)
  {
        ILClassName *className;
***************
*** 54,58 ****
                }
        }
!       className->scope = scope;
  
        /* Add the class name to the class name hash */
--- 55,60 ----
                }
        }
!       className->scope = scopeItem;
!       className->scopeName = scopeName;
  
        /* Add the class name to the class name hash */
***************
*** 95,98 ****
--- 97,124 ----
  }
  
+ ILClassName *_ILClassNameLookup(ILImage *image, ILProgramItem *scopeItem,
+                                                               ILClassName 
*scopeName, const char *name,
+                                                               const char 
*namespace)
+ {
+       ILClassKeyInfo key;
+       ILClassName *className;
+       key.name = name;
+       key.nameLen = strlen(name);
+       key.namespace = namespace;
+       key.namespaceLen = (namespace ? strlen(namespace) : 0);
+       key.scopeItem = scopeItem;
+       key.scopeName = scopeName;
+       key.image = 0;
+       key.wantGlobal = 0;
+       key.ignoreCase = 0;
+       className = ILHashFindType(image->context->classHash, &key, 
ILClassName);
+       if(className && !(className->scope) && scopeItem)
+       {
+               /* Update the scope item now that we know what it should be */
+               className->scope = scopeItem;
+       }
+       return className;
+ }
+ 
  /*
   * Add a nesting relationship between two classes.
***************
*** 203,206 ****
--- 229,234 ----
  {
        ILClass *info;
+       ILClassName *scopeName;
+       ILClass *scopeClass;
  
        /* Allocate space for the class information block */
***************
*** 216,224 ****
        info->ext = 0;
  
        /* Create the class name record */
!       info->className = _ILClassNameCreate(image, 0, name, namespace, scope);
        if(!(info->className))
        {
!               return 0;
        }
  
--- 244,269 ----
        info->ext = 0;
  
+       /* Get the name of the scope if it is a nesting parent */
+       scopeClass = ILProgramItemToClass(scope);
+       if(scopeClass)
+       {
+               scopeName = scopeClass->className;
+       }
+       else
+       {
+               scopeName = 0;
+       }
+ 
        /* Create the class name record */
!       info->className = _ILClassNameLookup
!                       (image, scope, scopeName, name, namespace);
        if(!(info->className))
        {
!               info->className = _ILClassNameCreate
!                               (image, 0, name, namespace, scope, scopeName);
!               if(!(info->className))
!               {
!                       return 0;
!               }
        }
  
***************
*** 421,425 ****
        key.namespaceLen = (info->className->namespace ?
                                                        
strlen(info->className->namespace) : 0);
!       key.scope = scope;
        key.image = image;
        key.wantGlobal = 0;
--- 466,471 ----
        key.namespaceLen = (info->className->namespace ?
                                                        
strlen(info->className->namespace) : 0);
!       key.scopeItem = scope;
!       key.scopeName = 0;
        key.image = image;
        key.wantGlobal = 0;
***************
*** 587,591 ****
        key.namespace = namespace;
        key.namespaceLen = (namespace ? strlen(namespace) : 0);
!       key.scope = scope;
        key.image = 0;
        key.wantGlobal = 0;
--- 633,638 ----
        key.namespace = namespace;
        key.namespaceLen = (namespace ? strlen(namespace) : 0);
!       key.scopeItem = scope;
!       key.scopeName = 0;
        key.image = 0;
        key.wantGlobal = 0;
***************
*** 604,608 ****
        key.namespace = namespace;
        key.namespaceLen = namespaceLen;
!       key.scope = scope;
        key.image = 0;
        key.wantGlobal = 0;
--- 651,656 ----
        key.namespace = namespace;
        key.namespaceLen = namespaceLen;
!       key.scopeItem = scope;
!       key.scopeName = 0;
        key.image = 0;
        key.wantGlobal = 0;
***************
*** 725,729 ****
  
        /* Match the scope */
!       if(key->scope && key->scope != classInfo->scope)
        {
                return 0;
--- 773,777 ----
  
        /* Match the scope */
!       if(key->scopeItem && key->scopeItem != classInfo->scope)
        {
                return 0;
***************
*** 760,764 ****
        key.namespace = (const char *)namespace;
        key.namespaceLen = namespaceLen;
!       key.scope = scope;
        key.image = 0;
        key.wantGlobal = 0;
--- 808,813 ----
        key.namespace = (const char *)namespace;
        key.namespaceLen = namespaceLen;
!       key.scopeItem = scope;
!       key.scopeName = 0;
        key.image = 0;
        key.wantGlobal = 0;
***************
*** 778,782 ****
        key.namespace = namespace;
        key.namespaceLen = (namespace ? strlen(namespace) : 0);
!       key.scope = 0;
        key.image = 0;
        key.wantGlobal = 1;
--- 827,832 ----
        key.namespace = namespace;
        key.namespaceLen = (namespace ? strlen(namespace) : 0);
!       key.scopeItem = 0;
!       key.scopeName = 0;
        key.image = 0;
        key.wantGlobal = 1;
***************
*** 795,799 ****
        key.namespace = namespace;
        key.namespaceLen = namespaceLen;
!       key.scope = 0;
        key.image = 0;
        key.wantGlobal = 1;
--- 845,850 ----
        key.namespace = namespace;
        key.namespaceLen = namespaceLen;
!       key.scopeItem = 0;
!       key.scopeName = 0;
        key.image = 0;
        key.wantGlobal = 1;
***************
*** 813,817 ****
        key.namespace = (const char *)namespace;
        key.namespaceLen = namespaceLen;
!       key.scope = 0;
        key.image = 0;
        key.wantGlobal = 1;
--- 864,869 ----
        key.namespace = (const char *)namespace;
        key.namespaceLen = namespaceLen;
!       key.scopeItem = 0;
!       key.scopeName = 0;
        key.image = 0;
        key.wantGlobal = 1;

Index: context.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/image/context.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -C2 -r1.11 -r1.12
*** context.c   28 Feb 2003 06:57:31 -0000      1.11
--- context.c   13 Jun 2003 06:44:04 -0000      1.12
***************
*** 115,119 ****
  
        /* Match the scope */
!       if(key->scope && key->scope != classInfo->scope)
        {
                return 0;
--- 115,123 ----
  
        /* Match the scope */
!       if(key->scopeItem && key->scopeItem != classInfo->scope)
!       {
!               return 0;
!       }
!       else if(key->scopeName && key->scopeName != classInfo->scopeName)
        {
                return 0;
***************
*** 127,131 ****
  
        /* Do we only want types at the global level? */
!       if(key->wantGlobal)
        {
                if((classInfo->scope->token & IL_META_TOKEN_MASK) !=
--- 131,135 ----
  
        /* Do we only want types at the global level? */
!       if(key->wantGlobal && classInfo->scope)
        {
                if((classInfo->scope->token & IL_META_TOKEN_MASK) !=

Index: image.h
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/image/image.h,v
retrieving revision 1.25
retrieving revision 1.26
diff -C2 -r1.25 -r1.26
*** image.h     15 May 2003 04:52:39 -0000      1.25
--- image.h     13 Jun 2003 06:44:04 -0000      1.26
***************
*** 95,98 ****
--- 95,99 ----
   * Key information to use when looking up an entry in the class hash.
   */
+ typedef struct _tagILClassName ILClassName;
  typedef struct
  {
***************
*** 101,105 ****
        const char         *namespace;
        int                             namespaceLen;
!       ILProgramItem  *scope;
        ILImage            *image;
        int                             wantGlobal;
--- 102,107 ----
        const char         *namespace;
        int                             namespaceLen;
!       ILProgramItem  *scopeItem;
!       ILClassName    *scopeName;
        ILImage            *image;
        int                             wantGlobal;

Index: meta_build.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/image/meta_build.c,v
retrieving revision 1.26
retrieving revision 1.27
diff -C2 -r1.26 -r1.27
*** meta_build.c        13 Jun 2003 04:33:27 -0000      1.26
--- meta_build.c        13 Jun 2003 06:44:04 -0000      1.27
***************
*** 827,831 ****
   * Find the parent of a nested class by searching the NestedClass table.
   */
! static ILProgramItem *FindNestedParent(ILImage *image, ILToken child)
  {
        ILToken left, right, middle;
--- 827,832 ----
   * Find the parent of a nested class by searching the NestedClass table.
   */
! static ILProgramItem *FindNestedParent(ILImage *image, ILToken child,
!                                                                          
ILToken *parentToken)
  {
        ILToken left, right, middle;
***************
*** 837,840 ****
--- 838,845 ----
        if(!count)
        {
+               if(parentToken)
+               {
+                       *parentToken = 0;
+               }
                return 0;
        }
***************
*** 888,900 ****
        if(parent)
        {
!               item = ILProgramItem_FromToken(image, parent);
!               if(item)
                {
!                       return item;
                }
        }
        return 0;
  }
  
  /*
   * Load a type definition token.
--- 893,1072 ----
        if(parent)
        {
!               if(parentToken)
!               {
!                       /* We want the token, but not the program item */
!                       *parentToken = parent;
!               }
!               else
!               {
!                       item = ILProgramItem_FromToken(image, parent);
!                       if(item)
!                       {
!                               return item;
!                       }
!               }
!       }
!       else if(parentToken)
!       {
!               *parentToken = 0;
!       }
!       return 0;
! }
! 
! #if 0
! 
! /*
!  * Load a type reference token.
!  */
! static int Load_TypeRef(ILImage *image, ILUInt32 *values,
!                                               ILUInt32 *valuesNext, ILToken 
token,
!                                               void *userData)
! {
!       const char *name;
!       const char *namespace;
!       ILProgramItem *scope;
!       ILClass *info;
! 
!       /* Get the TypeRef name and namespace */
!       name = ILImageGetString(image, values[IL_OFFSET_TYPEREF_NAME]);
!       namespace = ILImageGetString
!                                       (image, 
values[IL_OFFSET_TYPEREF_NAMESPACE]);
!       if(namespace && *namespace == '\0')
!       {
!               namespace = 0;
!       }
! 
!       /* Determine which scope to use to resolve the TypeRef */
!       if(values[IL_OFFSET_TYPEREF_SCOPE] != 0)
!       {
!               scope = ILProgramItem_FromToken
!                       (image, values[IL_OFFSET_TYPEREF_SCOPE]);
!       }
!       else
!       {
!               scope = ILClassGlobalScope(image);
!       }
!       if(!scope)
!       {
!               META_VAL_ERROR("invalid scope for type reference");
!               return IL_LOADERR_BAD_META;
!       }
! 
!       /* If we already have a reference locally, then reuse it */
!       info = ILClassLookup(scope, name, namespace);
!       if(info)
!       {
!               if(!_ILImageSetToken(image, &(info->programItem), token,
!                                                IL_META_TOKEN_TYPE_REF))
                {
!                       return IL_LOADERR_MEMORY;
                }
+               return 0;
        }
+ 
+       /* Create a new type reference */
+       info = ILClassCreateRef(scope, token, name, namespace);
+       if(!info)
+       {
+               return IL_LOADERR_MEMORY;
+       }
+       if(!_ILImageSetToken(image, &(info->programItem), token,
+                                        IL_META_TOKEN_TYPE_REF))
+       {
+               return IL_LOADERR_MEMORY;
+       }
+ 
+       /* The type reference has been created */
        return 0;
  }
  
+ #endif
+ 
+ /*
+  * Load a type reference name.
+  */
+ static int Load_TypeRefNameInner(ILImage *image, ILUInt32 *values,
+                                                        ILUInt32 *valuesNext, 
ILToken token,
+                                                        void *userData, 
ILClassName **nameInfo)
+ {
+       const char *name;
+       const char *namespace;
+       ILProgramItem *scope;
+       ILClassName *scopeName;
+       ILClassName *className;
+       ILToken scopeToken;
+       int error;
+ 
+       /* Get the TypeRef name and namespace */
+       name = ILImageGetString(image, values[IL_OFFSET_TYPEREF_NAME]);
+       namespace = ILImageGetString
+                                       (image, 
values[IL_OFFSET_TYPEREF_NAMESPACE]);
+       if(namespace && *namespace == '\0')
+       {
+               namespace = 0;
+       }
+ 
+       /* Determine which scope to use to resolve the TypeRef */
+       scopeToken = values[IL_OFFSET_TYPEREF_SCOPE];
+       if(scopeToken != 0)
+       {
+               if((scopeToken & IL_META_TOKEN_MASK) == IL_META_TOKEN_TYPE_REF)
+               {
+                       /* This is a nested TypeRef: find the name of the 
nesting parent */
+                       if(!_ILImageRawTokenData(image, scopeToken, values))
+                       {
+                               return IL_LOADERR_BAD_META;
+                       }
+                       scope = 0;
+                       scopeName = 0;
+                       error = Load_TypeRefNameInner
+                               (image, values, 0, scopeToken, 0, &scopeName);
+                       if(error != 0)
+                       {
+                               return error;
+                       }
+               }
+               else
+               {
+                       scope = ILProgramItem_FromToken(image, scopeToken);
+                       scopeName = 0;
+               }
+       }
+       else
+       {
+               scope = ILClassGlobalScope(image);
+               scopeName = 0;
+       }
+       if(!scope && !scopeName)
+       {
+               META_VAL_ERROR("invalid scope for type reference");
+               return IL_LOADERR_BAD_META;
+       }
+ 
+       /* Bail out if we've already seen the name before */
+       className = _ILClassNameLookup(image, scope, scopeName, name, 
namespace);
+       if(className)
+       {
+               *nameInfo = className;
+               return 0;
+       }
+ 
+       /* Create the class name information */
+       if(!_ILClassNameCreate(image, token, name, namespace, scope, scopeName))
+       {
+               return IL_LOADERR_MEMORY;
+       }
+       *nameInfo = className;
+       return 0;
+ }
+ static int Load_TypeRefName(ILImage *image, ILUInt32 *values,
+                                                   ILUInt32 *valuesNext, 
ILToken token,
+                                                   void *userData)
+ {
+       ILClassName *name;
+       return Load_TypeRefNameInner(image, values, valuesNext, token,
+                                                                userData, 
&name);
+ }
+ 
  /*
   * Load a type definition token.
***************
*** 935,939 ****
        {
                /* Nested scope */
!               scope = FindNestedParent(image, token);
        }
  
--- 1107,1111 ----
        {
                /* Nested scope */
!               scope = FindNestedParent(image, token, 0);
        }
  
***************
*** 1003,1006 ****
--- 1175,1268 ----
  
  /*
+  * Load a type definition name.
+  */
+ static int Load_TypeDefNameInner(ILImage *image, ILUInt32 *values,
+                                                        ILUInt32 *valuesNext, 
ILToken token,
+                                                        void *userData, 
ILClassName **nameInfo)
+ {
+       const char *name;
+       const char *namespace;
+       ILProgramItem *scope;
+       ILClassName *scopeName;
+       ILClassName *className;
+       ILToken parentToken;
+       int error;
+ 
+       /* Get the name and namespace for the type */
+       name = ILImageGetString(image, values[IL_OFFSET_TYPEDEF_NAME]);
+       namespace = ILImageGetString(image, 
values[IL_OFFSET_TYPEDEF_NAMESPACE]);
+       if(namespace && *namespace == '\0')
+       {
+               namespace = 0;
+       }
+ 
+       /* Determine the scope to use to define the type */
+       if((values[IL_OFFSET_TYPEDEF_ATTRS] & IL_META_TYPEDEF_VISIBILITY_MASK)
+                       < IL_META_TYPEDEF_NESTED_PUBLIC)
+       {
+               /* Global scope */
+               scope = ILClassGlobalScope(image);
+               scopeName = 0;
+       }
+       else
+       {
+               /* Nested scope */
+               FindNestedParent(image, token, &parentToken);
+               if(parentToken)
+               {
+                       if(!_ILImageRawTokenData(image, parentToken, values))
+                       {
+                               return IL_LOADERR_BAD_META;
+                       }
+                       scope = 0;
+                       scopeName = 0;
+                       error = Load_TypeDefNameInner
+                               (image, values, 0, parentToken, 0, &scopeName);
+                       if(error != 0)
+                       {
+                               return error;
+                       }
+               }
+               else
+               {
+                       scope = 0;
+                       scopeName = 0;
+               }
+       }
+ 
+       /* If we don't have a scope, then exit with an error */
+       if(!scope && !scopeName)
+       {
+               META_VAL_ERROR("unknown type definition scope");
+               return IL_LOADERR_BAD_META;
+       }
+ 
+       /* Bail out if we've already seen the name before (i.e. there is
+          both a TypeRef and a TypeDef for the same name, which is OK) */
+       className = _ILClassNameLookup(image, scope, scopeName, name, 
namespace);
+       if(className)
+       {
+               *nameInfo = className;
+               return 0;
+       }
+ 
+       /* Create the class name information */
+       if(!_ILClassNameCreate(image, token, name, namespace, scope, scopeName))
+       {
+               return IL_LOADERR_MEMORY;
+       }
+       *nameInfo = className;
+       return 0;
+ }
+ static int Load_TypeDefName(ILImage *image, ILUInt32 *values,
+                                                   ILUInt32 *valuesNext, 
ILToken token,
+                                                   void *userData)
+ {
+       ILClassName *name;
+       return Load_TypeDefNameInner(image, values, valuesNext, token,
+                                                                userData, 
&name);
+ }
+ 
+ /*
   * Load a type specification token.
   */
***************
*** 2661,2664 ****
--- 2923,2932 ----
                }
        }
+ 
+       /* Load class names from the TypeRef and TypeDef tables */
+       EXIT_IF_ERROR(LoadTokens(image, IL_META_TOKEN_TYPE_REF,
+                                                        Load_TypeRefName, 0));
+       EXIT_IF_ERROR(LoadTokens(image, IL_META_TOKEN_TYPE_DEF,
+                                                        Load_TypeDefName, 0));
  
        /* Perform phase 1 type resolution on the TypeRef table */

Index: meta_index.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/image/meta_index.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -r1.7 -r1.8
*** meta_index.c        19 Feb 2003 01:26:09 -0000      1.7
--- meta_index.c        13 Jun 2003 06:44:04 -0000      1.8
***************
*** 1397,1401 ****
        {
                /* We are loading an image, so use the supplied token */
!               item->token = (ILUInt32)token;
                if(token < (unsigned long)0x40000000)
                {
--- 1397,1404 ----
        {
                /* We are loading an image, so use the supplied token */
!               if(!(item->token))
!               {
!                       item->token = (ILUInt32)token;
!               }
                if(token < (unsigned long)0x40000000)
                {

Index: misc_token.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/image/misc_token.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -r1.5 -r1.6
*** misc_token.c        3 Jun 2003 06:17:10 -0000       1.5
--- misc_token.c        13 Jun 2003 06:44:04 -0000      1.6
***************
*** 847,851 ****
        type->classItem.attributes = attributes | IL_META_TYPEDEF_REFERENCE;
        type->classItem.className =
!               _ILClassNameCreate(image, token, name, namespace, 0);
        if(!(type->classItem.className))
        {
--- 847,856 ----
        type->classItem.attributes = attributes | IL_META_TYPEDEF_REFERENCE;
        type->classItem.className =
!               _ILClassNameLookup(image, 0, 0, name, namespace);
!       if(!(type->classItem.className))
!       {
!               type->classItem.className =
!                       _ILClassNameCreate(image, token, name, namespace, 0, 0);
!       }
        if(!(type->classItem.className))
        {

Index: program.h
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/image/program.h,v
retrieving revision 1.18
retrieving revision 1.19
diff -C2 -r1.18 -r1.19
*** program.h   13 Jun 2003 04:33:27 -0000      1.18
--- program.h   13 Jun 2003 06:44:04 -0000      1.19
***************
*** 227,238 ****
   * Information about a class name.
   */
- typedef struct _tagILClassName ILClassName;
  struct _tagILClassName
  {
!       ILImage            *image;                              /* Image 
containing the class */
!       ILToken                 token;                          /* Token code 
for the class */
!       const char         *name;                               /* Name of the 
class */
!       const char         *namespace;                  /* Name of the class's 
namespace */
!       ILProgramItem  *scope;                          /* Scope that the class 
is defined in */
  };
  
--- 227,238 ----
   * Information about a class name.
   */
  struct _tagILClassName
  {
!       ILImage            *image;                      /* Image containing the 
class */
!       ILToken                 token;                  /* Token code for the 
class */
!       const char         *name;                       /* Name of the class */
!       const char         *namespace;          /* Name of the class's 
namespace */
!       ILProgramItem  *scope;                  /* Scope that the class is 
defined in */
!       ILClassName        *scopeName;          /* Name of the scope (nested 
classes) */
  };
  
***************
*** 242,246 ****
  ILClassName *_ILClassNameCreate(ILImage *image, ILToken token,
                                                                const char 
*name, const char *namespace,
!                                                               ILProgramItem 
*scope);
  
  /*
--- 242,247 ----
  ILClassName *_ILClassNameCreate(ILImage *image, ILToken token,
                                                                const char 
*name, const char *namespace,
!                                                               ILProgramItem 
*scopeItem,
!                                                               ILClassName 
*scopeName);
  
  /*
***************
*** 254,257 ****
--- 255,265 ----
   */
  ILClass *_ILClassNameToClass(ILClassName *className);
+ 
+ /*
+  * Look up a class name within a specific scope.
+  */
+ ILClassName *_ILClassNameLookup(ILImage *image, ILProgramItem *scopeItem,
+                                                               ILClassName 
*scopeName, const char *name,
+                                                               const char 
*namespace);
  
  /*





reply via email to

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