/* Support for printing Java values for GDB, the GNU debugger.
   Copyright 1997 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
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
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.  */

#include "defs.h"
#include "symtab.h"
#include "gdbtypes.h"
#include "expression.h"
#include "value.h"
#include "demangle.h"
#include "valprint.h"
#include "language.h"
#include "jv-lang.h"
#include "c-lang.h"

int
java_value_print (val, stream, format, pretty)
     value_ptr val;
     GDB_FILE *stream;
     int format;
     enum val_prettyprint pretty;
{
  struct type *type = VALUE_TYPE (val);
  if (TYPE_CODE (type) == TYPE_CODE_PTR)
    {
      fprintf_filtered (stream, "(");
      type_print (TYPE_TARGET_TYPE (type), "", stream, -1);
      fprintf_filtered (stream, ") ");
    }
  return (val_print (VALUE_TYPE (val), VALUE_CONTENTS (val),
		     VALUE_ADDRESS (val) + VALUE_OFFSET (val),
		     stream, format, 1, 0, pretty));
}

int
java_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
	     pretty)
     struct type *type;
     char *valaddr;
     CORE_ADDR address;
     GDB_FILE *stream;
     int format;
     int deref_ref;
     int recurse;
     enum val_prettyprint pretty;
{
  CHECK_TYPEDEF (type);
  if (is_object_type (type))
    {
      CORE_ADDR obj_addr = unpack_pointer (type, valaddr);
      if (obj_addr != 0)
	{
	  value_ptr obj_val
	    = value_at (TYPE_TARGET_TYPE (type), obj_addr, NULL);
	  type = type_from_class (java_class_from_object (obj_val));
	  type = lookup_pointer_type (type);
	}
    }
  switch (TYPE_CODE (type))
    {
    default:
      return c_val_print (type, valaddr, address, stream, format,
			  deref_ref, recurse, pretty);
    }
}
