* dwarf2read.c (dwarf_decode_lines): Ignore rows where is_stmt is 0.
[deliverable/binutils-gdb.git] / gdb / jv-lang.c
index fd0e712415c42b03e045e0254300e82086d78d18..0003e0d399bf84d42881be5493fa5606317e1edd 100644 (file)
@@ -1,11 +1,13 @@
 /* Java language support routines for GDB, the GNU debugger.
-   Copyright 1997, 1998, 1999, 2000, 2003, 2004 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,
@@ -14,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 <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
 #include "symtab.h"
@@ -37,6 +37,7 @@
 #include "demangle.h"
 #include "dictionary.h"
 #include <ctype.h>
+#include "gdb_assert.h"
 
 struct type *java_int_type;
 struct type *java_byte_type;
@@ -60,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);
 
@@ -144,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;
@@ -168,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
@@ -189,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
@@ -210,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;
 }
 
@@ -225,10 +225,10 @@ java_class_from_object (struct value *obj_val)
      class are fixed.  FIXME */
   struct value *vtable_val;
 
-  if (TYPE_CODE (VALUE_TYPE (obj_val)) == TYPE_CODE_PTR
-      && TYPE_LENGTH (TYPE_TARGET_TYPE (VALUE_TYPE (obj_val))) == 0)
+  if (TYPE_CODE (value_type (obj_val)) == TYPE_CODE_PTR
+      && TYPE_LENGTH (TYPE_TARGET_TYPE (value_type (obj_val))) == 0)
     obj_val = value_at (get_java_object_type (),
-                       value_as_address (obj_val), NULL);
+                       value_as_address (obj_val));
 
   vtable_val = value_struct_elt (&obj_val, NULL, "vtable", NULL, "structure");
   return value_struct_elt (&vtable_val, NULL, "class", NULL, "structure");
@@ -259,14 +259,14 @@ type_from_class (struct value *clas)
   struct dict_iterator iter;
   int is_array = 0;
 
-  type = check_typedef (VALUE_TYPE (clas));
+  type = check_typedef (value_type (clas));
   if (TYPE_CODE (type) == TYPE_CODE_PTR)
     {
       if (value_logical_not (clas))
        return NULL;
       clas = value_ind (clas);
     }
-  addr = VALUE_ADDRESS (clas) + VALUE_OFFSET (clas);
+  addr = value_address (clas);
 
 #if 0
   get_java_class_symtab ();
@@ -318,7 +318,7 @@ type_from_class (struct value *clas)
       temp = clas;
       /* Set array element type. */
       temp = value_struct_elt (&temp, NULL, "methods", NULL, "structure");
-      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 (temp);
     }
 
@@ -349,13 +349,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)
@@ -420,10 +421,9 @@ 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);
+  TYPE_FIELD_TYPE (type, nfields) = value_type (clas);
   SET_TYPE_FIELD_PRIVATE (type, nfields);
 
   for (i = TYPE_N_BASECLASSES (type); i < nfields; i++)
@@ -438,8 +438,10 @@ 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));
-         VALUE_LAZY (field) = 1;
+         CORE_ADDR addr
+           = value_address (field) + TYPE_LENGTH (value_type (field));
+         set_value_address (field, addr);
+         set_value_lazy (field, 1);
        }
       temp = field;
       temp = value_struct_elt (&temp, NULL, "name", NULL, "structure");
@@ -508,8 +510,10 @@ 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));
-         VALUE_LAZY (method) = 1;
+         CORE_ADDR addr
+           = value_address (method) + TYPE_LENGTH (value_type (method));
+         set_value_address (method, addr);
+         set_value_lazy (method, 1);
        }
 
       /* Get method name. */
@@ -555,7 +559,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 = make_function_type (java_void_type, NULL, objfile);
       TYPE_CODE (fn_fields[k].type) = TYPE_CODE_METHOD;
     }
 
@@ -575,21 +580,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);
 }
@@ -644,7 +648,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,
@@ -775,7 +779,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);
     }
@@ -788,7 +792,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
@@ -796,7 +800,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)
     {
@@ -846,7 +850,7 @@ evaluate_subexp_java (struct type *expect_type, struct expression *exp,
        goto standard;
       (*pos)++;
       arg1 = evaluate_subexp_java (NULL_TYPE, exp, pos, EVAL_NORMAL);
-      if (is_object_type (VALUE_TYPE (arg1)))
+      if (is_object_type (value_type (arg1)))
        {
          struct type *type;
 
@@ -867,8 +871,8 @@ evaluate_subexp_java (struct type *expect_type, struct expression *exp,
          array or pointer type (like a plain int variable for example),
          then report this as an error. */
 
-      COERCE_REF (arg1);
-      type = check_typedef (VALUE_TYPE (arg1));
+      arg1 = coerce_ref (arg1);
+      type = check_typedef (value_type (arg1));
       if (TYPE_CODE (type) == TYPE_CODE_PTR)
        type = check_typedef (TYPE_TARGET_TYPE (type));
       name = TYPE_NAME (type);
@@ -881,14 +885,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");
-         VALUE_TYPE (temp) = 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);
@@ -896,15 +900,15 @@ 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, NULL);
+         return value_at (el_type, address);
        }
       else if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
        {
@@ -914,9 +918,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)++;
@@ -926,10 +930,10 @@ 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)
+      if (TYPE_CODE (value_type (arg1)) == TYPE_CODE_STRUCT)
        arg1 = value_addr (arg1);
       return arg1;
     default:
@@ -938,38 +942,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)
@@ -1071,6 +1044,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,
@@ -1084,11 +1102,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,
@@ -1096,26 +1114,25 @@ 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 */
   java_class_name_from_physname,/* Language specific class name */
-  {"", "", "", ""},            /* Binary format info */
-  {"0%lo", "0", "o", ""},      /* Octal format info */
-  {"%ld", "", "d", ""},                /* Decimal format info */
-  {"0x%lx", "0x", "x", ""},    /* Hex format info */
   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
 };
 
@@ -1135,25 +1152,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;
-}
This page took 0.029857 seconds and 4 git commands to generate.