# Copyright (C) 2010-2017 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.

load_lib gdb-python.exp

standard_testfile

if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} {
    return -1
}

# 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\")"

gdb_test "python print (gdb.lookup_global_symbol('main').value())" "$hex .main." \
    "print value of main"

set qq_line [gdb_get_line_number "line of qq"]
gdb_test "python print (gdb.lookup_global_symbol('qq').line)" "$qq_line" \
    "print line number of qq"

gdb_test "python print (gdb.lookup_global_symbol('qq').value())" "72" \
    "print value of qq"

gdb_test "python print (gdb.lookup_global_symbol('qq').needs_frame)" \
    "False" \
    "print whether qq needs a frame"


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 arg" 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 = block.function" "Get block function" 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"

# Test attributes of func.
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 for variable a" ".*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"

# Test attributes of a.
gdb_test "python print (a\[0\].addr_class == gdb.SYMBOL_LOC_COMPUTED)" "True" "test a.addr_class"

gdb_test "python print (a\[0\].value())" \
    "symbol requires a frame to compute its value.*"\
    "try to print value of a without a frame"
gdb_test "python print (a\[0\].value(frame))" "0" \
    "print value of a"
gdb_test "python print (a\[0\].needs_frame)" "True" \
    "print whether a needs a frame"

# Test is_constant attribute
gdb_py_test_silent_cmd "python t = gdb.lookup_symbol(\"one\")" "Get constant t" 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"

# Test attributes of t.
gdb_test "python print (t\[0\].addr_class == gdb.SYMBOL_LOC_CONST)" "True" "test t.addr_class"

# Test type attribute.
gdb_test "python print (t\[0\].type)" "enum tag" "get type"

# Test symtab attribute.
if { [is_remote host] } {
    set py_symbol_c [string_to_regexp $srcfile]
} else {
    set py_symbol_c [string_to_regexp ${srcdir}/${subdir}/${srcfile}]
}
gdb_test "python print (t\[0\].symtab)" "${py_symbol_c}" "get symtab"

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

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

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 at class" 0
gdb_py_test_silent_cmd "python cplusfunc = cplusframe.block().function" "Get function at class" 0

gdb_test "python print (cplusfunc.is_variable)" \
    "False" "Test cplusfunc.is_variable"
gdb_test "python print (cplusfunc.is_constant)" \
    "False" "Test cplusfunc.is_constant"
gdb_test "python print (cplusfunc.is_argument)" \
    "False" "Test cplusfunc.is_argument"
gdb_test "python print (cplusfunc.is_function)" \
    "True" "Test cplusfunc.is_function"

gdb_test "python print (cplusfunc.name)" "SimpleClass::valueofi().*" "test method.name"
gdb_test "python print (cplusfunc.print_name)" "SimpleClass::valueofi().*" "test method.print_name"
gdb_test "python print (cplusfunc.linkage_name)" "SimpleClass::valueofi().*" "test method.linkage_name"
gdb_test "python print (cplusfunc.addr_class == gdb.SYMBOL_LOC_BLOCK)" "True" "test method.addr_class"

# Test is_valid when the objfile is unloaded.  This must be the last
# test as it unloads the object file in GDB.
# Start with a fresh gdb.
clean_restart ${testfile}
if ![runto_main] then {
    fail "cannot run to main."
    return 0
}

gdb_breakpoint [gdb_get_line_number "Break at end."]
gdb_continue_to_breakpoint "Break at end for symbol validity" ".*Break at end.*"
gdb_py_test_silent_cmd "python a = gdb.lookup_symbol(\'a\')" "Get variable a" 0
gdb_test "python print (a\[0\].is_valid())" "True" "test symbol validity"
delete_breakpoints
gdb_unload
gdb_test "python print (a\[0\].is_valid())" "False" "test symbol non-validity"
gdb_test_no_output "python a = None" "test symbol destructor"
