# Copyright (C) 2010, 2011 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 is part of the GDB testsuite.  It tests the mechanism
# exposing values to Python.

if $tracelevel then {
    strace $tracelevel
}

load_lib gdb-python.exp

set testfile "py-symbol"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
    untested "Couldn't compile ${srcfile}"
    return -1
}

# Start with a fresh gdb.
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

# Skip all tests if Python scripting is not enabled.
if { [skip_python_tests] } { continue }

# Test looking up a global symbol before we runto_main as this is the
# point where we don't have a current frame, and we don't want to
# require one.
gdb_py_test_silent_cmd "python main_func = gdb.lookup_global_symbol(\"main\")" "Lookup main" 1
gdb_test "python print main_func.is_function" "True" "Test main_func.is_function"
gdb_test "python print gdb.lookup_global_symbol(\"junk\")" "None" "Test lookup_global_symbol(\"junk\")"

if ![runto_main] then {
    fail "Can't run to main"
    return 0
}

global hex decimal

gdb_breakpoint [gdb_get_line_number "Block break here."]
gdb_continue_to_breakpoint "Block break here."
gdb_py_test_silent_cmd "python frame = gdb.selected_frame()" "Get Frame" 0
gdb_py_test_silent_cmd "python block = frame.block()" "Get block" 0

# Test is_argument attribute.
gdb_py_test_silent_cmd "python arg = gdb.lookup_symbol(\"arg\")" "Get variable a" 0
gdb_test "python print arg\[0\].is_variable" "False" "Test arg.is_variable"
gdb_test "python print arg\[0\].is_constant" "False" "Test arg.is_constant"
gdb_test "python print arg\[0\].is_argument" "True" "Test arg.is_argument"
gdb_test "python print arg\[0\].is_function" "False" "Test arg.is_function"

# Test is_function attribute.
gdb_py_test_silent_cmd "python func = frame.block().function" "Get block" 0
gdb_test "python print func.is_variable" "False" "Test func.is_variable"
gdb_test "python print func.is_constant" "False" "Test func.is_constant"
gdb_test "python print func.is_argument" "False" "Test func.is_argument"
gdb_test "python print func.is_function" "True" "Test func.is_function"
gdb_test "python print func.name" "func" "Test func.name"
gdb_test "python print func.print_name" "func" "Test func.print_name"
gdb_test "python print func.linkage_name" "func" "Test func.linkage_name"
gdb_test "python print func.addr_class == gdb.SYMBOL_LOC_BLOCK" "True" "Test func.addr_class"

gdb_breakpoint [gdb_get_line_number "Break at end."]
gdb_continue_to_breakpoint "Break at end."
gdb_py_test_silent_cmd "python frame = gdb.selected_frame()" "Get Frame" 0

# Test is_variable attribute.
gdb_py_test_silent_cmd "python a = gdb.lookup_symbol(\'a\')" "Get variable a" 0
gdb_test "python print a\[0\].is_variable" "True" "Test a.is_variable"
gdb_test "python print a\[0\].is_constant" "False" "Test a.is_constant"
gdb_test "python print a\[0\].is_argument" "False" "Test a.is_argument"
gdb_test "python print a\[0\].is_function" "False" "Test a.is_function"
gdb_test "python print a\[0\].addr_class == gdb.SYMBOL_LOC_COMPUTED" "True" "Test a.addr_class"

# Test is_constant attribute
gdb_py_test_silent_cmd "python t = gdb.lookup_symbol(\"one\")" "Get variable a" 0
gdb_test "python print t\[0\].is_variable" "False" "Test t.is_variable"
gdb_test "python print t\[0\].is_constant" "True" "Test t.is_constant"
gdb_test "python print t\[0\].is_argument" "False" "Test t.is_argument"
gdb_test "python print t\[0\].is_function" "False" "Test t.is_function"
gdb_test "python print t\[0\].addr_class == gdb.SYMBOL_LOC_CONST" "True" "Test t.addr_class"
gdb_test "python print t\[0\].symtab" "gdb.python/py-symbol.c.*" "Get symtab"

# C++ tests
# Recompile binary.
 if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable "debug c++"] != "" } {
     untested "Couldn't compile ${srcfile} in c++ mode"
     return -1
 }

# Start with a fresh gdb.
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

if ![runto_main] then {
    fail "Can't run to main"
    return 0
}

gdb_breakpoint [gdb_get_line_number "Break in class."]
gdb_continue_to_breakpoint "Break in class."

gdb_py_test_silent_cmd "python cplusframe = gdb.selected_frame()" "Get Frame" 0
gdb_py_test_silent_cmd "python cplusfunc = cplusframe.block().function" "Get block" 0
gdb_test "python print cplusfunc.is_variable" "False" "Test func.is_variable"
gdb_test "python print cplusfunc.is_constant" "False" "Test func.is_constant"
gdb_test "python print cplusfunc.is_argument" "False" "Test func.is_argument"
gdb_test "python print cplusfunc.is_function" "True" "Test func.is_function"
gdb_test "python print cplusfunc.name" "SimpleClass::valueofi().*" "Test func.name"
gdb_test "python print cplusfunc.print_name" "SimpleClass::valueofi().*" "Test func.print_name"
gdb_test "python print cplusfunc.linkage_name" "SimpleClass::valueofi().*" "Test func.linkage_name"
gdb_test "python print cplusfunc.addr_class == gdb.SYMBOL_LOC_BLOCK" "True" "Test func.addr_class"
