# Copyright 2002, 2003, 2004 Free Software Foundation, Inc.

# 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.  

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

# This file was written by Anthony Green. (green@redhat.com)
#

if $tracelevel then {
	strace $tracelevel
}

load_lib "java.exp"

set testfile "jmisc"
set srcfile ${srcdir}/$subdir/${testfile}.java
set binfile ${objdir}/${subdir}/${testfile}
if  { [compile_java_from_source ${srcfile} ${binfile} "-g"] != "" } {
    untested "Couldn't compile ${srcfile}"
    return -1
}

# Set the current language to java.  This counts as a test.  If it
# fails, then we skip the other tests.

proc set_lang_java {} {
    global gdb_prompt
    global binfile objdir subdir

    verbose "loading file '$binfile'"
    gdb_load $binfile

    send_gdb "set language java\n"
    gdb_expect {
	-re ".*$gdb_prompt $" {}
	timeout { fail "set language java (timeout)" ; return 0 }
    }

    return [gdb_test "show language" ".* source language is \"java\".*" \
	"set language to \"java\""]
}

set prms_id 0
set bug_id 0

# Start with a fresh gdb.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir

gdb_test "set print sevenbit-strings" ".*"

if ![set_lang_java] then {
    runto ${testfile}.main(java.lang.String\[\])

    send_gdb "ptype jmisc\n"   
    gdb_expect {   
	-re "type = class jmisc  extends java.lang.Object \{\[\r\n\ \t]+void main\\(java\.lang\.String\\\[]\\);\[\r\n\ \t]+jmisc\\(\\);\[\r\n\ \t]+\}\[\r\n\ \t]+$gdb_prompt $"               { pass "ptype jmisc" }
	-re ".*$gdb_prompt $"             { fail "ptype jmisc" }
	timeout { fail "ptype jmisc (timeout)" ; return }
    }

    send_gdb "p args\n"
    gdb_expect {   
	-re "\\\$1 = java\.lang\.String\\\[]@\[a-f0-9]+\[\r\n\ \t]+$gdb_prompt $"                                        { pass "p args" }
	-re ".*$gdb_prompt $"             { fail "p args" }
	timeout { fail "p args (timeout)" ; return }
    }

    send_gdb "p *args\n"
    gdb_expect {   
	-re "\\\$2 = \{length: 0\}\[\r\n\ \t]+$gdb_prompt $"                                                             { pass "p *args" }
	-re ".*$gdb_prompt $"             { fail "p *args" }
	timeout { fail "p *args (timeout)" ; return }
    }

    # The idea of running to 'exit' is that 'exit' is in a different
    # objfile from the rest of the program (provided that program is
    # linked normally with a shared libc).  That causes gdb to examine
    # fresh objfiles.  There is nothing important about 'exit'
    # semantics; it could be any symbol that is in a shared library.
    # -- chastain 2003-08-06

    gdb_test "break exit" ".*Breakpoint $decimal at .*"
    gdb_test_multiple "continue" "continue to exit" {
	-re ".*Breakpoint $decimal, .*exit.*$gdb_prompt $" {
	    pass "continue to exit"
	}
	-re ".*internal-error: sect_index_text not initialized.*\\(y or n\\) " {
	    # gdb choked on the "anonymous objfile" (probably).
	    kfail "gdb/1322" "continue to exit"
	    # get back to the gdb prompt
	    gdb_test_multiple "no" "internal sync 1" {
		-re ".*\\(y or n\\) " {
		    gdb_test_multiple "no" "internal sync 2" {
			-re ".*$gdb_prompt $" { ; }
		    }
		}
	    }
	}
    }
}
