]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/jv-lang.c
move gdbarch object from objfile to per-BFD
[thirdparty/binutils-gdb.git] / gdb / jv-lang.c
CommitLineData
c906108c 1/* Java language support routines for GDB, the GNU debugger.
dfa52d88 2
28e7fd62 3 Copyright (C) 1997-2013 Free Software Foundation, Inc.
c906108c 4
c5aa993b 5 This file is part of GDB.
c906108c 6
c5aa993b
JM
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
c5aa993b 10 (at your option) any later version.
c906108c 11
c5aa993b
JM
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
c906108c 16
c5aa993b 17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
19
20#include "defs.h"
21#include "symtab.h"
22#include "gdbtypes.h"
23#include "expression.h"
24#include "parser-defs.h"
25#include "language.h"
26#include "gdbtypes.h"
27#include "symtab.h"
28#include "symfile.h"
29#include "objfiles.h"
30#include "gdb_string.h"
31#include "value.h"
32#include "c-lang.h"
33#include "jv-lang.h"
34#include "gdbcore.h"
fe898f56 35#include "block.h"
9a3d7dfd 36#include "demangle.h"
de4f826b 37#include "dictionary.h"
c906108c 38#include <ctype.h>
03b4bca2 39#include "gdb_assert.h"
127c81bc
TT
40#include "charset.h"
41#include "valprint.h"
8de20a37 42#include "cp-support.h"
c906108c 43
392a587b
JM
44/* Local functions */
45
a14ed312 46extern void _initialize_java_language (void);
392a587b 47
0d5cff50
DE
48static int java_demangled_signature_length (const char *);
49static void java_demangled_signature_copy (char *, const char *);
c906108c 50
20781792 51static struct symtab *get_java_class_symtab (struct gdbarch *gdbarch);
75c9979e
AC
52static char *get_java_utf8_name (struct obstack *obstack, struct value *name);
53static int java_class_is_primitive (struct value *clas);
75c9979e 54static struct value *java_value_string (char *ptr, int len);
392a587b 55
6c7a06a3
TT
56static void java_emit_char (int c, struct type *type,
57 struct ui_file * stream, int quoter);
c906108c 58
31c27f77
JJ
59static char *java_class_name_from_physname (const char *physname);
60
20781792 61static const struct objfile_data *jv_dynamics_objfile_data_key;
20781792 62
86cc0029
TT
63/* The dynamic objfile is kept per-program-space. This key lets us
64 associate the objfile with the program space. */
c906108c 65
86cc0029 66static const struct program_space_data *jv_dynamics_progspace_key;
20781792 67
0daa2b63
UW
68static struct type *java_link_class_type (struct gdbarch *,
69 struct type *, struct value *);
c906108c 70
30cc903e
TT
71/* An instance of this structure is used to store some data that must
72 be freed. */
73
74struct jv_per_objfile_data
75{
76 /* The expandable dictionary we use. */
77 struct dictionary *dict;
78};
79
20781792
TT
80/* A function called when the dynamics_objfile is freed. We use this
81 to clean up some internal state. */
82static void
30cc903e 83jv_per_objfile_free (struct objfile *objfile, void *data)
20781792 84{
30cc903e 85 struct jv_per_objfile_data *jv_data = data;
86cc0029 86 struct objfile *dynamics_objfile;
30cc903e 87
86cc0029
TT
88 dynamics_objfile = program_space_data (current_program_space,
89 jv_dynamics_progspace_key);
20781792 90 gdb_assert (objfile == dynamics_objfile);
30cc903e
TT
91
92 if (jv_data->dict)
93 dict_free (jv_data->dict);
94 xfree (jv_data);
86cc0029
TT
95
96 set_program_space_data (current_program_space,
97 jv_dynamics_progspace_key,
98 NULL);
20781792
TT
99}
100
eb9a305d
DC
101/* FIXME: carlton/2003-02-04: This is the main or only caller of
102 allocate_objfile with first argument NULL; as a result, this code
103 breaks every so often. Somebody should write a test case that
104 exercises GDB in various ways (e.g. something involving loading a
105 dynamic library) after this code has been called. */
106
c906108c 107static struct objfile *
20781792 108get_dynamics_objfile (struct gdbarch *gdbarch)
c906108c 109{
86cc0029
TT
110 struct objfile *dynamics_objfile;
111
112 dynamics_objfile = program_space_data (current_program_space,
113 jv_dynamics_progspace_key);
114
c906108c
SS
115 if (dynamics_objfile == NULL)
116 {
30cc903e
TT
117 struct jv_per_objfile_data *data;
118
20781792
TT
119 /* Mark it as shared so that it is cleared when the inferior is
120 re-run. */
121 dynamics_objfile = allocate_objfile (NULL, OBJF_SHARED);
df6d5441 122 dynamics_objfile->per_bfd->gdbarch = gdbarch;
30cc903e
TT
123
124 data = XCNEW (struct jv_per_objfile_data);
125 set_objfile_data (dynamics_objfile, jv_dynamics_objfile_data_key, data);
86cc0029
TT
126
127 set_program_space_data (current_program_space,
128 jv_dynamics_progspace_key,
129 dynamics_objfile);
c906108c
SS
130 }
131 return dynamics_objfile;
132}
133
392a587b 134static struct symtab *
20781792 135get_java_class_symtab (struct gdbarch *gdbarch)
c906108c 136{
86cc0029
TT
137 struct objfile *objfile = get_dynamics_objfile (gdbarch);
138 struct symtab *class_symtab = objfile->symtabs;
139
c906108c
SS
140 if (class_symtab == NULL)
141 {
c906108c
SS
142 struct blockvector *bv;
143 struct block *bl;
30cc903e 144 struct jv_per_objfile_data *jv_data;
e0881a8e 145
c906108c
SS
146 class_symtab = allocate_symtab ("<java-classes>", objfile);
147 class_symtab->language = language_java;
148 bv = (struct blockvector *)
4a146b47 149 obstack_alloc (&objfile->objfile_obstack,
de4f826b 150 sizeof (struct blockvector) + sizeof (struct block *));
c906108c
SS
151 BLOCKVECTOR_NBLOCKS (bv) = 1;
152 BLOCKVECTOR (class_symtab) = bv;
153
1777feb0 154 /* Allocate dummy STATIC_BLOCK. */
4a146b47
EZ
155 bl = allocate_block (&objfile->objfile_obstack);
156 BLOCK_DICT (bl) = dict_create_linear (&objfile->objfile_obstack,
de4f826b 157 NULL);
c906108c
SS
158 BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK) = bl;
159
5c4e30ca 160 /* Allocate GLOBAL_BLOCK. */
84a146c9 161 bl = allocate_global_block (&objfile->objfile_obstack);
de4f826b 162 BLOCK_DICT (bl) = dict_create_hashed_expandable ();
84a146c9 163 set_block_symtab (bl, class_symtab);
c906108c 164 BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK) = bl;
30cc903e
TT
165
166 /* Arrange to free the dict. */
167 jv_data = objfile_data (objfile, jv_dynamics_objfile_data_key);
168 jv_data->dict = BLOCK_DICT (bl);
c906108c
SS
169 }
170 return class_symtab;
171}
172
173static void
fba45db2 174add_class_symtab_symbol (struct symbol *sym)
c906108c 175{
20781792
TT
176 struct symtab *symtab
177 = get_java_class_symtab (get_objfile_arch (SYMBOL_SYMTAB (sym)->objfile));
c906108c 178 struct blockvector *bv = BLOCKVECTOR (symtab);
e0881a8e 179
de4f826b 180 dict_add_symbol (BLOCK_DICT (BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK)), sym);
c906108c
SS
181}
182
c906108c 183static struct symbol *
fba45db2 184add_class_symbol (struct type *type, CORE_ADDR addr)
c906108c
SS
185{
186 struct symbol *sym;
86cc0029 187 struct objfile *objfile = get_dynamics_objfile (get_type_arch (type));
e0881a8e 188
e623cf5d 189 sym = allocate_symbol (objfile);
f85f34ed 190 SYMBOL_SET_LANGUAGE (sym, language_java, &objfile->objfile_obstack);
3567439c 191 SYMBOL_SET_LINKAGE_NAME (sym, TYPE_TAG_NAME (type));
f1e6e072 192 SYMBOL_ACLASS_INDEX (sym) = LOC_TYPEDEF;
c5aa993b 193 /* SYMBOL_VALUE (sym) = valu; */
c906108c 194 SYMBOL_TYPE (sym) = type;
176620f1 195 SYMBOL_DOMAIN (sym) = STRUCT_DOMAIN;
c906108c
SS
196 SYMBOL_VALUE_ADDRESS (sym) = addr;
197 return sym;
198}
de4f826b 199
c906108c 200struct type *
fba45db2 201java_lookup_class (char *name)
c906108c
SS
202{
203 struct symbol *sym;
e0881a8e 204
2570f2b7 205 sym = lookup_symbol (name, expression_context_block, STRUCT_DOMAIN, NULL);
c906108c
SS
206 if (sym != NULL)
207 return SYMBOL_TYPE (sym);
1777feb0 208 /* FIXME - should search inferior's symbol table. */
c906108c 209 return NULL;
c906108c
SS
210}
211
212/* Return a nul-terminated string (allocated on OBSTACK) for
1777feb0 213 a name given by NAME (which has type Utf8Const*). */
c906108c
SS
214
215char *
75c9979e 216get_java_utf8_name (struct obstack *obstack, struct value *name)
c906108c
SS
217{
218 char *chrs;
75c9979e 219 struct value *temp = name;
c906108c
SS
220 int name_length;
221 CORE_ADDR data_addr;
e0881a8e 222
c906108c
SS
223 temp = value_struct_elt (&temp, NULL, "length", NULL, "structure");
224 name_length = (int) value_as_long (temp);
42ae5230 225 data_addr = value_address (temp) + TYPE_LENGTH (value_type (temp));
c5aa993b
JM
226 chrs = obstack_alloc (obstack, name_length + 1);
227 chrs[name_length] = '\0';
c68a6671 228 read_memory (data_addr, (gdb_byte *) chrs, name_length);
c906108c
SS
229 return chrs;
230}
231
75c9979e
AC
232struct value *
233java_class_from_object (struct value *obj_val)
c906108c
SS
234{
235 /* This is all rather inefficient, since the offsets of vtable and
236 class are fixed. FIXME */
75c9979e 237 struct value *vtable_val;
c906108c 238
df407dfe
AC
239 if (TYPE_CODE (value_type (obj_val)) == TYPE_CODE_PTR
240 && TYPE_LENGTH (TYPE_TARGET_TYPE (value_type (obj_val))) == 0)
c906108c 241 obj_val = value_at (get_java_object_type (),
00a4c844 242 value_as_address (obj_val));
c906108c
SS
243
244 vtable_val = value_struct_elt (&obj_val, NULL, "vtable", NULL, "structure");
245 return value_struct_elt (&vtable_val, NULL, "class", NULL, "structure");
246}
247
248/* Check if CLASS_IS_PRIMITIVE(value of clas): */
392a587b 249static int
75c9979e 250java_class_is_primitive (struct value *clas)
c906108c 251{
1777feb0
MS
252 struct value *vtable = value_struct_elt (&clas, NULL, "vtable",
253 NULL, "struct");
1aa20aa8 254 CORE_ADDR i = value_as_address (vtable);
e0881a8e 255
c906108c
SS
256 return (int) (i & 0x7fffffff) == (int) 0x7fffffff;
257}
258
1777feb0 259/* Read a GCJ Class object, and generated a gdb (TYPE_CODE_STRUCT) type. */
c906108c
SS
260
261struct type *
0daa2b63 262type_from_class (struct gdbarch *gdbarch, struct value *clas)
c906108c
SS
263{
264 struct type *type;
265 char *name;
75c9979e 266 struct value *temp;
c906108c 267 struct objfile *objfile;
75c9979e 268 struct value *utf8_name;
c906108c
SS
269 char *nptr;
270 CORE_ADDR addr;
c906108c 271
df407dfe 272 type = check_typedef (value_type (clas));
c906108c
SS
273 if (TYPE_CODE (type) == TYPE_CODE_PTR)
274 {
275 if (value_logical_not (clas))
276 return NULL;
277 clas = value_ind (clas);
278 }
42ae5230 279 addr = value_address (clas);
c906108c 280
20781792 281 objfile = get_dynamics_objfile (gdbarch);
c906108c
SS
282 if (java_class_is_primitive (clas))
283 {
75c9979e 284 struct value *sig;
e0881a8e 285
c906108c
SS
286 temp = clas;
287 sig = value_struct_elt (&temp, NULL, "method_count", NULL, "structure");
0daa2b63 288 return java_primitive_type (gdbarch, value_as_long (sig));
c906108c
SS
289 }
290
1777feb0
MS
291 /* Get Class name. */
292 /* If clasloader non-null, prepend loader address. FIXME */
c906108c
SS
293 temp = clas;
294 utf8_name = value_struct_elt (&temp, NULL, "name", NULL, "structure");
b99607ea 295 name = get_java_utf8_name (&objfile->objfile_obstack, utf8_name);
c5aa993b 296 for (nptr = name; *nptr != 0; nptr++)
c906108c
SS
297 {
298 if (*nptr == '/')
299 *nptr = '.';
300 }
301
302 type = java_lookup_class (name);
303 if (type != NULL)
304 return type;
305
20781792 306 type = alloc_type (objfile);
c906108c
SS
307 TYPE_CODE (type) = TYPE_CODE_STRUCT;
308 INIT_CPLUS_SPECIFIC (type);
309
310 if (name[0] == '[')
311 {
312 char *signature = name;
313 int namelen = java_demangled_signature_length (signature);
e0881a8e 314
c906108c 315 if (namelen > strlen (name))
b99607ea 316 name = obstack_alloc (&objfile->objfile_obstack, namelen + 1);
c906108c
SS
317 java_demangled_signature_copy (name, signature);
318 name[namelen] = '\0';
c906108c 319 temp = clas;
1777feb0 320 /* Set array element type. */
c906108c 321 temp = value_struct_elt (&temp, NULL, "methods", NULL, "structure");
1777feb0
MS
322 deprecated_set_value_type (temp,
323 lookup_pointer_type (value_type (clas)));
0daa2b63 324 TYPE_TARGET_TYPE (type) = type_from_class (gdbarch, temp);
c906108c
SS
325 }
326
327 ALLOCATE_CPLUS_STRUCT_TYPE (type);
328 TYPE_TAG_NAME (type) = name;
329
330 add_class_symtab_symbol (add_class_symbol (type, addr));
0daa2b63 331 return java_link_class_type (gdbarch, type, clas);
c906108c
SS
332}
333
1777feb0 334/* Fill in class TYPE with data from the CLAS value. */
c906108c 335
20781792 336static struct type *
0daa2b63
UW
337java_link_class_type (struct gdbarch *gdbarch,
338 struct type *type, struct value *clas)
c906108c 339{
75c9979e 340 struct value *temp;
0d5cff50
DE
341 const char *unqualified_name;
342 const char *name = TYPE_TAG_NAME (type);
c906108c
SS
343 int ninterfaces, nfields, nmethods;
344 int type_is_object = 0;
345 struct fn_field *fn_fields;
346 struct fn_fieldlist *fn_fieldlists;
75c9979e
AC
347 struct value *fields;
348 struct value *methods;
c65ecaf3
AC
349 struct value *method = NULL;
350 struct value *field = NULL;
c906108c 351 int i, j;
20781792 352 struct objfile *objfile = get_dynamics_objfile (gdbarch);
c906108c
SS
353 struct type *tsuper;
354
03b4bca2 355 gdb_assert (name != NULL);
c906108c
SS
356 unqualified_name = strrchr (name, '.');
357 if (unqualified_name == NULL)
358 unqualified_name = name;
359
360 temp = clas;
361 temp = value_struct_elt (&temp, NULL, "superclass", NULL, "structure");
03b4bca2 362 if (strcmp (name, "java.lang.Object") == 0)
c906108c
SS
363 {
364 tsuper = get_java_object_type ();
365 if (tsuper && TYPE_CODE (tsuper) == TYPE_CODE_PTR)
366 tsuper = TYPE_TARGET_TYPE (tsuper);
367 type_is_object = 1;
368 }
369 else
0daa2b63 370 tsuper = type_from_class (gdbarch, temp);
c906108c
SS
371
372#if 1
373 ninterfaces = 0;
374#else
375 temp = clas;
1777feb0
MS
376 ninterfaces = value_as_long (value_struct_elt (&temp, NULL, "interface_len",
377 NULL, "structure"));
c906108c
SS
378#endif
379 TYPE_N_BASECLASSES (type) = (tsuper == NULL ? 0 : 1) + ninterfaces;
380 temp = clas;
1777feb0
MS
381 nfields = value_as_long (value_struct_elt (&temp, NULL, "field_count",
382 NULL, "structure"));
c906108c 383 nfields += TYPE_N_BASECLASSES (type);
1777feb0 384 nfields++; /* Add one for dummy "class" field. */
c906108c
SS
385 TYPE_NFIELDS (type) = nfields;
386 TYPE_FIELDS (type) = (struct field *)
387 TYPE_ALLOC (type, sizeof (struct field) * nfields);
388
389 memset (TYPE_FIELDS (type), 0, sizeof (struct field) * nfields);
390
391 TYPE_FIELD_PRIVATE_BITS (type) =
392 (B_TYPE *) TYPE_ALLOC (type, B_BYTES (nfields));
393 B_CLRALL (TYPE_FIELD_PRIVATE_BITS (type), nfields);
394
395 TYPE_FIELD_PROTECTED_BITS (type) =
396 (B_TYPE *) TYPE_ALLOC (type, B_BYTES (nfields));
397 B_CLRALL (TYPE_FIELD_PROTECTED_BITS (type), nfields);
398
399 TYPE_FIELD_IGNORE_BITS (type) =
400 (B_TYPE *) TYPE_ALLOC (type, B_BYTES (nfields));
401 B_CLRALL (TYPE_FIELD_IGNORE_BITS (type), nfields);
402
403 TYPE_FIELD_VIRTUAL_BITS (type) = (B_TYPE *)
404 TYPE_ALLOC (type, B_BYTES (TYPE_N_BASECLASSES (type)));
405 B_CLRALL (TYPE_FIELD_VIRTUAL_BITS (type), TYPE_N_BASECLASSES (type));
406
407 if (tsuper != NULL)
408 {
409 TYPE_BASECLASS (type, 0) = tsuper;
410 if (type_is_object)
411 SET_TYPE_FIELD_PRIVATE (type, 0);
412 }
413
414 i = strlen (name);
c5aa993b 415 if (i > 2 && name[i - 1] == ']' && tsuper != NULL)
c906108c
SS
416 {
417 /* FIXME */
1777feb0 418 TYPE_LENGTH (type) = TYPE_LENGTH (tsuper) + 4; /* size with "length" */
c906108c
SS
419 }
420 else
421 {
422 temp = clas;
1777feb0
MS
423 temp = value_struct_elt (&temp, NULL, "size_in_bytes",
424 NULL, "structure");
c906108c
SS
425 TYPE_LENGTH (type) = value_as_long (temp);
426 }
427
428 fields = NULL;
1777feb0 429 nfields--; /* First set up dummy "class" field. */
42ae5230 430 SET_FIELD_PHYSADDR (TYPE_FIELD (type, nfields), value_address (clas));
c906108c 431 TYPE_FIELD_NAME (type, nfields) = "class";
df407dfe 432 TYPE_FIELD_TYPE (type, nfields) = value_type (clas);
c906108c 433 SET_TYPE_FIELD_PRIVATE (type, nfields);
c5aa993b
JM
434
435 for (i = TYPE_N_BASECLASSES (type); i < nfields; i++)
c906108c
SS
436 {
437 int accflags;
438 int boffset;
e0881a8e 439
c906108c
SS
440 if (fields == NULL)
441 {
442 temp = clas;
443 fields = value_struct_elt (&temp, NULL, "fields", NULL, "structure");
444 field = value_ind (fields);
445 }
446 else
1777feb0 447 { /* Re-use field value for next field. */
42ae5230
TT
448 CORE_ADDR addr
449 = value_address (field) + TYPE_LENGTH (value_type (field));
e0881a8e 450
42ae5230 451 set_value_address (field, addr);
dfa52d88 452 set_value_lazy (field, 1);
c906108c
SS
453 }
454 temp = field;
455 temp = value_struct_elt (&temp, NULL, "name", NULL, "structure");
456 TYPE_FIELD_NAME (type, i) =
b99607ea 457 get_java_utf8_name (&objfile->objfile_obstack, temp);
c906108c
SS
458 temp = field;
459 accflags = value_as_long (value_struct_elt (&temp, NULL, "accflags",
460 NULL, "structure"));
461 temp = field;
462 temp = value_struct_elt (&temp, NULL, "info", NULL, "structure");
463 boffset = value_as_long (value_struct_elt (&temp, NULL, "boffset",
c5aa993b
JM
464 NULL, "structure"));
465 if (accflags & 0x0001) /* public access */
c906108c
SS
466 {
467 /* ??? */
468 }
c5aa993b 469 if (accflags & 0x0002) /* private access */
c906108c
SS
470 {
471 SET_TYPE_FIELD_PRIVATE (type, i);
472 }
c5aa993b 473 if (accflags & 0x0004) /* protected access */
c906108c
SS
474 {
475 SET_TYPE_FIELD_PROTECTED (type, i);
476 }
c5aa993b
JM
477 if (accflags & 0x0008) /* ACC_STATIC */
478 SET_FIELD_PHYSADDR (TYPE_FIELD (type, i), boffset);
c906108c 479 else
945b3a32 480 SET_FIELD_BITPOS (TYPE_FIELD (type, i), 8 * boffset);
c5aa993b 481 if (accflags & 0x8000) /* FIELD_UNRESOLVED_FLAG */
c906108c 482 {
c5aa993b 483 TYPE_FIELD_TYPE (type, i) = get_java_object_type (); /* FIXME */
c906108c
SS
484 }
485 else
486 {
487 struct type *ftype;
e0881a8e 488
c906108c
SS
489 temp = field;
490 temp = value_struct_elt (&temp, NULL, "type", NULL, "structure");
0daa2b63 491 ftype = type_from_class (gdbarch, temp);
c906108c
SS
492 if (TYPE_CODE (ftype) == TYPE_CODE_STRUCT)
493 ftype = lookup_pointer_type (ftype);
494 TYPE_FIELD_TYPE (type, i) = ftype;
495 }
496 }
497
498 temp = clas;
499 nmethods = value_as_long (value_struct_elt (&temp, NULL, "method_count",
500 NULL, "structure"));
c906108c 501 j = nmethods * sizeof (struct fn_field);
c5aa993b 502 fn_fields = (struct fn_field *)
86cc0029 503 obstack_alloc (&objfile->objfile_obstack, j);
c906108c 504 memset (fn_fields, 0, j);
c5aa993b 505 fn_fieldlists = (struct fn_fieldlist *)
c906108c
SS
506 alloca (nmethods * sizeof (struct fn_fieldlist));
507
508 methods = NULL;
c5aa993b 509 for (i = 0; i < nmethods; i++)
c906108c 510 {
0d5cff50 511 const char *mname;
c906108c 512 int k;
e0881a8e 513
c906108c
SS
514 if (methods == NULL)
515 {
516 temp = clas;
1777feb0
MS
517 methods = value_struct_elt (&temp, NULL, "methods",
518 NULL, "structure");
c906108c
SS
519 method = value_ind (methods);
520 }
521 else
1777feb0 522 { /* Re-use method value for next method. */
42ae5230
TT
523 CORE_ADDR addr
524 = value_address (method) + TYPE_LENGTH (value_type (method));
e0881a8e 525
42ae5230 526 set_value_address (method, addr);
dfa52d88 527 set_value_lazy (method, 1);
c906108c
SS
528 }
529
1777feb0 530 /* Get method name. */
c906108c
SS
531 temp = method;
532 temp = value_struct_elt (&temp, NULL, "name", NULL, "structure");
b99607ea 533 mname = get_java_utf8_name (&objfile->objfile_obstack, temp);
c906108c
SS
534 if (strcmp (mname, "<init>") == 0)
535 mname = unqualified_name;
536
537 /* Check for an existing method with the same name.
538 * This makes building the fn_fieldslists an O(nmethods**2)
539 * operation. That could be using hashing, but I doubt it
540 * is worth it. Note that we do maintain the order of methods
541 * in the inferior's Method table (as long as that is grouped
542 * by method name), which I think is desirable. --PB */
c5aa993b 543 for (k = 0, j = TYPE_NFN_FIELDS (type);;)
c906108c
SS
544 {
545 if (--j < 0)
1777feb0 546 { /* No match - new method name. */
c5aa993b 547 j = TYPE_NFN_FIELDS (type)++;
c906108c
SS
548 fn_fieldlists[j].name = mname;
549 fn_fieldlists[j].length = 1;
550 fn_fieldlists[j].fn_fields = &fn_fields[i];
551 k = i;
552 break;
553 }
554 if (strcmp (mname, fn_fieldlists[j].name) == 0)
1777feb0 555 { /* Found an existing method with the same name. */
c906108c 556 int l;
e0881a8e 557
c906108c 558 if (mname != unqualified_name)
b99607ea 559 obstack_free (&objfile->objfile_obstack, mname);
c906108c
SS
560 mname = fn_fieldlists[j].name;
561 fn_fieldlists[j].length++;
1777feb0
MS
562 k = i - k; /* Index of new slot. */
563 /* Shift intervening fn_fields (between k and i) down. */
c5aa993b
JM
564 for (l = i; l > k; l--)
565 fn_fields[l] = fn_fields[l - 1];
566 for (l = TYPE_NFN_FIELDS (type); --l > j;)
c906108c
SS
567 fn_fieldlists[l].fn_fields++;
568 break;
569 }
570 k += fn_fieldlists[j].length;
571 }
572 fn_fields[k].physname = "";
573 fn_fields[k].is_stub = 1;
323427d1 574 /* FIXME */
0daa2b63
UW
575 fn_fields[k].type = lookup_function_type
576 (builtin_java_type (gdbarch)->builtin_void);
c906108c
SS
577 TYPE_CODE (fn_fields[k].type) = TYPE_CODE_METHOD;
578 }
579
c5aa993b
JM
580 j = TYPE_NFN_FIELDS (type) * sizeof (struct fn_fieldlist);
581 TYPE_FN_FIELDLISTS (type) = (struct fn_fieldlist *)
86cc0029 582 obstack_alloc (&objfile->objfile_obstack, j);
c906108c 583 memcpy (TYPE_FN_FIELDLISTS (type), fn_fieldlists, j);
c5aa993b 584
c906108c
SS
585 return type;
586}
587
c906108c 588struct type *
fba45db2 589get_java_object_type (void)
c906108c 590{
86cc0029 591 struct symbol *sym;
e0881a8e 592
86cc0029
TT
593 sym = lookup_symbol ("java.lang.Object", NULL, STRUCT_DOMAIN, NULL);
594 if (sym == NULL)
595 error (_("cannot find java.lang.Object"));
596 return SYMBOL_TYPE (sym);
c906108c
SS
597}
598
599int
45d5d5ca 600get_java_object_header_size (struct gdbarch *gdbarch)
c906108c
SS
601{
602 struct type *objtype = get_java_object_type ();
e0881a8e 603
c906108c 604 if (objtype == NULL)
45d5d5ca 605 return (2 * gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT);
c906108c
SS
606 else
607 return TYPE_LENGTH (objtype);
608}
609
610int
fba45db2 611is_object_type (struct type *type)
c906108c
SS
612{
613 CHECK_TYPEDEF (type);
614 if (TYPE_CODE (type) == TYPE_CODE_PTR)
615 {
616 struct type *ttype = check_typedef (TYPE_TARGET_TYPE (type));
0d5cff50 617 const char *name;
c906108c
SS
618 if (TYPE_CODE (ttype) != TYPE_CODE_STRUCT)
619 return 0;
620 while (TYPE_N_BASECLASSES (ttype) > 0)
621 ttype = TYPE_BASECLASS (ttype, 0);
622 name = TYPE_TAG_NAME (ttype);
623 if (name != NULL && strcmp (name, "java.lang.Object") == 0)
624 return 1;
1777feb0
MS
625 name
626 = TYPE_NFIELDS (ttype) > 0 ? TYPE_FIELD_NAME (ttype, 0) : (char *) 0;
c906108c 627 if (name != NULL && strcmp (name, "vtable") == 0)
86cc0029 628 return 1;
c906108c
SS
629 }
630 return 0;
631}
632
633struct type *
0daa2b63 634java_primitive_type (struct gdbarch *gdbarch, int signature)
c906108c 635{
0daa2b63
UW
636 const struct builtin_java_type *builtin = builtin_java_type (gdbarch);
637
c906108c
SS
638 switch (signature)
639 {
c5aa993b 640 case 'B':
0daa2b63 641 return builtin->builtin_byte;
c5aa993b 642 case 'S':
0daa2b63 643 return builtin->builtin_short;
c5aa993b 644 case 'I':
0daa2b63 645 return builtin->builtin_int;
c5aa993b 646 case 'J':
0daa2b63 647 return builtin->builtin_long;
c5aa993b 648 case 'Z':
0daa2b63 649 return builtin->builtin_boolean;
c5aa993b 650 case 'C':
0daa2b63 651 return builtin->builtin_char;
c5aa993b 652 case 'F':
0daa2b63 653 return builtin->builtin_float;
c5aa993b 654 case 'D':
0daa2b63 655 return builtin->builtin_double;
c5aa993b 656 case 'V':
0daa2b63 657 return builtin->builtin_void;
c906108c 658 }
8a3fe4f8 659 error (_("unknown signature '%c' for primitive type"), (char) signature);
c906108c
SS
660}
661
662/* If name[0 .. namelen-1] is the name of a primitive Java type,
1777feb0 663 return that type. Otherwise, return NULL. */
c906108c
SS
664
665struct type *
0daa2b63 666java_primitive_type_from_name (struct gdbarch *gdbarch,
0d5cff50 667 const char *name, int namelen)
c906108c 668{
0daa2b63
UW
669 const struct builtin_java_type *builtin = builtin_java_type (gdbarch);
670
c906108c
SS
671 switch (name[0])
672 {
673 case 'b':
674 if (namelen == 4 && memcmp (name, "byte", 4) == 0)
0daa2b63 675 return builtin->builtin_byte;
c906108c 676 if (namelen == 7 && memcmp (name, "boolean", 7) == 0)
0daa2b63 677 return builtin->builtin_boolean;
c906108c
SS
678 break;
679 case 'c':
680 if (namelen == 4 && memcmp (name, "char", 4) == 0)
0daa2b63 681 return builtin->builtin_char;
3ef09ab5 682 break;
c906108c
SS
683 case 'd':
684 if (namelen == 6 && memcmp (name, "double", 6) == 0)
0daa2b63 685 return builtin->builtin_double;
c906108c
SS
686 break;
687 case 'f':
688 if (namelen == 5 && memcmp (name, "float", 5) == 0)
0daa2b63 689 return builtin->builtin_float;
c906108c
SS
690 break;
691 case 'i':
692 if (namelen == 3 && memcmp (name, "int", 3) == 0)
0daa2b63 693 return builtin->builtin_int;
c906108c
SS
694 break;
695 case 'l':
696 if (namelen == 4 && memcmp (name, "long", 4) == 0)
0daa2b63 697 return builtin->builtin_long;
c906108c
SS
698 break;
699 case 's':
700 if (namelen == 5 && memcmp (name, "short", 5) == 0)
0daa2b63 701 return builtin->builtin_short;
c906108c
SS
702 break;
703 case 'v':
704 if (namelen == 4 && memcmp (name, "void", 4) == 0)
0daa2b63 705 return builtin->builtin_void;
c906108c
SS
706 break;
707 }
708 return NULL;
709}
710
0daa2b63
UW
711static char *
712java_primitive_type_name (int signature)
713{
714 switch (signature)
715 {
716 case 'B':
717 return "byte";
718 case 'S':
719 return "short";
720 case 'I':
721 return "int";
722 case 'J':
723 return "long";
724 case 'Z':
725 return "boolean";
726 case 'C':
727 return "char";
728 case 'F':
729 return "float";
730 case 'D':
731 return "double";
732 case 'V':
733 return "void";
734 }
735 error (_("unknown signature '%c' for primitive type"), (char) signature);
736}
737
c906108c 738/* Return the length (in bytes) of demangled name of the Java type
1777feb0 739 signature string SIGNATURE. */
c906108c
SS
740
741static int
0d5cff50 742java_demangled_signature_length (const char *signature)
c906108c
SS
743{
744 int array = 0;
e0881a8e 745
c5aa993b 746 for (; *signature == '['; signature++)
1777feb0 747 array += 2; /* Two chars for "[]". */
c906108c
SS
748 switch (signature[0])
749 {
750 case 'L':
1777feb0 751 /* Subtract 2 for 'L' and ';'. */
c906108c
SS
752 return strlen (signature) - 2 + array;
753 default:
0daa2b63 754 return strlen (java_primitive_type_name (signature[0])) + array;
c906108c
SS
755 }
756}
757
1777feb0
MS
758/* Demangle the Java type signature SIGNATURE, leaving the result in
759 RESULT. */
c906108c
SS
760
761static void
0d5cff50 762java_demangled_signature_copy (char *result, const char *signature)
c906108c
SS
763{
764 int array = 0;
765 char *ptr;
766 int i;
e0881a8e 767
c906108c
SS
768 while (*signature == '[')
769 {
770 array++;
771 signature++;
772 }
773 switch (signature[0])
774 {
775 case 'L':
1777feb0 776 /* Subtract 2 for 'L' and ';', but add 1 for final nul. */
c906108c
SS
777 signature++;
778 ptr = result;
c5aa993b 779 for (; *signature != ';' && *signature != '\0'; signature++)
c906108c
SS
780 {
781 if (*signature == '/')
782 *ptr++ = '.';
783 else
784 *ptr++ = *signature;
785 }
786 break;
787 default:
0daa2b63 788 ptr = java_primitive_type_name (signature[0]);
c906108c
SS
789 i = strlen (ptr);
790 strcpy (result, ptr);
791 ptr = result + i;
792 break;
793 }
794 while (--array >= 0)
795 {
796 *ptr++ = '[';
797 *ptr++ = ']';
798 }
799}
800
801/* Return the demangled name of the Java type signature string SIGNATURE,
1777feb0 802 as a freshly allocated copy. */
c906108c
SS
803
804char *
0d5cff50 805java_demangle_type_signature (const char *signature)
c906108c
SS
806{
807 int length = java_demangled_signature_length (signature);
808 char *result = xmalloc (length + 1);
e0881a8e 809
c906108c
SS
810 java_demangled_signature_copy (result, signature);
811 result[length] = '\0';
812 return result;
813}
814
c906108c 815/* Return the type of TYPE followed by DIMS pairs of [ ].
1777feb0 816 If DIMS == 0, TYPE is returned. */
c906108c
SS
817
818struct type *
fba45db2 819java_array_type (struct type *type, int dims)
c906108c 820{
c906108c
SS
821 while (dims-- > 0)
822 {
1777feb0 823 /* FIXME This is bogus! Java arrays are not gdb arrays! */
e3506a9f 824 type = lookup_array_range_type (type, 0, 0);
c906108c
SS
825 }
826
827 return type;
828}
829
1777feb0 830/* Create a Java string in the inferior from a (Utf8) literal. */
c906108c 831
75c9979e 832static struct value *
fba45db2 833java_value_string (char *ptr, int len)
c906108c 834{
8a3fe4f8 835 error (_("not implemented - java_value_string")); /* FIXME */
c906108c
SS
836}
837
127c81bc
TT
838/* Return the encoding that should be used for the character type
839 TYPE. */
840
841static const char *
842java_get_encoding (struct type *type)
843{
844 struct gdbarch *arch = get_type_arch (type);
845 const char *encoding;
846
847 if (type == builtin_java_type (arch)->builtin_char)
848 {
849 if (gdbarch_byte_order (arch) == BFD_ENDIAN_BIG)
850 encoding = "UTF-16BE";
851 else
852 encoding = "UTF-16LE";
853 }
854 else
855 encoding = target_charset (arch);
856
857 return encoding;
858}
859
c906108c
SS
860/* Print the character C on STREAM as part of the contents of a literal
861 string whose delimiter is QUOTER. Note that that format for printing
1777feb0 862 characters and strings is language specific. */
c906108c
SS
863
864static void
6c7a06a3 865java_emit_char (int c, struct type *type, struct ui_file *stream, int quoter)
c906108c 866{
127c81bc
TT
867 const char *encoding = java_get_encoding (type);
868
869 generic_emit_char (c, type, stream, quoter, encoding);
870}
871
872/* Implementation of la_printchar method. */
873
874static void
875java_printchar (int c, struct type *type, struct ui_file *stream)
876{
877 fputs_filtered ("'", stream);
878 LA_EMIT_CHAR (c, type, stream, '\'');
879 fputs_filtered ("'", stream);
880}
881
882/* Implementation of la_printstr method. */
883
884static void
885java_printstr (struct ui_file *stream, struct type *type,
886 const gdb_byte *string,
887 unsigned int length, const char *encoding, int force_ellipses,
888 const struct value_print_options *options)
889{
890 const char *type_encoding = java_get_encoding (type);
891
892 if (!encoding || !*encoding)
893 encoding = type_encoding;
894
895 generic_printstr (stream, type, string, length, encoding,
896 force_ellipses, '"', 0, options);
c906108c
SS
897}
898
75c9979e 899static struct value *
f86f5ca3
PH
900evaluate_subexp_java (struct type *expect_type, struct expression *exp,
901 int *pos, enum noside noside)
c906108c
SS
902{
903 int pc = *pos;
904 int i;
0d5cff50 905 const char *name;
c906108c 906 enum exp_opcode op = exp->elts[*pos].opcode;
75c9979e
AC
907 struct value *arg1;
908 struct value *arg2;
c906108c 909 struct type *type;
e0881a8e 910
c906108c
SS
911 switch (op)
912 {
913 case UNOP_IND:
914 if (noside == EVAL_SKIP)
915 goto standard;
916 (*pos)++;
917 arg1 = evaluate_subexp_java (NULL_TYPE, exp, pos, EVAL_NORMAL);
df407dfe 918 if (is_object_type (value_type (arg1)))
c906108c
SS
919 {
920 struct type *type;
921
0daa2b63 922 type = type_from_class (exp->gdbarch, java_class_from_object (arg1));
c906108c
SS
923 arg1 = value_cast (lookup_pointer_type (type), arg1);
924 }
c906108c
SS
925 return value_ind (arg1);
926
927 case BINOP_SUBSCRIPT:
928 (*pos)++;
929 arg1 = evaluate_subexp_with_coercion (exp, pos, noside);
930 arg2 = evaluate_subexp_with_coercion (exp, pos, noside);
931 if (noside == EVAL_SKIP)
932 goto nosideret;
933 /* If the user attempts to subscript something that is not an
c5aa993b 934 array or pointer type (like a plain int variable for example),
1777feb0 935 then report this as an error. */
c5aa993b 936
994b9211 937 arg1 = coerce_ref (arg1);
df407dfe 938 type = check_typedef (value_type (arg1));
c906108c
SS
939 if (TYPE_CODE (type) == TYPE_CODE_PTR)
940 type = check_typedef (TYPE_TARGET_TYPE (type));
941 name = TYPE_NAME (type);
942 if (name == NULL)
943 name = TYPE_TAG_NAME (type);
944 i = name == NULL ? 0 : strlen (name);
945 if (TYPE_CODE (type) == TYPE_CODE_STRUCT
c5aa993b 946 && i > 2 && name[i - 1] == ']')
c906108c 947 {
e17a4113 948 enum bfd_endian byte_order = gdbarch_byte_order (exp->gdbarch);
c906108c
SS
949 CORE_ADDR address;
950 long length, index;
951 struct type *el_type;
c68a6671 952 gdb_byte buf4[4];
c906108c 953
75c9979e
AC
954 struct value *clas = java_class_from_object (arg1);
955 struct value *temp = clas;
1777feb0 956 /* Get CLASS_ELEMENT_TYPE of the array type. */
c906108c 957 temp = value_struct_elt (&temp, NULL, "methods",
c5aa993b 958 NULL, "structure");
04624583 959 deprecated_set_value_type (temp, value_type (clas));
0daa2b63 960 el_type = type_from_class (exp->gdbarch, temp);
c906108c
SS
961 if (TYPE_CODE (el_type) == TYPE_CODE_STRUCT)
962 el_type = lookup_pointer_type (el_type);
963
964 if (noside == EVAL_AVOID_SIDE_EFFECTS)
965 return value_zero (el_type, VALUE_LVAL (arg1));
1aa20aa8 966 address = value_as_address (arg1);
45d5d5ca 967 address += get_java_object_header_size (exp->gdbarch);
c906108c 968 read_memory (address, buf4, 4);
e17a4113 969 length = (long) extract_signed_integer (buf4, 4, byte_order);
c906108c
SS
970 index = (long) value_as_long (arg2);
971 if (index >= length || index < 0)
8a3fe4f8 972 error (_("array index (%ld) out of bounds (length: %ld)"),
c906108c
SS
973 index, length);
974 address = (address + 4) + index * TYPE_LENGTH (el_type);
00a4c844 975 return value_at (el_type, address);
c906108c
SS
976 }
977 else if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
978 {
979 if (noside == EVAL_AVOID_SIDE_EFFECTS)
980 return value_zero (TYPE_TARGET_TYPE (type), VALUE_LVAL (arg1));
981 else
2497b498 982 return value_subscript (arg1, value_as_long (arg2));
c906108c
SS
983 }
984 if (name)
8a3fe4f8 985 error (_("cannot subscript something of type `%s'"), name);
c906108c 986 else
8a3fe4f8 987 error (_("cannot subscript requested type"));
c906108c
SS
988
989 case OP_STRING:
990 (*pos)++;
991 i = longest_to_int (exp->elts[pc + 1].longconst);
992 (*pos) += 3 + BYTES_TO_EXP_ELEM (i + 1);
993 if (noside == EVAL_SKIP)
994 goto nosideret;
995 return java_value_string (&exp->elts[pc + 2].string, i);
996
dc5000e7 997 case STRUCTOP_PTR:
c906108c 998 arg1 = evaluate_subexp_standard (expect_type, exp, pos, noside);
1777feb0 999 /* Convert object field (such as TYPE.class) to reference. */
df407dfe 1000 if (TYPE_CODE (value_type (arg1)) == TYPE_CODE_STRUCT)
c906108c
SS
1001 arg1 = value_addr (arg1);
1002 return arg1;
1003 default:
1004 break;
1005 }
1006standard:
1007 return evaluate_subexp_standard (expect_type, exp, pos, noside);
c5aa993b 1008nosideret:
22601c15 1009 return value_from_longest (builtin_type (exp->gdbarch)->builtin_int, 1);
c906108c
SS
1010}
1011
9a3d7dfd
AF
1012static char *java_demangle (const char *mangled, int options)
1013{
8de20a37 1014 return gdb_demangle (mangled, options | DMGL_JAVA);
9a3d7dfd
AF
1015}
1016
31c27f77
JJ
1017/* Find the member function name of the demangled name NAME. NAME
1018 must be a method name including arguments, in order to correctly
1019 locate the last component.
1020
1021 This function return a pointer to the first dot before the
1022 member function name, or NULL if the name was not of the
1023 expected form. */
1024
1025static const char *
1026java_find_last_component (const char *name)
1027{
1028 const char *p;
1029
1030 /* Find argument list. */
1031 p = strchr (name, '(');
1032
1033 if (p == NULL)
1034 return NULL;
1035
1036 /* Back up and find first dot prior to argument list. */
1037 while (p > name && *p != '.')
1038 p--;
1039
1040 if (p == name)
1041 return NULL;
1042
1043 return p;
1044}
1045
1046/* Return the name of the class containing method PHYSNAME. */
1047
1048static char *
1049java_class_name_from_physname (const char *physname)
1050{
1051 char *ret = NULL;
1052 const char *end;
31c27f77
JJ
1053 char *demangled_name = java_demangle (physname, DMGL_PARAMS | DMGL_ANSI);
1054
1055 if (demangled_name == NULL)
1056 return NULL;
1057
1058 end = java_find_last_component (demangled_name);
1059 if (end != NULL)
1060 {
1061 ret = xmalloc (end - demangled_name + 1);
1062 memcpy (ret, demangled_name, end - demangled_name);
1063 ret[end - demangled_name] = '\0';
1064 }
1065
1066 xfree (demangled_name);
1067 return ret;
1068}
9a3d7dfd 1069
c906108c
SS
1070/* Table mapping opcodes into strings for printing operators
1071 and precedences of the operators. */
1072
1073const struct op_print java_op_print_tab[] =
c5aa993b
JM
1074{
1075 {",", BINOP_COMMA, PREC_COMMA, 0},
1076 {"=", BINOP_ASSIGN, PREC_ASSIGN, 1},
1077 {"||", BINOP_LOGICAL_OR, PREC_LOGICAL_OR, 0},
1078 {"&&", BINOP_LOGICAL_AND, PREC_LOGICAL_AND, 0},
1079 {"|", BINOP_BITWISE_IOR, PREC_BITWISE_IOR, 0},
1080 {"^", BINOP_BITWISE_XOR, PREC_BITWISE_XOR, 0},
1081 {"&", BINOP_BITWISE_AND, PREC_BITWISE_AND, 0},
1082 {"==", BINOP_EQUAL, PREC_EQUAL, 0},
1083 {"!=", BINOP_NOTEQUAL, PREC_EQUAL, 0},
1084 {"<=", BINOP_LEQ, PREC_ORDER, 0},
1085 {">=", BINOP_GEQ, PREC_ORDER, 0},
1086 {">", BINOP_GTR, PREC_ORDER, 0},
1087 {"<", BINOP_LESS, PREC_ORDER, 0},
1088 {">>", BINOP_RSH, PREC_SHIFT, 0},
1089 {"<<", BINOP_LSH, PREC_SHIFT, 0},
c5aa993b
JM
1090 {"+", BINOP_ADD, PREC_ADD, 0},
1091 {"-", BINOP_SUB, PREC_ADD, 0},
1092 {"*", BINOP_MUL, PREC_MUL, 0},
1093 {"/", BINOP_DIV, PREC_MUL, 0},
1094 {"%", BINOP_REM, PREC_MUL, 0},
1095 {"-", UNOP_NEG, PREC_PREFIX, 0},
1096 {"!", UNOP_LOGICAL_NOT, PREC_PREFIX, 0},
1097 {"~", UNOP_COMPLEMENT, PREC_PREFIX, 0},
1098 {"*", UNOP_IND, PREC_PREFIX, 0},
c5aa993b
JM
1099 {"++", UNOP_PREINCREMENT, PREC_PREFIX, 0},
1100 {"--", UNOP_PREDECREMENT, PREC_PREFIX, 0},
1101 {NULL, 0, 0, 0}
c906108c
SS
1102};
1103
de7b6b47
UW
1104enum java_primitive_types
1105{
1106 java_primitive_type_int,
1107 java_primitive_type_short,
1108 java_primitive_type_long,
1109 java_primitive_type_byte,
1110 java_primitive_type_boolean,
1111 java_primitive_type_char,
1112 java_primitive_type_float,
1113 java_primitive_type_double,
1114 java_primitive_type_void,
1115 nr_java_primitive_types
1116};
1117
2c0b251b 1118static void
de7b6b47
UW
1119java_language_arch_info (struct gdbarch *gdbarch,
1120 struct language_arch_info *lai)
1121{
0daa2b63
UW
1122 const struct builtin_java_type *builtin = builtin_java_type (gdbarch);
1123
1124 lai->string_char_type = builtin->builtin_char;
de7b6b47
UW
1125 lai->primitive_type_vector
1126 = GDBARCH_OBSTACK_CALLOC (gdbarch, nr_java_primitive_types + 1,
1127 struct type *);
1128 lai->primitive_type_vector [java_primitive_type_int]
0daa2b63 1129 = builtin->builtin_int;
de7b6b47 1130 lai->primitive_type_vector [java_primitive_type_short]
0daa2b63 1131 = builtin->builtin_short;
de7b6b47 1132 lai->primitive_type_vector [java_primitive_type_long]
0daa2b63 1133 = builtin->builtin_long;
de7b6b47 1134 lai->primitive_type_vector [java_primitive_type_byte]
0daa2b63 1135 = builtin->builtin_byte;
de7b6b47 1136 lai->primitive_type_vector [java_primitive_type_boolean]
0daa2b63 1137 = builtin->builtin_boolean;
de7b6b47 1138 lai->primitive_type_vector [java_primitive_type_char]
0daa2b63 1139 = builtin->builtin_char;
de7b6b47 1140 lai->primitive_type_vector [java_primitive_type_float]
0daa2b63 1141 = builtin->builtin_float;
de7b6b47 1142 lai->primitive_type_vector [java_primitive_type_double]
0daa2b63 1143 = builtin->builtin_double;
de7b6b47 1144 lai->primitive_type_vector [java_primitive_type_void]
0daa2b63 1145 = builtin->builtin_void;
fbb06eb1
UW
1146
1147 lai->bool_type_symbol = "boolean";
0daa2b63 1148 lai->bool_type_default = builtin->builtin_boolean;
de7b6b47
UW
1149}
1150
5f9769d1
PH
1151const struct exp_descriptor exp_descriptor_java =
1152{
1153 print_subexp_standard,
1154 operator_length_standard,
c0201579 1155 operator_check_standard,
5f9769d1
PH
1156 op_name_standard,
1157 dump_subexp_body_standard,
1158 evaluate_subexp_java
1159};
1160
c5aa993b
JM
1161const struct language_defn java_language_defn =
1162{
1163 "java", /* Language name */
c906108c 1164 language_java,
c906108c 1165 range_check_off,
63872f9d 1166 case_sensitive_on,
7ca2d3a3 1167 array_row_major,
9a044a89 1168 macro_expansion_no,
5f9769d1 1169 &exp_descriptor_java,
c906108c
SS
1170 java_parse,
1171 java_error,
e85c3284 1172 null_post_parser,
127c81bc
TT
1173 java_printchar, /* Print a character constant */
1174 java_printstr, /* Function to print string constant */
c906108c 1175 java_emit_char, /* Function to print a single character */
c906108c 1176 java_print_type, /* Print a type using appropriate syntax */
5c6ce71d 1177 default_print_typedef, /* Print a typedef using appropriate syntax */
c906108c
SS
1178 java_val_print, /* Print a value using appropriate syntax */
1179 java_value_print, /* Print a top-level value */
a5ee536b 1180 default_read_var_value, /* la_read_var_value */
f636b87d 1181 NULL, /* Language specific skip_trampoline */
2b2d9e11 1182 "this", /* name_of_this */
5f9a71c3 1183 basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
b368761e 1184 basic_lookup_transparent_type,/* lookup_transparent_type */
9a3d7dfd 1185 java_demangle, /* Language specific symbol demangler */
31c27f77 1186 java_class_name_from_physname,/* Language specific class name */
c906108c
SS
1187 java_op_print_tab, /* expression operators for printing */
1188 0, /* not c-style arrays */
1189 0, /* String lower bound */
6084f43a 1190 default_word_break_characters,
41d27058 1191 default_make_symbol_completion_list,
de7b6b47 1192 java_language_arch_info,
e79af960 1193 default_print_array_index,
41f1b697 1194 default_pass_by_reference,
ae6a3a4c 1195 default_get_string,
1a119f36 1196 NULL, /* la_get_symbol_name_cmp */
f8eba3c6 1197 iterate_over_symbols,
c906108c
SS
1198 LANG_MAGIC
1199};
1200
0daa2b63
UW
1201static void *
1202build_java_types (struct gdbarch *gdbarch)
1203{
1204 struct builtin_java_type *builtin_java_type
1205 = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct builtin_java_type);
1206
1207 builtin_java_type->builtin_int
e9bb382b 1208 = arch_integer_type (gdbarch, 32, 0, "int");
0daa2b63 1209 builtin_java_type->builtin_short
e9bb382b 1210 = arch_integer_type (gdbarch, 16, 0, "short");
0daa2b63 1211 builtin_java_type->builtin_long
e9bb382b 1212 = arch_integer_type (gdbarch, 64, 0, "long");
0daa2b63 1213 builtin_java_type->builtin_byte
e9bb382b 1214 = arch_integer_type (gdbarch, 8, 0, "byte");
0daa2b63 1215 builtin_java_type->builtin_boolean
e9bb382b 1216 = arch_boolean_type (gdbarch, 8, 0, "boolean");
0daa2b63 1217 builtin_java_type->builtin_char
e9bb382b 1218 = arch_character_type (gdbarch, 16, 1, "char");
0daa2b63 1219 builtin_java_type->builtin_float
e9bb382b 1220 = arch_float_type (gdbarch, 32, "float", NULL);
0daa2b63 1221 builtin_java_type->builtin_double
e9bb382b 1222 = arch_float_type (gdbarch, 64, "double", NULL);
0daa2b63 1223 builtin_java_type->builtin_void
e9bb382b 1224 = arch_type (gdbarch, TYPE_CODE_VOID, 1, "void");
0daa2b63
UW
1225
1226 return builtin_java_type;
1227}
1228
1229static struct gdbarch_data *java_type_data;
1230
1231const struct builtin_java_type *
1232builtin_java_type (struct gdbarch *gdbarch)
1233{
1234 return gdbarch_data (gdbarch, java_type_data);
1235}
1236
c906108c 1237void
fba45db2 1238_initialize_java_language (void)
c906108c 1239{
20781792
TT
1240 jv_dynamics_objfile_data_key
1241 = register_objfile_data_with_cleanup (NULL, jv_per_objfile_free);
86cc0029 1242 jv_dynamics_progspace_key = register_program_space_data ();
20781792 1243
0daa2b63 1244 java_type_data = gdbarch_data_register_post_init (build_java_types);
c906108c
SS
1245
1246 add_language (&java_language_defn);
1247}