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