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

set testfile "jmisc"
set srcfile ${srcdir}/$subdir/${testfile}.java
set binfile ${objdir}/${subdir}/${testfile}
if {[compile_java_from_source ${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\.}
}
