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