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