X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fjv-lang.c;h=f53c656f68373246085232c902727b8dd0e25d7a;hb=0c8b41f1c6ca809238df5662ea5f45e5f7a29121;hp=bc2264f10c4f584edc2bad07b30233654f54031a;hpb=dfa52d88e70f7149def79ecf95faea9f87477df4;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/jv-lang.c b/gdb/jv-lang.c index bc2264f10c..f53c656f68 100644 --- a/gdb/jv-lang.c +++ b/gdb/jv-lang.c @@ -1,13 +1,13 @@ /* Java language support routines for GDB, the GNU debugger. - Copyright 1997, 1998, 1999, 2000, 2003, 2004, 2005 Free Software - Foundation, Inc. + Copyright (C) 1997, 1998, 1999, 2000, 2003, 2004, 2005, 2007, 2008, 2009 + Free Software Foundation, Inc. This file is part of GDB. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -16,9 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ + along with this program. If not, see . */ #include "defs.h" #include "symtab.h" @@ -39,6 +37,7 @@ #include "demangle.h" #include "dictionary.h" #include +#include "gdb_assert.h" struct type *java_int_type; struct type *java_byte_type; @@ -62,7 +61,8 @@ static char *get_java_utf8_name (struct obstack *obstack, struct value *name); static int java_class_is_primitive (struct value *clas); static struct value *java_value_string (char *ptr, int len); -static void java_emit_char (int c, struct ui_file * stream, int quoter); +static void java_emit_char (int c, struct type *type, + struct ui_file * stream, int quoter); static char *java_class_name_from_physname (const char *physname); @@ -146,7 +146,7 @@ add_class_symbol (struct type *type, CORE_ADDR addr) obstack_alloc (&dynamics_objfile->objfile_obstack, sizeof (struct symbol)); memset (sym, 0, sizeof (struct symbol)); SYMBOL_LANGUAGE (sym) = language_java; - DEPRECATED_SYMBOL_NAME (sym) = TYPE_TAG_NAME (type); + SYMBOL_SET_LINKAGE_NAME (sym, TYPE_TAG_NAME (type)); SYMBOL_CLASS (sym) = LOC_TYPEDEF; /* SYMBOL_VALUE (sym) = valu; */ SYMBOL_TYPE (sym) = type; @@ -170,8 +170,7 @@ struct type * java_lookup_class (char *name) { struct symbol *sym; - sym = lookup_symbol (name, expression_context_block, STRUCT_DOMAIN, - (int *) 0, (struct symtab **) NULL); + sym = lookup_symbol (name, expression_context_block, STRUCT_DOMAIN, NULL); if (sym != NULL) return SYMBOL_TYPE (sym); #if 0 @@ -191,7 +190,7 @@ java_lookup_class (char *name) TYPE_CODE (type) = TYPE_CODE_STRUCT; INIT_CPLUS_SPECIFIC (type); TYPE_TAG_NAME (type) = obsavestring (name, strlen (name), &objfile->objfile_obstack); - TYPE_FLAGS (type) |= TYPE_FLAG_STUB; + TYPE_STUB (type) = 1; TYPE ? = addr; return type; #else @@ -212,11 +211,10 @@ get_java_utf8_name (struct obstack *obstack, struct value *name) CORE_ADDR data_addr; temp = value_struct_elt (&temp, NULL, "length", NULL, "structure"); name_length = (int) value_as_long (temp); - data_addr = VALUE_ADDRESS (temp) + value_offset (temp) - + TYPE_LENGTH (value_type (temp)); + data_addr = value_address (temp) + TYPE_LENGTH (value_type (temp)); chrs = obstack_alloc (obstack, name_length + 1); chrs[name_length] = '\0'; - read_memory (data_addr, chrs, name_length); + read_memory (data_addr, (gdb_byte *) chrs, name_length); return chrs; } @@ -268,7 +266,7 @@ type_from_class (struct value *clas) return NULL; clas = value_ind (clas); } - addr = VALUE_ADDRESS (clas) + value_offset (clas); + addr = value_address (clas); #if 0 get_java_class_symtab (); @@ -304,7 +302,10 @@ type_from_class (struct value *clas) if (type != NULL) return type; - type = alloc_type (objfile); + /* Do not use the "fake" dynamics objfile to own dynamically generated + types, as it does not provide an architecture, and it would not help + manage the lifetime of these types anyway. */ + type = alloc_type (NULL); TYPE_CODE (type) = TYPE_CODE_STRUCT; INIT_CPLUS_SPECIFIC (type); @@ -320,7 +321,7 @@ type_from_class (struct value *clas) temp = clas; /* Set array element type. */ temp = value_struct_elt (&temp, NULL, "methods", NULL, "structure"); - temp->type = lookup_pointer_type (value_type (clas)); + deprecated_set_value_type (temp, lookup_pointer_type (value_type (clas))); TYPE_TARGET_TYPE (type) = type_from_class (temp); } @@ -351,13 +352,14 @@ java_link_class_type (struct type *type, struct value *clas) struct objfile *objfile = get_dynamics_objfile (); struct type *tsuper; + gdb_assert (name != NULL); unqualified_name = strrchr (name, '.'); if (unqualified_name == NULL) unqualified_name = name; temp = clas; temp = value_struct_elt (&temp, NULL, "superclass", NULL, "structure"); - if (name != NULL && strcmp (name, "java.lang.Object") == 0) + if (strcmp (name, "java.lang.Object") == 0) { tsuper = get_java_object_type (); if (tsuper && TYPE_CODE (tsuper) == TYPE_CODE_PTR) @@ -422,8 +424,7 @@ java_link_class_type (struct type *type, struct value *clas) fields = NULL; nfields--; /* First set up dummy "class" field. */ - SET_FIELD_PHYSADDR (TYPE_FIELD (type, nfields), - VALUE_ADDRESS (clas) + value_offset (clas)); + SET_FIELD_PHYSADDR (TYPE_FIELD (type, nfields), value_address (clas)); TYPE_FIELD_NAME (type, nfields) = "class"; TYPE_FIELD_TYPE (type, nfields) = value_type (clas); SET_TYPE_FIELD_PRIVATE (type, nfields); @@ -440,7 +441,9 @@ java_link_class_type (struct type *type, struct value *clas) } else { /* Re-use field value for next field. */ - VALUE_ADDRESS (field) += TYPE_LENGTH (value_type (field)); + CORE_ADDR addr + = value_address (field) + TYPE_LENGTH (value_type (field)); + set_value_address (field, addr); set_value_lazy (field, 1); } temp = field; @@ -510,7 +513,9 @@ java_link_class_type (struct type *type, struct value *clas) } else { /* Re-use method value for next method. */ - VALUE_ADDRESS (method) += TYPE_LENGTH (value_type (method)); + CORE_ADDR addr + = value_address (method) + TYPE_LENGTH (value_type (method)); + set_value_address (method, addr); set_value_lazy (method, 1); } @@ -557,7 +562,8 @@ java_link_class_type (struct type *type, struct value *clas) } fn_fields[k].physname = ""; fn_fields[k].is_stub = 1; - fn_fields[k].type = make_function_type (java_void_type, NULL); /* FIXME */ + /* FIXME */ + fn_fields[k].type = lookup_function_type (java_void_type); TYPE_CODE (fn_fields[k].type) = TYPE_CODE_METHOD; } @@ -577,21 +583,20 @@ get_java_object_type (void) if (java_object_type == NULL) { struct symbol *sym; - sym = lookup_symbol ("java.lang.Object", NULL, STRUCT_DOMAIN, - (int *) 0, (struct symtab **) NULL); + sym = lookup_symbol ("java.lang.Object", NULL, STRUCT_DOMAIN, NULL); if (sym == NULL) - error ("cannot find java.lang.Object"); + error (_("cannot find java.lang.Object")); java_object_type = SYMBOL_TYPE (sym); } return java_object_type; } int -get_java_object_header_size (void) +get_java_object_header_size (struct gdbarch *gdbarch) { struct type *objtype = get_java_object_type (); if (objtype == NULL) - return (2 * TARGET_PTR_BIT / TARGET_CHAR_BIT); + return (2 * gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT); else return TYPE_LENGTH (objtype); } @@ -646,7 +651,7 @@ java_primitive_type (int signature) case 'V': return java_void_type; } - error ("unknown signature '%c' for primitive type", (char) signature); + error (_("unknown signature '%c' for primitive type"), (char) signature); } /* If name[0 .. namelen-1] is the name of a primitive Java type, @@ -777,7 +782,7 @@ java_array_type (struct type *type, int dims) while (dims-- > 0) { - range_type = create_range_type (NULL, builtin_type_int, 0, 0); + range_type = create_range_type (NULL, builtin_type_int32, 0, 0); /* FIXME This is bogus! Java arrays are not gdb arrays! */ type = create_array_type (NULL, type, range_type); } @@ -790,7 +795,7 @@ java_array_type (struct type *type, int dims) static struct value * java_value_string (char *ptr, int len) { - error ("not implemented - java_value_string"); /* FIXME */ + error (_("not implemented - java_value_string")); /* FIXME */ } /* Print the character C on STREAM as part of the contents of a literal @@ -798,7 +803,7 @@ java_value_string (char *ptr, int len) characters and strings is language specific. */ static void -java_emit_char (int c, struct ui_file *stream, int quoter) +java_emit_char (int c, struct type *type, struct ui_file *stream, int quoter) { switch (c) { @@ -883,14 +888,14 @@ evaluate_subexp_java (struct type *expect_type, struct expression *exp, CORE_ADDR address; long length, index; struct type *el_type; - char buf4[4]; + gdb_byte buf4[4]; struct value *clas = java_class_from_object (arg1); struct value *temp = clas; /* Get CLASS_ELEMENT_TYPE of the array type. */ temp = value_struct_elt (&temp, NULL, "methods", NULL, "structure"); - temp->type = value_type (clas); + deprecated_set_value_type (temp, value_type (clas)); el_type = type_from_class (temp); if (TYPE_CODE (el_type) == TYPE_CODE_STRUCT) el_type = lookup_pointer_type (el_type); @@ -898,12 +903,12 @@ evaluate_subexp_java (struct type *expect_type, struct expression *exp, if (noside == EVAL_AVOID_SIDE_EFFECTS) return value_zero (el_type, VALUE_LVAL (arg1)); address = value_as_address (arg1); - address += JAVA_OBJECT_SIZE; + address += get_java_object_header_size (exp->gdbarch); read_memory (address, buf4, 4); length = (long) extract_signed_integer (buf4, 4); index = (long) value_as_long (arg2); if (index >= length || index < 0) - error ("array index (%ld) out of bounds (length: %ld)", + error (_("array index (%ld) out of bounds (length: %ld)"), index, length); address = (address + 4) + index * TYPE_LENGTH (el_type); return value_at (el_type, address); @@ -916,9 +921,9 @@ evaluate_subexp_java (struct type *expect_type, struct expression *exp, return value_subscript (arg1, arg2); } if (name) - error ("cannot subscript something of type `%s'", name); + error (_("cannot subscript something of type `%s'"), name); else - error ("cannot subscript requested type"); + error (_("cannot subscript requested type")); case OP_STRING: (*pos)++; @@ -928,7 +933,7 @@ evaluate_subexp_java (struct type *expect_type, struct expression *exp, goto nosideret; return java_value_string (&exp->elts[pc + 2].string, i); - case STRUCTOP_STRUCT: + case STRUCTOP_PTR: arg1 = evaluate_subexp_standard (expect_type, exp, pos, noside); /* Convert object field (such as TYPE.class) to reference. */ if (TYPE_CODE (value_type (arg1)) == TYPE_CODE_STRUCT) @@ -940,38 +945,7 @@ evaluate_subexp_java (struct type *expect_type, struct expression *exp, standard: return evaluate_subexp_standard (expect_type, exp, pos, noside); nosideret: - return value_from_longest (builtin_type_long, (LONGEST) 1); -} - -static struct type * -java_create_fundamental_type (struct objfile *objfile, int typeid) -{ - switch (typeid) - { - case FT_VOID: - return java_void_type; - case FT_BOOLEAN: - return java_boolean_type; - case FT_CHAR: - return java_char_type; - case FT_FLOAT: - return java_float_type; - case FT_DBL_PREC_FLOAT: - return java_double_type; - case FT_BYTE: - case FT_SIGNED_CHAR: - return java_byte_type; - case FT_SHORT: - case FT_SIGNED_SHORT: - return java_short_type; - case FT_INTEGER: - case FT_SIGNED_INTEGER: - return java_int_type; - case FT_LONG: - case FT_SIGNED_LONG: - return java_long_type; - } - return c_create_fundamental_type (objfile, typeid); + return value_from_longest (builtin_type_int8, (LONGEST) 1); } static char *java_demangle (const char *mangled, int options) @@ -1073,6 +1047,51 @@ const struct op_print java_op_print_tab[] = {NULL, 0, 0, 0} }; +enum java_primitive_types +{ + java_primitive_type_int, + java_primitive_type_short, + java_primitive_type_long, + java_primitive_type_byte, + java_primitive_type_boolean, + java_primitive_type_char, + java_primitive_type_float, + java_primitive_type_double, + java_primitive_type_void, + nr_java_primitive_types +}; + +static void +java_language_arch_info (struct gdbarch *gdbarch, + struct language_arch_info *lai) +{ + lai->string_char_type = java_char_type; + lai->primitive_type_vector + = GDBARCH_OBSTACK_CALLOC (gdbarch, nr_java_primitive_types + 1, + struct type *); + lai->primitive_type_vector [java_primitive_type_int] + = java_int_type; + lai->primitive_type_vector [java_primitive_type_short] + = java_short_type; + lai->primitive_type_vector [java_primitive_type_long] + = java_long_type; + lai->primitive_type_vector [java_primitive_type_byte] + = java_byte_type; + lai->primitive_type_vector [java_primitive_type_boolean] + = java_boolean_type; + lai->primitive_type_vector [java_primitive_type_char] + = java_char_type; + lai->primitive_type_vector [java_primitive_type_float] + = java_float_type; + lai->primitive_type_vector [java_primitive_type_double] + = java_double_type; + lai->primitive_type_vector [java_primitive_type_void] + = java_void_type; + + lai->bool_type_symbol = "boolean"; + lai->bool_type_default = java_boolean_type; +} + const struct exp_descriptor exp_descriptor_java = { print_subexp_standard, @@ -1086,11 +1105,11 @@ const struct language_defn java_language_defn = { "java", /* Language name */ language_java, - NULL, range_check_off, type_check_off, case_sensitive_on, array_row_major, + macro_expansion_no, &exp_descriptor_java, java_parse, java_error, @@ -1098,12 +1117,12 @@ const struct language_defn java_language_defn = c_printchar, /* Print a character constant */ c_printstr, /* Function to print string constant */ java_emit_char, /* Function to print a single character */ - java_create_fundamental_type, /* Create fundamental type in this language */ 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 */ NULL, /* Language specific skip_trampoline */ - value_of_this, /* value_of_this */ + "this", /* name_of_this */ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ basic_lookup_transparent_type,/* lookup_transparent_type */ java_demangle, /* Language specific symbol demangler */ @@ -1111,9 +1130,12 @@ const struct language_defn java_language_defn = java_op_print_tab, /* expression operators for printing */ 0, /* not c-style arrays */ 0, /* String lower bound */ - NULL, default_word_break_characters, - c_language_arch_info, + default_make_symbol_completion_list, + java_language_arch_info, + default_print_array_index, + default_pass_by_reference, + default_get_string, LANG_MAGIC }; @@ -1133,25 +1155,3 @@ _initialize_java_language (void) add_language (&java_language_defn); } - -/* Cleanup code that should be run on every "run". - We should use make_run_cleanup to have this be called. - But will that mess up values in value histry? FIXME */ - -extern void java_rerun_cleanup (void); -void -java_rerun_cleanup (void) -{ - if (class_symtab != NULL) - { - free_symtab (class_symtab); /* ??? */ - class_symtab = NULL; - } - if (dynamics_objfile != NULL) - { - free_objfile (dynamics_objfile); - dynamics_objfile = NULL; - } - - java_object_type = NULL; -}