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: Reinhard Grafl
33 Contains support functions for:
34 - Reading of Java class files
37 - additional support functions
39 $Id: tables.c 3239 2005-09-21 14:09:22Z twisti $
47 #include <sys/types.h>
54 #include "mm/memory.h"
55 #include "native/native.h"
56 #include "toolbox/logging.h"
57 #include "vm/builtin.h"
58 #include "vm/exceptions.h"
59 #include "vm/global.h"
60 #include "vm/loader.h"
61 #include "vm/options.h"
62 #include "vm/statistics.h"
63 #include "vm/stringlocal.h"
64 #include "vm/tables.h"
65 #include "vm/classcache.h"
68 hashtable string_hash; /* hashtable for javastrings */
71 /******************************************************************************
72 *********************** hashtable functions **********************************
73 ******************************************************************************/
75 /* hashsize must be power of 2 */
77 #define UTF_HASHSTART 16384 /* initial size of utf-hash */
78 #define HASHSTART 2048 /* initial size of javastring and class-hash */
81 /******************** function: init_hashtable ******************************
83 Initializes a hashtable structure and allocates memory.
84 The parameter size specifies the initial size of the hashtable.
86 *****************************************************************************/
88 void init_hashtable(hashtable *hash, u4 size)
94 hash->ptr = MNEW(void*, size);
97 for (i = 0; i < size; i++) hash->ptr[i] = NULL;
101 /*********************** function: tables_init *****************************
103 creates hashtables for symboltables
104 (called once at startup)
106 *****************************************************************************/
110 init_hashtable(&utf_hash, UTF_HASHSTART); /* hashtable for utf8-symbols */
111 init_hashtable(&string_hash, HASHSTART); /* hashtable for javastrings */
116 /* list_init(&unlinkedclasses, OFFSET(classinfo, listnode)); */
118 #if defined(STATISTICS)
120 count_utf_len += sizeof(utf*) * utf_hash.size;
125 /********************** function: tables_close ******************************
127 free memory for hashtables
129 *****************************************************************************/
139 /* dispose utf symbols */
140 for (i = 0; i < utf_hash.size; i++) {
143 /* process elements in external hash chain */
144 utf *nextu = u->hashlink;
145 MFREE(u->text, u1, u->blength);
151 /* dispose javastrings */
152 for (i = 0; i < string_hash.size; i++) {
153 s = string_hash.ptr[i];
155 /* process elements in external hash chain */
156 literalstring *nexts = s->hashlink;
157 literalstring_free(s->string);
158 FREE(s, literalstring);
163 /* dispose hashtable structures */
164 MFREE(utf_hash.ptr, void*, utf_hash.size);
165 MFREE(string_hash.ptr, void*, string_hash.size);
169 /******************************************************************************
170 *********************** Misc support functions ********************************
171 ******************************************************************************/
174 /******************** Function: desc_to_type **********************************
176 Determines the corresponding Java base data type for a given type
179 ******************************************************************************/
181 u2 desc_to_type(utf *descriptor)
183 char *utf_ptr = descriptor->text; /* current position in utf text */
185 if (descriptor->blength < 1) {
186 log_text("Type-Descriptor is empty string");
190 switch (*utf_ptr++) {
195 case 'Z': return TYPE_INT;
196 case 'D': return TYPE_DOUBLE;
197 case 'F': return TYPE_FLOAT;
198 case 'J': return TYPE_LONG;
200 case '[': return TYPE_ADDRESS;
209 /********************** Function: desc_typesize *******************************
211 Calculates the lenght in bytes needed for a data element of the type given
212 by its type descriptor.
214 ******************************************************************************/
216 u2 desc_typesize(utf *descriptor)
218 switch (desc_to_type(descriptor)) {
219 case TYPE_INT: return 4;
220 case TYPE_LONG: return 8;
221 case TYPE_FLOAT: return 4;
222 case TYPE_DOUBLE: return 8;
223 case TYPE_ADDRESS: return sizeof(voidptr);
230 * These are local overrides for various environment variables in Emacs.
231 * Please do not remove this and leave it at the end of the file, where
232 * Emacs will automagically detect them.
233 * ---------------------------------------------------------------------
236 * indent-tabs-mode: t