# Copyright 2000-2013 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\.}
}
