# Copyright 2000, 2004, 2006-2012 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 3 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, see <http://www.gnu.org/licenses/>.

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

load_lib "java.exp"

if { [skip_java_tests] } { continue }

standard_testfile .java
if {[compile_java_from_source $srcdir/$subdir/$srcfile $binfile "-g"] != ""} {
    continue
}


# Start with a fresh gdb.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load $binfile

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

if [set_lang_java] then {
    # Ref PR gdb:java/1565.  Don't use the simpler "break jmisc.main".
    # As of 2004-02-24 it wasn't working and is being tested separatly.
    # Before GCJ 4.1 (approximately) the demangled name did not include
    # a method signature; after that point it does include a trailing
    # signature.
    runto_main
    set function "${testfile}.main(java.lang.String\[\])"
    gdb_breakpoint "$function" { allow-pending }
    gdb_breakpoint "${function}void" { allow-pending }
    gdb_continue_to_breakpoint $function

    gdb_test_multiple "ptype jmisc" "ptype jmisc" {
	-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 "type = class jmisc  extends java.lang.Object \{\[\r\n\ \t]+jmisc\\(\\);\[\r\n\ \t]+void main\\(java\.lang\.String\\\[]\\);\[\r\n\ \t]+\}\[\r\n\ \t]+$gdb_prompt $" {
	    pass "ptype jmisc"
	}
    }

    gdb_test "p args" \
	"\\\$1 = java\.lang\.String\\\[]@\[a-f0-9]+"

    gdb_test_multiple "p *args" "p *args" {
	-re "\\\$2 = \{length: 0\}\[\r\n\ \t]+$gdb_prompt $" {
	    pass "p *args"
	}
	-re "\\\$2 = cannot find java.lang.Object.*$gdb_prompt $" {
	    # Sometimes GCC 4.x does not emit the necessary information
	    # about java.lang.Object.
	    kfail "p *args" gdb/2214
	}
    }

    # 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

    if [gdb_breakpoint exit] {
	pass "break exit"
    }
    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 $" { ; }
		    }
		}
	    }
	}
    }

    # Test a non-mathing return type really fails the look up.
    gdb_test_no_output "set breakpoint pending off"
    gdb_test {break jmisc.main(java.lang.String[])int} {Function "jmisc\.main\(java\.lang\.String\[\]\)int" not defined\.}
}
