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