[Top][All Lists]
[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);
/*
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [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,
Rhys Weatherley <address@hidden> <=