* tables_init: Changed return type to bool, removed call to
[cacao.git] / src / vm / tables.c
1 /* src/vm/tables.c - 
2
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
7
8    This file is part of CACAO.
9
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.
14
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.
19
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
23    02111-1307, USA.
24
25    Contact: cacao@complang.tuwien.ac.at
26
27    Authors: Reinhard Grafl
28
29    Changes: Mark Probst
30             Andreas Krall
31             Christian Thalinger
32
33    Contains support functions for:
34        - Reading of Java class files
35        - Unicode symbols
36        - the heap
37        - additional support functions
38
39    $Id: tables.c 3679 2005-11-16 12:12:02Z twisti $
40
41 */
42
43
44 #include <string.h>
45 #include <stdlib.h>
46 #include <assert.h>
47 #include <sys/types.h>
48 #include <sys/mman.h>
49 #include <unistd.h>
50
51 #include "config.h"
52 #include "vm/types.h"
53
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"
66
67
68 hashtable string_hash;  /* hashtable for javastrings  */
69
70
71 /******************************************************************************
72  *********************** hashtable functions **********************************
73  ******************************************************************************/
74
75 /* hashsize must be power of 2 */
76
77 #define UTF_HASHSTART   16384   /* initial size of utf-hash */    
78 #define HASHSTART        2048   /* initial size of javastring and class-hash */
79
80
81 /******************** function: init_hashtable ******************************
82
83     Initializes a hashtable structure and allocates memory.
84     The parameter size specifies the initial size of the hashtable.
85         
86 *****************************************************************************/
87
88 void init_hashtable(hashtable *hash, u4 size)
89 {
90         u4 i;
91
92         hash->entries = 0;
93         hash->size    = size;
94         hash->ptr     = MNEW(void*, size);
95
96         /* clear table */
97         for (i = 0; i < size; i++) hash->ptr[i] = NULL;
98 }
99
100
101 /* tables_init *****************************************************************
102
103    Creates hashtables for symboltables (called once at startup).
104         
105 *******************************************************************************/
106
107 bool tables_init(void)
108 {
109         init_hashtable(&utf_hash,    UTF_HASHSTART);  /* hashtable for utf8-symbols */
110         init_hashtable(&string_hash, HASHSTART);      /* hashtable for javastrings */
111
112 /*      if (opt_eager) */
113 /*              list_init(&unlinkedclasses, OFFSET(classinfo, listnode)); */
114
115 #if defined(STATISTICS)
116         if (opt_stat)
117                 count_utf_len += sizeof(utf*) * utf_hash.size;
118 #endif
119
120         /* everything's ok */
121
122         return true;
123 }
124
125
126 /********************** function: tables_close ******************************
127
128         free memory for hashtables                    
129         
130 *****************************************************************************/
131
132 void tables_close()
133 {
134         utf *u = NULL;
135         literalstring *s;
136         u4 i;
137
138         classcache_free();
139         
140         /* dispose utf symbols */
141         for (i = 0; i < utf_hash.size; i++) {
142                 u = utf_hash.ptr[i];
143                 while (u) {
144                         /* process elements in external hash chain */
145                         utf *nextu = u->hashlink;
146                         MFREE(u->text, u1, u->blength);
147                         FREE(u, utf);
148                         u = nextu;
149                 }       
150         }
151
152         /* dispose javastrings */
153         for (i = 0; i < string_hash.size; i++) {
154                 s = string_hash.ptr[i];
155                 while (u) {
156                         /* process elements in external hash chain */
157                         literalstring *nexts = s->hashlink;
158                         literalstring_free(s->string);
159                         FREE(s, literalstring);
160                         s = nexts;
161                 }       
162         }
163
164         /* dispose hashtable structures */
165         MFREE(utf_hash.ptr,    void*, utf_hash.size);
166         MFREE(string_hash.ptr, void*, string_hash.size);
167 }
168
169
170 /******************************************************************************
171 *********************** Misc support functions ********************************
172 ******************************************************************************/
173
174
175 /******************** Function: desc_to_type **********************************
176    
177         Determines the corresponding Java base data type for a given type
178         descriptor.
179         
180 ******************************************************************************/
181
182 u2 desc_to_type(utf *descriptor)
183 {
184         char *utf_ptr = descriptor->text;  /* current position in utf text */
185
186         if (descriptor->blength < 1) {
187                 log_text("Type-Descriptor is empty string");
188                 assert(0);
189         }
190         
191         switch (*utf_ptr++) {
192         case 'B': 
193         case 'C':
194         case 'I':
195         case 'S':  
196         case 'Z':  return TYPE_INT;
197         case 'D':  return TYPE_DOUBLE;
198         case 'F':  return TYPE_FLOAT;
199         case 'J':  return TYPE_LONG;
200         case 'L':
201         case '[':  return TYPE_ADDRESS;
202         }
203                         
204         assert(0);
205
206         return 0;
207 }
208
209
210 /********************** Function: desc_typesize *******************************
211
212         Calculates the lenght in bytes needed for a data element of the type given
213         by its type descriptor.
214         
215 ******************************************************************************/
216
217 u2 desc_typesize(utf *descriptor)
218 {
219         switch (desc_to_type(descriptor)) {
220         case TYPE_INT:     return 4;
221         case TYPE_LONG:    return 8;
222         case TYPE_FLOAT:   return 4;
223         case TYPE_DOUBLE:  return 8;
224         case TYPE_ADDRESS: return sizeof(voidptr);
225         default:           return 0;
226         }
227 }
228
229
230 /*
231  * These are local overrides for various environment variables in Emacs.
232  * Please do not remove this and leave it at the end of the file, where
233  * Emacs will automagically detect them.
234  * ---------------------------------------------------------------------
235  * Local variables:
236  * mode: c
237  * indent-tabs-mode: t
238  * c-basic-offset: 4
239  * tab-width: 4
240  * End:
241  */