1 /* src/vm/classcache.h - loaded class cache and loading constraints
3 Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
4 R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
5 C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
6 Institut f. Computersprachen - TU Wien
8 This file is part of CACAO.
10 This program is free software; you can redistribute it and/or
11 modify it under the terms of the GNU General Public License as
12 published by the Free Software Foundation; either version 2, or (at
13 your option) any later version.
15 This program is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
25 Contact: cacao@complang.tuwien.ac.at
27 Authors: Edwin Steiner
31 $Id: classcache.h 2195 2005-04-03 16:53:16Z edwin $
39 #include <stdio.h> /* for FILE */
41 #include "vm/references.h"
42 #include "vm/tables.h"
45 /* forward declarations *******************************************************/
47 typedef struct classcache_name_entry classcache_name_entry;
48 typedef struct classcache_class_entry classcache_class_entry;
49 typedef struct classcache_loader_entry classcache_loader_entry;
51 typedef java_objectheader classloader;
53 /* global variables ***********************************************************/
55 extern hashtable classcache_hash;
57 /* structs ********************************************************************/
60 /*----------------------------------------------------------------------------*/
61 /* The Loaded Class Cache */
63 /* The loaded class cache is implemented as a two-level data structure. */
65 /* The first level is a hash table indexed by class names. For each class */
66 /* name in the cache there is a classcache_name_entry, which collects all */
67 /* information about classes with this class name. */
69 /* Second level: For each classcache_name_entry there is a list of */
70 /* classcache_class_entry:s representing the possible different resolutions */
71 /* of the class name. */
73 /* A classcache_class_entry records the following: */
75 /* - the loaded class object, if this entry has been resolved, otherwise NULL */
76 /* - the list of initiating loaders which have resolved the class name to */
77 /* this class object */
78 /* - the list of initiating loaders which are constrained to resolve this */
79 /* class name to this class object in the future */
81 /* The classcache_class_entry:s approximate the equivalence classes created */
82 /* by the loading constraints and (XXX?) the equivalence of loaded classes. */
84 /* When a loading constraint (loaderA,loaderB,NAME) is added, then the */
85 /* classcache_class_entry:s for NAME containing loaderA and loaderB resp. */
86 /* must be merged into one entry. If this is impossible, because the entries */
87 /* have already been resolved to different class objects, then the constraint */
88 /* is violated and an expception must be thrown. */
89 /*----------------------------------------------------------------------------*/
92 /* classcache_name_entry
94 * For each classname a classcache_name_entry struct is created.
97 struct classcache_name_entry
99 utf *name; /* class name */
100 classcache_name_entry *hashlink; /* link for external chaining */
101 classcache_class_entry *classes; /* equivalence classes for this name*/
104 struct classcache_class_entry
106 classinfo *classobj; /* the loaded class object, or NULL */
107 classcache_loader_entry *loaders;
108 classcache_loader_entry *constraints;
109 classcache_class_entry *next; /* next class entry for same name */
112 struct classcache_loader_entry
114 classloader *loader; /* class loader object */
115 classcache_loader_entry *next; /* next loader entry in the list */
118 /* function prototypes ********************************************************/
120 /* classcache_init *************************************************************
122 Initialize the loaded class cache
124 *******************************************************************************/
126 void classcache_init();
128 /* classcache_free *************************************************************
130 Free the memory used by the class cache
133 The class cache may not be used any more after this call, except
134 when it is reinitialized with classcache_init.
136 *******************************************************************************/
138 void classcache_free();
140 /* classcache_lookup ***********************************************************
142 Lookup a possibly loaded class
145 initloader.......initiating loader for resolving the class name
146 classname........class name to look up
149 The return value is a pointer to the cached class object,
150 or NULL, if the class is not in the cache.
152 *******************************************************************************/
154 classinfo * classcache_lookup(classloader *initloader,utf *classname);
156 /* classcache_lookup_defined ***************************************************
158 Lookup a class with the given name and defining loader
161 defloader........defining loader
162 classname........class name
165 The return value is a pointer to the cached class object,
166 or NULL, if the class is not in the cache.
168 *******************************************************************************/
170 classinfo * classcache_lookup_defined(classloader *defloader,utf *classname);
172 /* classcache_store ************************************************************
177 initloader.......initiating loader used to load the class
178 cls..............class object to cache
181 true.............everything ok, the class was stored in
182 the cache if necessary,
183 false............an exception has been thrown.
185 *******************************************************************************/
187 bool classcache_store(classloader *initloader,classinfo *cls);
189 /* classcache_add_constraint ***************************************************
191 Add a loading constraint
194 a................first initiating loader
195 b................second initiating loader
196 classname........class name
199 true.............everything ok, the constraint has been added,
200 false............an exception has been thrown.
202 *******************************************************************************/
204 bool classcache_add_constraint(classloader *a,classloader *b,utf *classname);
206 /* classcache_debug_dump *******************************************************
208 Print the contents of the loaded class cache to a stream
211 file.............output stream
213 *******************************************************************************/
215 void classcache_debug_dump(FILE *file);
217 #endif /* _CLASSCACHE_H */
220 * These are local overrides for various environment variables in Emacs.
221 * Please do not remove this and leave it at the end of the file, where
222 * Emacs will automagically detect them.
223 * ---------------------------------------------------------------------
226 * indent-tabs-mode: t
230 * vim:noexpandtab:sw=4:ts=4: