X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fjv-lang.c;h=1ef12962918a075dc1510465a0407dc9dfe3ded1;hb=0e4777df762b3fd7cf70265ad6a9aa3df4f1fc0b;hp=16e293762638209effc57034f31803b4f62a53cd;hpb=7b6bb8daaceb9ecf3f42dea57ae82733d6a3b2f6;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/jv-lang.c b/gdb/jv-lang.c index 16e2937626..1ef1296291 100644 --- a/gdb/jv-lang.c +++ b/gdb/jv-lang.c @@ -1,7 +1,6 @@ /* Java language support routines for GDB, the GNU debugger. - Copyright (C) 1997, 1998, 1999, 2000, 2003, 2004, 2005, 2007, 2008, 2009, - 2010, 2011 Free Software Foundation, Inc. + Copyright (C) 1997-2013 Free Software Foundation, Inc. This file is part of GDB. @@ -38,13 +37,16 @@ #include "dictionary.h" #include #include "gdb_assert.h" +#include "charset.h" +#include "valprint.h" +#include "cp-support.h" /* Local functions */ extern void _initialize_java_language (void); -static int java_demangled_signature_length (char *); -static void java_demangled_signature_copy (char *, char *); +static int java_demangled_signature_length (const char *); +static void java_demangled_signature_copy (char *, const char *); static struct symtab *get_java_class_symtab (struct gdbarch *gdbarch); static char *get_java_utf8_name (struct obstack *obstack, struct value *name); @@ -57,32 +59,43 @@ static void java_emit_char (int c, struct type *type, static char *java_class_name_from_physname (const char *physname); static const struct objfile_data *jv_dynamics_objfile_data_key; -static const struct objfile_data *jv_type_objfile_data_key; -/* This objfile contains symtabs that have been dynamically created - to record dynamically loaded Java classes and dynamically - compiled java methods. */ +/* The dynamic objfile is kept per-program-space. This key lets us + associate the objfile with the program space. */ -static struct objfile *dynamics_objfile = NULL; - -/* symtab contains classes read from the inferior. */ - -static struct symtab *class_symtab = NULL; +static const struct program_space_data *jv_dynamics_progspace_key; static struct type *java_link_class_type (struct gdbarch *, struct type *, struct value *); +/* An instance of this structure is used to store some data that must + be freed. */ + +struct jv_per_objfile_data +{ + /* The expandable dictionary we use. */ + struct dictionary *dict; +}; + /* A function called when the dynamics_objfile is freed. We use this to clean up some internal state. */ static void -jv_per_objfile_free (struct objfile *objfile, void *ignore) +jv_per_objfile_free (struct objfile *objfile, void *data) { + struct jv_per_objfile_data *jv_data = data; + struct objfile *dynamics_objfile; + + dynamics_objfile = program_space_data (current_program_space, + jv_dynamics_progspace_key); gdb_assert (objfile == dynamics_objfile); - /* Clean up all our cached state. These objects are all allocated - in the dynamics_objfile, so we don't need to actually free - anything. */ - dynamics_objfile = NULL; - class_symtab = NULL; + + if (jv_data->dict) + dict_free (jv_data->dict); + xfree (jv_data); + + set_program_space_data (current_program_space, + jv_dynamics_progspace_key, + NULL); } /* FIXME: carlton/2003-02-04: This is the main or only caller of @@ -94,32 +107,41 @@ jv_per_objfile_free (struct objfile *objfile, void *ignore) static struct objfile * get_dynamics_objfile (struct gdbarch *gdbarch) { + struct objfile *dynamics_objfile; + + dynamics_objfile = program_space_data (current_program_space, + jv_dynamics_progspace_key); + if (dynamics_objfile == NULL) { + struct jv_per_objfile_data *data; + /* Mark it as shared so that it is cleared when the inferior is re-run. */ dynamics_objfile = allocate_objfile (NULL, OBJF_SHARED); dynamics_objfile->gdbarch = gdbarch; - /* We don't have any data to store, but this lets us get a - notification when the objfile is destroyed. Since we have to - store a non-NULL value, we just pick something arbitrary and - safe. */ - set_objfile_data (dynamics_objfile, jv_dynamics_objfile_data_key, - &dynamics_objfile); + + data = XCNEW (struct jv_per_objfile_data); + set_objfile_data (dynamics_objfile, jv_dynamics_objfile_data_key, data); + + set_program_space_data (current_program_space, + jv_dynamics_progspace_key, + dynamics_objfile); } return dynamics_objfile; } -static void free_class_block (struct symtab *symtab); - static struct symtab * get_java_class_symtab (struct gdbarch *gdbarch) { + struct objfile *objfile = get_dynamics_objfile (gdbarch); + struct symtab *class_symtab = objfile->symtabs; + if (class_symtab == NULL) { - struct objfile *objfile = get_dynamics_objfile (gdbarch); struct blockvector *bv; struct block *bl; + struct jv_per_objfile_data *jv_data; class_symtab = allocate_symtab ("", objfile); class_symtab->language = language_java; @@ -129,17 +151,21 @@ get_java_class_symtab (struct gdbarch *gdbarch) BLOCKVECTOR_NBLOCKS (bv) = 1; BLOCKVECTOR (class_symtab) = bv; - /* Allocate dummy STATIC_BLOCK. */ + /* Allocate dummy STATIC_BLOCK. */ bl = allocate_block (&objfile->objfile_obstack); BLOCK_DICT (bl) = dict_create_linear (&objfile->objfile_obstack, NULL); BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK) = bl; /* Allocate GLOBAL_BLOCK. */ - bl = allocate_block (&objfile->objfile_obstack); + bl = allocate_global_block (&objfile->objfile_obstack); BLOCK_DICT (bl) = dict_create_hashed_expandable (); + set_block_symtab (bl, class_symtab); BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK) = bl; - class_symtab->free_func = free_class_block; + + /* Arrange to free the dict. */ + jv_data = objfile_data (objfile, jv_dynamics_objfile_data_key); + jv_data->dict = BLOCK_DICT (bl); } return class_symtab; } @@ -158,13 +184,12 @@ static struct symbol * add_class_symbol (struct type *type, CORE_ADDR addr) { struct symbol *sym; + struct objfile *objfile = get_dynamics_objfile (get_type_arch (type)); - sym = (struct symbol *) - obstack_alloc (&dynamics_objfile->objfile_obstack, sizeof (struct symbol)); - memset (sym, 0, sizeof (struct symbol)); - SYMBOL_SET_LANGUAGE (sym, language_java); + sym = allocate_symbol (objfile); + SYMBOL_SET_LANGUAGE (sym, language_java, &objfile->objfile_obstack); SYMBOL_SET_LINKAGE_NAME (sym, TYPE_TAG_NAME (type)); - SYMBOL_CLASS (sym) = LOC_TYPEDEF; + SYMBOL_ACLASS_INDEX (sym) = LOC_TYPEDEF; /* SYMBOL_VALUE (sym) = valu; */ SYMBOL_TYPE (sym) = type; SYMBOL_DOMAIN (sym) = STRUCT_DOMAIN; @@ -172,16 +197,6 @@ add_class_symbol (struct type *type, CORE_ADDR addr) return sym; } -/* Free the dynamic symbols block. */ -static void -free_class_block (struct symtab *symtab) -{ - struct blockvector *bv = BLOCKVECTOR (symtab); - struct block *bl = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK); - - dict_free (BLOCK_DICT (bl)); -} - struct type * java_lookup_class (char *name) { @@ -190,12 +205,12 @@ java_lookup_class (char *name) sym = lookup_symbol (name, expression_context_block, STRUCT_DOMAIN, NULL); if (sym != NULL) return SYMBOL_TYPE (sym); - /* FIXME - should search inferior's symbol table. */ + /* FIXME - should search inferior's symbol table. */ return NULL; } /* Return a nul-terminated string (allocated on OBSTACK) for - a name given by NAME (which has type Utf8Const*). */ + a name given by NAME (which has type Utf8Const*). */ char * get_java_utf8_name (struct obstack *obstack, struct value *name) @@ -234,13 +249,14 @@ java_class_from_object (struct value *obj_val) static int java_class_is_primitive (struct value *clas) { - struct value *vtable = value_struct_elt (&clas, NULL, "vtable", NULL, "struct"); + struct value *vtable = value_struct_elt (&clas, NULL, "vtable", + NULL, "struct"); CORE_ADDR i = value_as_address (vtable); return (int) (i & 0x7fffffff) == (int) 0x7fffffff; } -/* Read a GCJ Class object, and generated a gdb (TYPE_CODE_STRUCT) type. */ +/* Read a GCJ Class object, and generated a gdb (TYPE_CODE_STRUCT) type. */ struct type * type_from_class (struct gdbarch *gdbarch, struct value *clas) @@ -252,7 +268,6 @@ type_from_class (struct gdbarch *gdbarch, struct value *clas) struct value *utf8_name; char *nptr; CORE_ADDR addr; - int is_array = 0; type = check_typedef (value_type (clas)); if (TYPE_CODE (type) == TYPE_CODE_PTR) @@ -273,8 +288,8 @@ type_from_class (struct gdbarch *gdbarch, struct value *clas) return java_primitive_type (gdbarch, value_as_long (sig)); } - /* Get Class name. */ - /* if clasloader non-null, prepend loader address. FIXME */ + /* Get Class name. */ + /* If clasloader non-null, prepend loader address. FIXME */ temp = clas; utf8_name = value_struct_elt (&temp, NULL, "name", NULL, "structure"); name = get_java_utf8_name (&objfile->objfile_obstack, utf8_name); @@ -301,11 +316,11 @@ type_from_class (struct gdbarch *gdbarch, struct value *clas) name = obstack_alloc (&objfile->objfile_obstack, namelen + 1); java_demangled_signature_copy (name, signature); name[namelen] = '\0'; - is_array = 1; temp = clas; - /* Set array element type. */ + /* Set array element type. */ temp = value_struct_elt (&temp, NULL, "methods", NULL, "structure"); - deprecated_set_value_type (temp, lookup_pointer_type (value_type (clas))); + deprecated_set_value_type (temp, + lookup_pointer_type (value_type (clas))); TYPE_TARGET_TYPE (type) = type_from_class (gdbarch, temp); } @@ -316,15 +331,15 @@ type_from_class (struct gdbarch *gdbarch, struct value *clas) return java_link_class_type (gdbarch, type, clas); } -/* Fill in class TYPE with data from the CLAS value. */ +/* Fill in class TYPE with data from the CLAS value. */ static struct type * java_link_class_type (struct gdbarch *gdbarch, struct type *type, struct value *clas) { struct value *temp; - char *unqualified_name; - char *name = TYPE_TAG_NAME (type); + const char *unqualified_name; + const char *name = TYPE_TAG_NAME (type); int ninterfaces, nfields, nmethods; int type_is_object = 0; struct fn_field *fn_fields; @@ -358,13 +373,15 @@ java_link_class_type (struct gdbarch *gdbarch, ninterfaces = 0; #else temp = clas; - ninterfaces = value_as_long (value_struct_elt (&temp, NULL, "interface_len", NULL, "structure")); + ninterfaces = value_as_long (value_struct_elt (&temp, NULL, "interface_len", + NULL, "structure")); #endif TYPE_N_BASECLASSES (type) = (tsuper == NULL ? 0 : 1) + ninterfaces; temp = clas; - nfields = value_as_long (value_struct_elt (&temp, NULL, "field_count", NULL, "structure")); + nfields = value_as_long (value_struct_elt (&temp, NULL, "field_count", + NULL, "structure")); nfields += TYPE_N_BASECLASSES (type); - nfields++; /* Add one for dummy "class" field. */ + nfields++; /* Add one for dummy "class" field. */ TYPE_NFIELDS (type) = nfields; TYPE_FIELDS (type) = (struct field *) TYPE_ALLOC (type, sizeof (struct field) * nfields); @@ -398,17 +415,18 @@ java_link_class_type (struct gdbarch *gdbarch, if (i > 2 && name[i - 1] == ']' && tsuper != NULL) { /* FIXME */ - TYPE_LENGTH (type) = TYPE_LENGTH (tsuper) + 4; /* size with "length" */ + TYPE_LENGTH (type) = TYPE_LENGTH (tsuper) + 4; /* size with "length" */ } else { temp = clas; - temp = value_struct_elt (&temp, NULL, "size_in_bytes", NULL, "structure"); + temp = value_struct_elt (&temp, NULL, "size_in_bytes", + NULL, "structure"); TYPE_LENGTH (type) = value_as_long (temp); } fields = NULL; - nfields--; /* First set up dummy "class" field. */ + nfields--; /* First set up dummy "class" field. */ SET_FIELD_PHYSADDR (TYPE_FIELD (type, nfields), value_address (clas)); TYPE_FIELD_NAME (type, nfields) = "class"; TYPE_FIELD_TYPE (type, nfields) = value_type (clas); @@ -426,7 +444,7 @@ java_link_class_type (struct gdbarch *gdbarch, field = value_ind (fields); } else - { /* Re-use field value for next field. */ + { /* Re-use field value for next field. */ CORE_ADDR addr = value_address (field) + TYPE_LENGTH (value_type (field)); @@ -459,7 +477,7 @@ java_link_class_type (struct gdbarch *gdbarch, if (accflags & 0x0008) /* ACC_STATIC */ SET_FIELD_PHYSADDR (TYPE_FIELD (type, i), boffset); else - TYPE_FIELD_BITPOS (type, i) = 8 * boffset; + SET_FIELD_BITPOS (TYPE_FIELD (type, i), 8 * boffset); if (accflags & 0x8000) /* FIELD_UNRESOLVED_FLAG */ { TYPE_FIELD_TYPE (type, i) = get_java_object_type (); /* FIXME */ @@ -480,10 +498,9 @@ java_link_class_type (struct gdbarch *gdbarch, temp = clas; nmethods = value_as_long (value_struct_elt (&temp, NULL, "method_count", NULL, "structure")); - TYPE_NFN_FIELDS_TOTAL (type) = nmethods; j = nmethods * sizeof (struct fn_field); fn_fields = (struct fn_field *) - obstack_alloc (&dynamics_objfile->objfile_obstack, j); + obstack_alloc (&objfile->objfile_obstack, j); memset (fn_fields, 0, j); fn_fieldlists = (struct fn_fieldlist *) alloca (nmethods * sizeof (struct fn_fieldlist)); @@ -491,17 +508,18 @@ java_link_class_type (struct gdbarch *gdbarch, methods = NULL; for (i = 0; i < nmethods; i++) { - char *mname; + const char *mname; int k; if (methods == NULL) { temp = clas; - methods = value_struct_elt (&temp, NULL, "methods", NULL, "structure"); + methods = value_struct_elt (&temp, NULL, "methods", + NULL, "structure"); method = value_ind (methods); } else - { /* Re-use method value for next method. */ + { /* Re-use method value for next method. */ CORE_ADDR addr = value_address (method) + TYPE_LENGTH (value_type (method)); @@ -509,7 +527,7 @@ java_link_class_type (struct gdbarch *gdbarch, set_value_lazy (method, 1); } - /* Get method name. */ + /* Get method name. */ temp = method; temp = value_struct_elt (&temp, NULL, "name", NULL, "structure"); mname = get_java_utf8_name (&objfile->objfile_obstack, temp); @@ -525,7 +543,7 @@ java_link_class_type (struct gdbarch *gdbarch, for (k = 0, j = TYPE_NFN_FIELDS (type);;) { if (--j < 0) - { /* No match - new method name. */ + { /* No match - new method name. */ j = TYPE_NFN_FIELDS (type)++; fn_fieldlists[j].name = mname; fn_fieldlists[j].length = 1; @@ -534,15 +552,15 @@ java_link_class_type (struct gdbarch *gdbarch, break; } if (strcmp (mname, fn_fieldlists[j].name) == 0) - { /* Found an existing method with the same name. */ + { /* Found an existing method with the same name. */ int l; if (mname != unqualified_name) obstack_free (&objfile->objfile_obstack, mname); mname = fn_fieldlists[j].name; fn_fieldlists[j].length++; - k = i - k; /* Index of new slot. */ - /* Shift intervening fn_fields (between k and i) down. */ + k = i - k; /* Index of new slot. */ + /* Shift intervening fn_fields (between k and i) down. */ for (l = i; l > k; l--) fn_fields[l] = fn_fields[l - 1]; for (l = TYPE_NFN_FIELDS (type); --l > j;) @@ -561,49 +579,21 @@ java_link_class_type (struct gdbarch *gdbarch, j = TYPE_NFN_FIELDS (type) * sizeof (struct fn_fieldlist); TYPE_FN_FIELDLISTS (type) = (struct fn_fieldlist *) - obstack_alloc (&dynamics_objfile->objfile_obstack, j); + obstack_alloc (&objfile->objfile_obstack, j); memcpy (TYPE_FN_FIELDLISTS (type), fn_fieldlists, j); return type; } -static struct type *java_object_type; - -/* A free function that is attached to the objfile defining - java_object_type. This is used to clear the cached type whenever - its owning objfile is destroyed. */ -static void -jv_clear_object_type (struct objfile *objfile, void *ignore) -{ - java_object_type = NULL; -} - -static void -set_java_object_type (struct type *type) -{ - struct objfile *owner; - - gdb_assert (java_object_type == NULL); - - owner = TYPE_OBJFILE (type); - if (owner) - set_objfile_data (owner, jv_type_objfile_data_key, &java_object_type); - java_object_type = type; -} - struct type * get_java_object_type (void) { - if (java_object_type == NULL) - { - struct symbol *sym; + struct symbol *sym; - sym = lookup_symbol ("java.lang.Object", NULL, STRUCT_DOMAIN, NULL); - if (sym == NULL) - error (_("cannot find java.lang.Object")); - set_java_object_type (SYMBOL_TYPE (sym)); - } - return java_object_type; + sym = lookup_symbol ("java.lang.Object", NULL, STRUCT_DOMAIN, NULL); + if (sym == NULL) + error (_("cannot find java.lang.Object")); + return SYMBOL_TYPE (sym); } int @@ -624,7 +614,7 @@ is_object_type (struct type *type) if (TYPE_CODE (type) == TYPE_CODE_PTR) { struct type *ttype = check_typedef (TYPE_TARGET_TYPE (type)); - char *name; + const char *name; if (TYPE_CODE (ttype) != TYPE_CODE_STRUCT) return 0; while (TYPE_N_BASECLASSES (ttype) > 0) @@ -632,13 +622,10 @@ is_object_type (struct type *type) name = TYPE_TAG_NAME (ttype); if (name != NULL && strcmp (name, "java.lang.Object") == 0) return 1; - name = TYPE_NFIELDS (ttype) > 0 ? TYPE_FIELD_NAME (ttype, 0) : (char *) 0; + name + = TYPE_NFIELDS (ttype) > 0 ? TYPE_FIELD_NAME (ttype, 0) : (char *) 0; if (name != NULL && strcmp (name, "vtable") == 0) - { - if (java_object_type == NULL) - set_java_object_type (type); - return 1; - } + return 1; } return 0; } @@ -673,11 +660,11 @@ java_primitive_type (struct gdbarch *gdbarch, int signature) } /* If name[0 .. namelen-1] is the name of a primitive Java type, - return that type. Otherwise, return NULL. */ + return that type. Otherwise, return NULL. */ struct type * java_primitive_type_from_name (struct gdbarch *gdbarch, - char *name, int namelen) + const char *name, int namelen) { const struct builtin_java_type *builtin = builtin_java_type (gdbarch); @@ -692,6 +679,7 @@ java_primitive_type_from_name (struct gdbarch *gdbarch, case 'c': if (namelen == 4 && memcmp (name, "char", 4) == 0) return builtin->builtin_char; + break; case 'd': if (namelen == 6 && memcmp (name, "double", 6) == 0) return builtin->builtin_double; @@ -748,29 +736,30 @@ java_primitive_type_name (int signature) } /* Return the length (in bytes) of demangled name of the Java type - signature string SIGNATURE. */ + signature string SIGNATURE. */ static int -java_demangled_signature_length (char *signature) +java_demangled_signature_length (const char *signature) { int array = 0; for (; *signature == '['; signature++) - array += 2; /* Two chars for "[]". */ + array += 2; /* Two chars for "[]". */ switch (signature[0]) { case 'L': - /* Subtract 2 for 'L' and ';'. */ + /* Subtract 2 for 'L' and ';'. */ return strlen (signature) - 2 + array; default: return strlen (java_primitive_type_name (signature[0])) + array; } } -/* Demangle the Java type signature SIGNATURE, leaving the result in RESULT. */ +/* Demangle the Java type signature SIGNATURE, leaving the result in + RESULT. */ static void -java_demangled_signature_copy (char *result, char *signature) +java_demangled_signature_copy (char *result, const char *signature) { int array = 0; char *ptr; @@ -784,7 +773,7 @@ java_demangled_signature_copy (char *result, char *signature) switch (signature[0]) { case 'L': - /* Subtract 2 for 'L' and ';', but add 1 for final nul. */ + /* Subtract 2 for 'L' and ';', but add 1 for final nul. */ signature++; ptr = result; for (; *signature != ';' && *signature != '\0'; signature++) @@ -810,10 +799,10 @@ java_demangled_signature_copy (char *result, char *signature) } /* Return the demangled name of the Java type signature string SIGNATURE, - as a freshly allocated copy. */ + as a freshly allocated copy. */ char * -java_demangle_type_signature (char *signature) +java_demangle_type_signature (const char *signature) { int length = java_demangled_signature_length (signature); char *result = xmalloc (length + 1); @@ -824,21 +813,21 @@ java_demangle_type_signature (char *signature) } /* Return the type of TYPE followed by DIMS pairs of [ ]. - If DIMS == 0, TYPE is returned. */ + If DIMS == 0, TYPE is returned. */ struct type * java_array_type (struct type *type, int dims) { while (dims-- > 0) { - /* FIXME This is bogus! Java arrays are not gdb arrays! */ + /* FIXME This is bogus! Java arrays are not gdb arrays! */ type = lookup_array_range_type (type, 0, 0); } return type; } -/* Create a Java string in the inferior from a (Utf8) literal. */ +/* Create a Java string in the inferior from a (Utf8) literal. */ static struct value * java_value_string (char *ptr, int len) @@ -846,41 +835,65 @@ java_value_string (char *ptr, int len) error (_("not implemented - java_value_string")); /* FIXME */ } +/* Return the encoding that should be used for the character type + TYPE. */ + +static const char * +java_get_encoding (struct type *type) +{ + struct gdbarch *arch = get_type_arch (type); + const char *encoding; + + if (type == builtin_java_type (arch)->builtin_char) + { + if (gdbarch_byte_order (arch) == BFD_ENDIAN_BIG) + encoding = "UTF-16BE"; + else + encoding = "UTF-16LE"; + } + else + encoding = target_charset (arch); + + return encoding; +} + /* Print the character C on STREAM as part of the contents of a literal string whose delimiter is QUOTER. Note that that format for printing - characters and strings is language specific. */ + characters and strings is language specific. */ static void java_emit_char (int c, struct type *type, struct ui_file *stream, int quoter) { - switch (c) - { - case '\\': - case '\'': - fprintf_filtered (stream, "\\%c", c); - break; - case '\b': - fputs_filtered ("\\b", stream); - break; - case '\t': - fputs_filtered ("\\t", stream); - break; - case '\n': - fputs_filtered ("\\n", stream); - break; - case '\f': - fputs_filtered ("\\f", stream); - break; - case '\r': - fputs_filtered ("\\r", stream); - break; - default: - if (isprint (c)) - fputc_filtered (c, stream); - else - fprintf_filtered (stream, "\\u%.4x", (unsigned int) c); - break; - } + const char *encoding = java_get_encoding (type); + + generic_emit_char (c, type, stream, quoter, encoding); +} + +/* Implementation of la_printchar method. */ + +static void +java_printchar (int c, struct type *type, struct ui_file *stream) +{ + fputs_filtered ("'", stream); + LA_EMIT_CHAR (c, type, stream, '\''); + fputs_filtered ("'", stream); +} + +/* Implementation of la_printstr method. */ + +static void +java_printstr (struct ui_file *stream, struct type *type, + const gdb_byte *string, + unsigned int length, const char *encoding, int force_ellipses, + const struct value_print_options *options) +{ + const char *type_encoding = java_get_encoding (type); + + if (!encoding || !*encoding) + encoding = type_encoding; + + generic_printstr (stream, type, string, length, encoding, + force_ellipses, '"', 0, options); } static struct value * @@ -889,7 +902,7 @@ evaluate_subexp_java (struct type *expect_type, struct expression *exp, { int pc = *pos; int i; - char *name; + const char *name; enum exp_opcode op = exp->elts[*pos].opcode; struct value *arg1; struct value *arg2; @@ -909,8 +922,6 @@ evaluate_subexp_java (struct type *expect_type, struct expression *exp, type = type_from_class (exp->gdbarch, java_class_from_object (arg1)); arg1 = value_cast (lookup_pointer_type (type), arg1); } - if (noside == EVAL_SKIP) - goto nosideret; return value_ind (arg1); case BINOP_SUBSCRIPT: @@ -921,7 +932,7 @@ evaluate_subexp_java (struct type *expect_type, struct expression *exp, goto nosideret; /* If the user attempts to subscript something that is not an array or pointer type (like a plain int variable for example), - then report this as an error. */ + then report this as an error. */ arg1 = coerce_ref (arg1); type = check_typedef (value_type (arg1)); @@ -942,7 +953,7 @@ evaluate_subexp_java (struct type *expect_type, struct expression *exp, struct value *clas = java_class_from_object (arg1); struct value *temp = clas; - /* Get CLASS_ELEMENT_TYPE of the array type. */ + /* Get CLASS_ELEMENT_TYPE of the array type. */ temp = value_struct_elt (&temp, NULL, "methods", NULL, "structure"); deprecated_set_value_type (temp, value_type (clas)); @@ -985,7 +996,7 @@ evaluate_subexp_java (struct type *expect_type, struct expression *exp, case STRUCTOP_PTR: arg1 = evaluate_subexp_standard (expect_type, exp, pos, noside); - /* Convert object field (such as TYPE.class) to reference. */ + /* Convert object field (such as TYPE.class) to reference. */ if (TYPE_CODE (value_type (arg1)) == TYPE_CODE_STRUCT) arg1 = value_addr (arg1); return arg1; @@ -1000,7 +1011,7 @@ nosideret: static char *java_demangle (const char *mangled, int options) { - return cplus_demangle (mangled, options | DMGL_JAVA); + return gdb_demangle (mangled, options | DMGL_JAVA); } /* Find the member function name of the demangled name NAME. NAME @@ -1152,7 +1163,6 @@ const struct language_defn java_language_defn = "java", /* Language name */ language_java, range_check_off, - type_check_off, case_sensitive_on, array_row_major, macro_expansion_no, @@ -1160,13 +1170,14 @@ const struct language_defn java_language_defn = java_parse, java_error, null_post_parser, - c_printchar, /* Print a character constant */ - c_printstr, /* Function to print string constant */ + java_printchar, /* Print a character constant */ + java_printstr, /* Function to print string constant */ java_emit_char, /* Function to print a single character */ java_print_type, /* Print a type using appropriate syntax */ default_print_typedef, /* Print a typedef using appropriate syntax */ java_val_print, /* Print a value using appropriate syntax */ java_value_print, /* Print a top-level value */ + default_read_var_value, /* la_read_var_value */ NULL, /* Language specific skip_trampoline */ "this", /* name_of_this */ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ @@ -1182,6 +1193,8 @@ const struct language_defn java_language_defn = default_print_array_index, default_pass_by_reference, default_get_string, + NULL, /* la_get_symbol_name_cmp */ + iterate_over_symbols, LANG_MAGIC }; @@ -1226,8 +1239,7 @@ _initialize_java_language (void) { jv_dynamics_objfile_data_key = register_objfile_data_with_cleanup (NULL, jv_per_objfile_free); - jv_type_objfile_data_key - = register_objfile_data_with_cleanup (NULL, jv_clear_object_type); + jv_dynamics_progspace_key = register_program_space_data (); java_type_data = gdbarch_data_register_post_init (build_java_types);