* jv-lang.c (get_java_utf8_name): Re-write so it works with
[external/binutils.git] / gdb / jv-lang.c
1 /* Java language support routines for GDB, the GNU debugger.
2    Copyright 1997 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, Boston, MA 02111-1307, USA.  */
19
20 #include "defs.h"
21 #include "symtab.h"
22 #include "gdbtypes.h"
23 #include "expression.h"
24 #include "parser-defs.h"
25 #include "language.h"
26 #include "gdbtypes.h"
27 #include "symtab.h"
28 #include "symfile.h"
29 #include "objfiles.h"
30 #include "gdb_string.h"
31 #include "value.h"
32 #include "c-lang.h"
33 #include "jv-lang.h"
34 #include "gdbcore.h"
35
36 struct type *java_int_type;
37 struct type *java_byte_type;
38 struct type *java_short_type;
39 struct type *java_long_type;
40 struct type *java_boolean_type;
41 struct type *java_char_type;
42 struct type *java_float_type;
43 struct type *java_double_type;
44 struct type *java_void_type;
45
46 struct type *java_object_type;
47
48 /* This objfile contains symtabs that have been dynamically created
49    to record dynamically loaded Java classes and dynamically
50    compiled java methods. */
51 struct objfile *dynamics_objfile = NULL;
52
53 struct type *java_link_class_type PARAMS((struct type*, value_ptr));
54
55 struct objfile *
56 get_dynamics_objfile ()
57 {
58   if (dynamics_objfile == NULL)
59     {
60       dynamics_objfile = allocate_objfile (NULL, 0);
61     }
62   return dynamics_objfile;
63 }
64
65 #if 1
66 /* symtab contains classes read from the inferior. */
67
68 static struct symtab *class_symtab = NULL;
69
70 /* Maximum number of class in class_symtab before relocation is needed. */
71
72 static int class_symtab_space;
73
74 struct symtab *
75 get_java_class_symtab ()
76 {
77   if (class_symtab == NULL)
78     {
79       struct objfile *objfile = get_dynamics_objfile();
80       struct blockvector *bv;
81       struct block *bl;
82       class_symtab = allocate_symtab ("<java-classes>", objfile);
83       class_symtab->language = language_java;
84       bv = (struct blockvector *)
85         obstack_alloc (&objfile->symbol_obstack, sizeof (struct blockvector));
86       BLOCKVECTOR_NBLOCKS (bv) = 1;
87       BLOCKVECTOR (class_symtab) = bv;
88
89       /* Allocate dummy STATIC_BLOCK. */
90       bl = (struct block *)
91         obstack_alloc (&objfile->symbol_obstack, sizeof (struct block));
92       BLOCK_NSYMS (bl) = 0;
93       BLOCK_START (bl) = 0;
94       BLOCK_END (bl) = 0;
95       BLOCK_FUNCTION (bl) = NULL;
96       BLOCK_SUPERBLOCK (bl) = NULL;
97       BLOCK_GCC_COMPILED (bl) = 0;
98       BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK) = bl;
99
100       /* Allocate GLOBAL_BLOCK.  This has to be relocatable. */
101       class_symtab_space = 128;
102       bl = (struct block *)
103         mmalloc (objfile->md,
104                  sizeof (struct block)
105                  + ((class_symtab_space - 1) * sizeof (struct symbol *)));
106       *bl = *BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
107       BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK) = bl;
108       class_symtab->free_ptr = (char *) bl;
109     }
110   return class_symtab;
111 }
112
113 static void
114 add_class_symtab_symbol (sym)
115      struct symbol *sym;
116 {
117   struct symtab *symtab = get_java_class_symtab ();
118   struct blockvector *bv = BLOCKVECTOR (symtab);
119   struct block *bl = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
120   if (BLOCK_NSYMS (bl) >= class_symtab_space)
121     {
122       /* Need to re-allocate. */
123       class_symtab_space *= 2;
124       bl = (struct block *)
125         mrealloc (symtab->objfile->md, bl,
126                   sizeof (struct block)
127                   + ((class_symtab_space - 1) * sizeof (struct symbol *)));
128       class_symtab->free_ptr = (char *) bl;
129       BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK) = bl;
130     }
131   
132   BLOCK_SYM (bl, BLOCK_NSYMS (bl)) = sym;
133   BLOCK_NSYMS (bl) = BLOCK_NSYMS (bl) + 1;
134 }
135
136 struct symbol *
137 add_class_symbol (type, addr)
138      struct type *type;
139      CORE_ADDR addr;
140 {
141   struct symbol *sym;
142   sym = (struct symbol *)
143     obstack_alloc (&dynamics_objfile->symbol_obstack, sizeof (struct symbol));
144   memset (sym, 0, sizeof (struct symbol));
145   SYMBOL_LANGUAGE (sym) = language_java;
146   SYMBOL_NAME (sym) = TYPE_NAME (type);
147   SYMBOL_CLASS (sym) = LOC_TYPEDEF;
148   /*  SYMBOL_VALUE (sym) = valu;*/
149   SYMBOL_TYPE (sym) = type;
150   SYMBOL_NAMESPACE (sym) = STRUCT_NAMESPACE;
151   SYMBOL_VALUE_ADDRESS (sym) = addr;
152   return sym;
153 }
154 #endif
155
156 struct type *
157 java_lookup_class (name)
158      char *name;
159 {
160   struct symbol *sym;
161   sym = lookup_symbol (name, expression_context_block, STRUCT_NAMESPACE,
162                        (int *) 0, (struct symtab **) NULL);
163   if (sym != NULL)
164     return SYMBOL_TYPE (sym);
165 #if 0
166   CORE_ADDR addr;
167   if (called from parser)
168     {
169       call lookup_class (or similar) in inferior;
170       if not found:
171         return NULL;
172       addr = found in inferior;
173     }
174   else
175     addr = 0;
176   struct type *type;
177   type = alloc_type (objfile);
178   TYPE_CODE (type) = TYPE_CODE_STRUCT;
179   INIT_CPLUS_SPECIFIC (type);
180   TYPE_NAME (type) = obsavestring (name, strlen(name), &objfile->type_obstack);
181   TYPE_FLAGS (type) |= TYPE_FLAG_STUB;
182   TYPE ? = addr;
183   return type;
184 #else
185   /* FIXME - should search inferior's symbol table. */
186   return NULL;
187 #endif
188 }
189
190 /* Return a nul-terminated string (allocated on OBSTACK) for
191    a name given by NAME (which has type Utf8Const*). */
192
193 char *
194 get_java_utf8_name (obstack, name)
195      struct obstack *obstack;
196      value_ptr name;
197 {
198   char *chrs;
199   value_ptr temp = name;
200   int name_length;
201   CORE_ADDR data_addr;
202   temp = value_struct_elt (&temp, NULL, "length", NULL, "structure");
203   name_length = (int) value_as_long (temp);
204   data_addr = VALUE_ADDRESS (temp) + VALUE_OFFSET (temp)
205     + TYPE_LENGTH (VALUE_TYPE (temp));
206   chrs = obstack_alloc (obstack, name_length+1);
207   chrs [name_length] = '\0';
208   read_memory_section (data_addr, chrs, name_length, NULL);
209   return chrs;
210 }
211
212 value_ptr
213 java_class_from_object (obj_val)
214      value_ptr obj_val;
215 {
216   value_ptr dtable_val = value_struct_elt (&obj_val, NULL, "dtable", NULL, "structure");
217   return value_struct_elt (&dtable_val, NULL, "class", NULL, "structure");
218 }
219
220 /* Check if CLASS_IS_PRIMITIVE(value of clas): */
221 int
222 java_class_is_primitive (clas)
223      value_ptr clas;
224 {
225   value_ptr dtable = value_struct_elt (&clas, NULL, "dtable", NULL, "struct");
226   CORE_ADDR i = value_as_pointer (dtable);
227   return (int) (i & 0x7fffffff) == (int) 0x7fffffff;
228 }
229
230 /* Read a Kaffe Class object, and generated a gdb (TYPE_CODE_STRUCT) type. */
231
232 struct type *
233 type_from_class (clas)
234      value_ptr clas;
235 {
236   struct type *type;
237   char *name;
238   value_ptr temp;
239   struct objfile *objfile = get_dynamics_objfile();
240   value_ptr utf8_name;
241   char *nptr;
242   CORE_ADDR addr;
243   struct block *bl;
244   int i;
245   int is_array = 0;
246
247   type = check_typedef (VALUE_TYPE (clas));
248   if (TYPE_CODE (type) == TYPE_CODE_PTR)
249     {
250       if (value_logical_not (clas))
251         return NULL;
252       clas = value_ind (clas);
253     }
254   addr = VALUE_ADDRESS (clas) + VALUE_OFFSET (clas);
255
256   get_java_class_symtab ();
257   bl = BLOCKVECTOR_BLOCK (BLOCKVECTOR (class_symtab), GLOBAL_BLOCK);
258   for (i = BLOCK_NSYMS (bl);  --i >= 0; )
259     {
260       struct symbol *sym = BLOCK_SYM (bl, i);
261       if (SYMBOL_VALUE_ADDRESS (sym) == addr)
262         return SYMBOL_TYPE (sym);
263     }
264
265   if (java_class_is_primitive (clas))
266     {
267       value_ptr sig;
268       temp = clas;
269       sig = value_struct_elt (&temp, NULL, "msize", NULL, "structure");
270       return java_primitive_type (value_as_long (sig));
271     }
272
273   /* Get Class name. */
274   /* if clasloader non-null, prepend loader address. FIXME */
275   temp = clas;
276   utf8_name = value_struct_elt (&temp, NULL, "name", NULL, "structure");
277   name = get_java_utf8_name (&objfile->type_obstack, utf8_name);
278
279   type = alloc_type (objfile);
280   TYPE_CODE (type) = TYPE_CODE_STRUCT;
281   INIT_CPLUS_SPECIFIC (type);
282
283   if (name[0] == '[')
284     {
285       is_array = 1;
286       temp = clas;
287       /* Set array element type. */
288       temp = value_struct_elt (&temp, NULL, "methods", NULL, "structure");
289       VALUE_TYPE (temp) = lookup_pointer_type (VALUE_TYPE (clas));
290       TYPE_TARGET_TYPE (type) = type_from_class (temp);
291     }
292   for (nptr = name;  *nptr != 0;  nptr++)
293     {
294       if (*nptr == '/')
295         *nptr = '.';
296     }
297
298   ALLOCATE_CPLUS_STRUCT_TYPE (type);
299   TYPE_NAME (type) = name;
300
301   add_class_symtab_symbol (add_class_symbol (type, addr));
302   return java_link_class_type (type, clas);
303 }
304
305 /* Fill in class TYPE with data from the CLAS value. */ 
306
307 struct type *
308 java_link_class_type (type, clas)
309      struct type *type;
310      value_ptr clas;
311 {
312   value_ptr temp;
313   char *unqualified_name;
314   char *name = TYPE_NAME (type);
315   int ninterfaces, nfields, nmethods;
316   int type_is_object = 0;
317   struct fn_field *fn_fields;
318   struct fn_fieldlist *fn_fieldlists;
319   value_ptr fields, field, method, methods;
320   int i, j;
321   struct objfile *objfile = get_dynamics_objfile();
322   struct type *tsuper;
323
324   unqualified_name = strrchr (name, '.');
325   if (unqualified_name == NULL)
326     unqualified_name = name;
327
328   temp = clas;
329   temp = value_struct_elt (&temp, NULL, "superclass", NULL, "structure");
330   if (name != NULL && strcmp (name, "java.lang.Object") == 0)
331     {
332       tsuper = get_java_object_type ();
333       if (tsuper && TYPE_CODE (tsuper) == TYPE_CODE_PTR)
334         tsuper = TYPE_TARGET_TYPE (tsuper);
335       type_is_object = 1;
336     }
337   else
338     tsuper = type_from_class (temp);
339
340 #if 1
341   ninterfaces = 0;
342 #else
343   temp = clas;
344   ninterfaces = value_as_long (value_struct_elt (&temp, NULL, "interface_len", NULL, "structure"));
345 #endif
346   TYPE_N_BASECLASSES (type) = (tsuper == NULL ? 0 : 1) + ninterfaces;
347   temp = clas;
348   nfields = value_as_long (value_struct_elt (&temp, NULL, "nfields", NULL, "structure"));
349   nfields += TYPE_N_BASECLASSES (type);
350   TYPE_NFIELDS (type) = nfields;
351   TYPE_FIELDS (type) = (struct field *)
352     TYPE_ALLOC (type, sizeof (struct field) * nfields);
353
354   memset (TYPE_FIELDS (type), 0, sizeof (struct field) * nfields);
355
356   TYPE_FIELD_PRIVATE_BITS (type) =
357     (B_TYPE *) TYPE_ALLOC (type, B_BYTES (nfields));
358   B_CLRALL (TYPE_FIELD_PRIVATE_BITS (type), nfields);
359
360   TYPE_FIELD_PROTECTED_BITS (type) =
361     (B_TYPE *) TYPE_ALLOC (type, B_BYTES (nfields));
362   B_CLRALL (TYPE_FIELD_PROTECTED_BITS (type), nfields);
363
364   TYPE_FIELD_IGNORE_BITS (type) =
365     (B_TYPE *) TYPE_ALLOC (type, B_BYTES (nfields));
366   B_CLRALL (TYPE_FIELD_IGNORE_BITS (type), nfields);
367
368   TYPE_FIELD_VIRTUAL_BITS (type) = (B_TYPE *)
369     TYPE_ALLOC (type, B_BYTES (TYPE_N_BASECLASSES (type)));
370   B_CLRALL (TYPE_FIELD_VIRTUAL_BITS (type), TYPE_N_BASECLASSES (type));
371
372   if (tsuper != NULL)
373     {
374       TYPE_BASECLASS (type, 0) = tsuper;
375       if (type_is_object)
376         SET_TYPE_FIELD_PRIVATE (type, 0);
377     }
378
379
380   temp = clas;
381   temp = value_struct_elt (&temp, NULL, "bfsize", NULL, "structure");
382   TYPE_LENGTH (type) = value_as_long (temp);
383
384   fields = NULL;
385   for (i = TYPE_N_BASECLASSES (type);  i < nfields;  i++)
386     {
387       int accflags;
388       int boffset;
389       if (fields == NULL)
390         {
391           temp = clas;
392           fields = value_struct_elt (&temp, NULL, "fields", NULL, "structure");
393           field = value_ind (fields);
394         }
395       else
396         { /* Re-use field value for next field. */
397           VALUE_ADDRESS (field) += TYPE_LENGTH (VALUE_TYPE (field));
398           VALUE_LAZY (field) = 1;
399         }
400       temp = field;
401       temp = value_struct_elt (&temp, NULL, "name", NULL, "structure");
402       TYPE_FIELD_NAME (type, i) =
403         get_java_utf8_name (&objfile->type_obstack, temp);
404       temp = field;
405       accflags = value_as_long (value_struct_elt (&temp, NULL, "accflags",
406                                                   NULL, "structure"));
407       temp = field;
408       temp = value_struct_elt (&temp, NULL, "info", NULL, "structure");
409       boffset = value_as_long (value_struct_elt (&temp, NULL, "boffset",
410                                                   NULL, "structure"));
411       if (accflags & 0x0001) /* public access */
412         {
413           /* ??? */
414         }
415       if (accflags & 0x0002) /* private access */
416         {
417           SET_TYPE_FIELD_PRIVATE (type, i);
418         }
419       if (accflags & 0x0004) /* protected access */
420         {
421           SET_TYPE_FIELD_PROTECTED (type, i);
422         }
423       if (accflags & 0x0008)  /* ACC_STATIC */
424         SET_FIELD_PHYSADDR(TYPE_FIELD(type, i), boffset);
425       else
426         TYPE_FIELD_BITPOS (type, i) = 8 * boffset;
427       if (accflags & 0x8000) /* FIELD_UNRESOLVED_FLAG */
428         {
429           TYPE_FIELD_TYPE (type, i) = get_java_object_type (); /* FIXME */
430         }
431       else
432         {
433           struct type *ftype;
434           temp = field;
435           temp = value_struct_elt (&temp, NULL, "type", NULL, "structure");
436           ftype = type_from_class (temp);
437           if (TYPE_CODE (ftype) == TYPE_CODE_STRUCT)
438             ftype = lookup_pointer_type (ftype);
439           TYPE_FIELD_TYPE (type, i) = ftype;
440         }
441     }
442
443   temp = clas;
444   nmethods = value_as_long (value_struct_elt (&temp, NULL, "nmethods",
445                                               NULL, "structure"));
446   TYPE_NFN_FIELDS_TOTAL (type) = nmethods;
447   j = nmethods * sizeof (struct fn_field);
448   fn_fields = (struct fn_field*)
449     obstack_alloc (&dynamics_objfile->symbol_obstack, j);
450   memset (fn_fields, 0, j);
451   fn_fieldlists = (struct fn_fieldlist*)
452     alloca (nmethods * sizeof (struct fn_fieldlist));
453
454   methods = NULL;
455   for (i = 0;  i < nmethods;  i++)
456     {
457       char *mname;
458       int k;
459       if (methods == NULL)
460         {
461           temp = clas;
462           methods = value_struct_elt (&temp, NULL, "methods", NULL, "structure");
463           method = value_ind (methods);
464         }
465       else
466         { /* Re-use method value for next method. */
467           VALUE_ADDRESS (method) += TYPE_LENGTH (VALUE_TYPE (method));
468           VALUE_LAZY (method) = 1;
469         }
470
471       /* Get method name. */
472       temp = method;
473       temp = value_struct_elt (&temp, NULL, "name", NULL, "structure");
474       mname = get_java_utf8_name (&objfile->type_obstack, temp);
475       if (strcmp (mname, "<init>") == 0)
476         mname = unqualified_name;
477
478       /* Check for an existing method with the same name.
479        * This makes building the fn_fieldslists an O(nmethods**2)
480        * operation.  That could be using hashing, but I doubt it
481        * is worth it.  Note that we do maintain the order of methods
482        * in the inferior's Method table (as long as that is grouped
483        * by method name), which I think is desirable.  --PB */
484       for (k = 0, j = TYPE_NFN_FIELDS (type);  ; )
485         {
486           if (--j < 0)
487             { /* No match - new method name. */
488               j = TYPE_NFN_FIELDS(type)++;
489               fn_fieldlists[j].name = mname;
490               fn_fieldlists[j].length = 1;
491               fn_fieldlists[j].fn_fields = &fn_fields[i];
492               k = i;
493               break;
494             }
495           if (strcmp (mname, fn_fieldlists[j].name) == 0)
496             { /* Found an existing method with the same name. */
497               int l;
498               if (mname != unqualified_name)
499                 obstack_free (&objfile->type_obstack, mname);
500               mname = fn_fieldlists[j].name;
501               fn_fieldlists[j].length++;
502               k = i - k;  /* Index of new slot. */
503               /* Shift intervening fn_fields (between k and i) down. */
504               for (l = i;  l > k;  l--) fn_fields[l] = fn_fields[l-1];
505               for (l = TYPE_NFN_FIELDS (type);  --l > j; )
506                 fn_fieldlists[l].fn_fields++;
507               break;
508             }
509           k += fn_fieldlists[j].length;
510         }
511       fn_fields[k].physname = "";
512       fn_fields[k].is_stub = 1;
513       fn_fields[k].type = make_function_type (java_void_type, NULL); /* FIXME*/
514       TYPE_CODE (fn_fields[k].type) = TYPE_CODE_METHOD;
515     }
516
517   j = TYPE_NFN_FIELDS(type) * sizeof (struct fn_fieldlist);
518   TYPE_FN_FIELDLISTS (type) = (struct fn_fieldlist*)
519     obstack_alloc (&dynamics_objfile->symbol_obstack, j);
520   memcpy (TYPE_FN_FIELDLISTS (type), fn_fieldlists, j);
521  
522   return type;
523 }
524
525 struct type*
526 get_java_object_type ()
527 {
528   return java_object_type;
529 }
530
531 int
532 is_object_type (type)
533      struct type *type;
534 {
535   CHECK_TYPEDEF (type);
536   if (TYPE_CODE (type) == TYPE_CODE_PTR)
537     {
538       struct type *ttype = check_typedef (TYPE_TARGET_TYPE (type));
539       char *name;
540       if (TYPE_CODE (ttype) != TYPE_CODE_STRUCT)
541         return 0;
542       while (TYPE_N_BASECLASSES (ttype) > 0)
543         ttype = TYPE_BASECLASS (ttype, 0);
544       name = TYPE_NAME (ttype);
545       if (name != NULL && strcmp (name, "java.lang.Object") == 0)
546         return 1;
547       name = TYPE_NFIELDS (ttype) > 0 ? TYPE_FIELD_NAME (ttype, 0) : (char*)0;
548       if (name != NULL && strcmp (name, "dtable") == 0)
549         {
550           if (java_object_type == NULL)
551             java_object_type = type;
552           return 1;
553         }
554     }
555   return 0;
556 }
557
558 struct type*
559 java_primitive_type (signature)
560      int signature;
561 {
562   switch (signature)
563     {
564     case 'B':  return java_byte_type;
565     case 'S':  return java_short_type;
566     case 'I':  return java_int_type;
567     case 'J':  return java_long_type;
568     case 'Z':  return java_boolean_type;
569     case 'C':  return java_char_type;
570     case 'F':  return java_float_type;
571     case 'D':  return java_double_type;
572     case 'V':  return java_void_type;
573     }
574   error ("unknown signature '%c' for primitive type", (char) signature);
575 }
576
577 /* Return the type of TYPE followed by DIMS pairs of [ ].
578    If DIMS == 0, TYPE is returned. */
579
580 struct type *
581 java_array_type (type, dims)
582      struct type *type;
583      int dims;
584 {
585   if (dims == 0)
586     return type;
587   error ("array types not implemented");
588 }
589
590 /* Create a Java string in the inferior from a (Utf8) literal. */
591
592 value_ptr
593 java_value_string (ptr, len)
594      char *ptr;
595      int len;
596 {
597   error ("not implemented - java_value_string"); /* FIXME */
598 }
599
600 static value_ptr
601 evaluate_subexp_java (expect_type, exp, pos, noside)
602      struct type *expect_type;
603      register struct expression *exp;
604      register int *pos;
605      enum noside noside;
606 {
607   int pc = *pos;
608   int i;
609   enum exp_opcode op = exp->elts[*pos].opcode;
610   value_ptr arg1;
611   switch (op)
612     {
613     case UNOP_IND:
614       if (noside == EVAL_SKIP)
615         goto standard;
616       (*pos)++;
617       arg1 = evaluate_subexp_standard (expect_type, exp, pos, EVAL_NORMAL);
618       if (is_object_type (VALUE_TYPE (arg1)))
619         {
620           struct type *type = type_from_class (java_class_from_object (arg1));
621           arg1 = value_cast (lookup_pointer_type (type), arg1);
622         }
623       if (noside == EVAL_SKIP)
624         goto nosideret;
625       return value_ind (arg1);
626     case OP_STRING:
627       (*pos)++;
628       i = longest_to_int (exp->elts[pc + 1].longconst);
629       (*pos) += 3 + BYTES_TO_EXP_ELEM (i + 1);
630       if (noside == EVAL_SKIP)
631         goto nosideret;
632       return java_value_string (&exp->elts[pc + 2].string, i);
633     default:
634       break;
635     }
636 standard:
637   return evaluate_subexp_standard (expect_type, exp, pos, noside);
638  nosideret:
639   return value_from_longest (builtin_type_long, (LONGEST) 1);
640 }
641
642 static struct type *
643 java_create_fundamental_type (objfile, typeid)
644      struct objfile *objfile;
645      int typeid;
646 {
647   switch (typeid)
648     {
649     case FT_VOID:           return java_void_type;
650     case FT_BOOLEAN:        return java_boolean_type;
651     case FT_CHAR:           return java_char_type;
652     case FT_FLOAT:          return java_float_type;
653     case FT_DBL_PREC_FLOAT: return java_double_type;
654     case FT_BYTE: case FT_SIGNED_CHAR:       return java_byte_type;
655     case FT_SHORT: case FT_SIGNED_SHORT:     return java_short_type;
656     case FT_INTEGER: case FT_SIGNED_INTEGER: return java_int_type;
657     case FT_LONG: case FT_SIGNED_LONG:       return java_long_type;
658     }
659   return c_create_fundamental_type (objfile, typeid);
660 }
661
662 /* Table mapping opcodes into strings for printing operators
663    and precedences of the operators.  */
664
665 const struct op_print java_op_print_tab[] =
666   {
667     {",",  BINOP_COMMA, PREC_COMMA, 0},
668     {"=",  BINOP_ASSIGN, PREC_ASSIGN, 1},
669     {"||", BINOP_LOGICAL_OR, PREC_LOGICAL_OR, 0},
670     {"&&", BINOP_LOGICAL_AND, PREC_LOGICAL_AND, 0},
671     {"|",  BINOP_BITWISE_IOR, PREC_BITWISE_IOR, 0},
672     {"^",  BINOP_BITWISE_XOR, PREC_BITWISE_XOR, 0},
673     {"&",  BINOP_BITWISE_AND, PREC_BITWISE_AND, 0},
674     {"==", BINOP_EQUAL, PREC_EQUAL, 0},
675     {"!=", BINOP_NOTEQUAL, PREC_EQUAL, 0},
676     {"<=", BINOP_LEQ, PREC_ORDER, 0},
677     {">=", BINOP_GEQ, PREC_ORDER, 0},
678     {">",  BINOP_GTR, PREC_ORDER, 0},
679     {"<",  BINOP_LESS, PREC_ORDER, 0},
680     {">>", BINOP_RSH, PREC_SHIFT, 0},
681     {"<<", BINOP_LSH, PREC_SHIFT, 0},
682 #if 0
683     {">>>", BINOP_???, PREC_SHIFT, 0},
684 #endif
685     {"+",  BINOP_ADD, PREC_ADD, 0},
686     {"-",  BINOP_SUB, PREC_ADD, 0},
687     {"*",  BINOP_MUL, PREC_MUL, 0},
688     {"/",  BINOP_DIV, PREC_MUL, 0},
689     {"%",  BINOP_REM, PREC_MUL, 0},
690     {"-",  UNOP_NEG, PREC_PREFIX, 0},
691     {"!",  UNOP_LOGICAL_NOT, PREC_PREFIX, 0},
692     {"~",  UNOP_COMPLEMENT, PREC_PREFIX, 0},
693     {"*",  UNOP_IND, PREC_PREFIX, 0},
694 #if 0
695     {"instanceof", ???, ???, 0},
696 #endif
697     {"++", UNOP_PREINCREMENT, PREC_PREFIX, 0},
698     {"--", UNOP_PREDECREMENT, PREC_PREFIX, 0},
699     {NULL, 0, 0, 0}
700 };
701
702 const struct language_defn java_language_defn = {
703   "java",                               /* Language name */
704   language_java,
705   c_builtin_types,
706   range_check_off,
707   type_check_off,
708   java_parse,
709   java_error,
710   evaluate_subexp_java,
711   c_printchar,                  /* Print a character constant */
712   c_printstr,                   /* Function to print string constant */
713   java_create_fundamental_type, /* Create fundamental type in this language */
714   java_print_type,              /* Print a type using appropriate syntax */
715   java_val_print,               /* Print a value using appropriate syntax */
716   java_value_print,             /* Print a top-level value */
717   {"",      "",    "",   ""},   /* Binary format info */
718   {"0%lo",   "0",   "o",  ""},  /* Octal format info */
719   {"%ld",    "",    "d",  ""},  /* Decimal format info */
720   {"0x%lx",  "0x",  "x",  ""},  /* Hex format info */
721   java_op_print_tab,            /* expression operators for printing */
722   1,                            /* c-style arrays */
723   0,                            /* String lower bound */
724   &builtin_type_char,           /* Type of string elements */ 
725   LANG_MAGIC
726 };
727
728 void
729 _initialize_jave_language ()
730 {
731
732   java_int_type    = init_type (TYPE_CODE_INT,  4, 0, "int", NULL);
733   java_short_type  = init_type (TYPE_CODE_INT,  2, 0, "short", NULL);
734   java_long_type   = init_type (TYPE_CODE_INT,  8, 0, "long", NULL);
735   java_byte_type   = init_type (TYPE_CODE_INT,  1, 0, "byte", NULL);
736   java_boolean_type= init_type (TYPE_CODE_BOOL, 1, 0, "boolean", NULL);
737   java_char_type   = init_type (TYPE_CODE_CHAR, 2, 0, "char", NULL);
738   java_float_type  = init_type (TYPE_CODE_FLT,  4, 0, "float", NULL);
739   java_double_type = init_type (TYPE_CODE_FLT,  8, 0, "double", NULL);
740   java_void_type   = init_type (TYPE_CODE_VOID, 1, 0, "void", NULL);
741
742   add_language (&java_language_defn);
743 }
744
745 /* Cleanup code that should be urn on every "run".
746    We need some hook to have this actually be called ... FIXME */
747
748 void java_rerun_cleanup ()
749 {
750   if (class_symtab != NULL)
751     {
752       free_symtab (class_symtab); /* ??? */
753       class_symtab = NULL;
754     }
755   if (dynamics_objfile != NULL)
756     {
757       free_objfile (dynamics_objfile);
758       dynamics_objfile = NULL;
759     }
760
761   java_object_type = NULL;
762 }