Home | History | Annotate | Line # | Download | only in gdb.dap
      1      1.1  christos # Copyright 2024 Free Software Foundation, Inc.
      2      1.1  christos 
      3      1.1  christos # This program is free software; you can redistribute it and/or modify
      4      1.1  christos # it under the terms of the GNU General Public License as published by
      5      1.1  christos # the Free Software Foundation; either version 3 of the License, or
      6      1.1  christos # (at your option) any later version.
      7      1.1  christos #
      8      1.1  christos # This program is distributed in the hope that it will be useful,
      9      1.1  christos # but WITHOUT ANY WARRANTY; without even the implied warranty of
     10      1.1  christos # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     11      1.1  christos # GNU General Public License for more details.
     12      1.1  christos #
     13      1.1  christos # You should have received a copy of the GNU General Public License
     14      1.1  christos # along with this program.  If not, see <http://www.gnu.org/licenses/>.
     15      1.1  christos 
     16      1.1  christos # Test that stepOut puts the return value in scope.
     17      1.1  christos 
     18      1.1  christos require allow_dap_tests
     19      1.1  christos 
     20      1.1  christos load_lib dap-support.exp
     21      1.1  christos 
     22      1.1  christos standard_testfile
     23      1.1  christos 
     24      1.1  christos if {[build_executable ${testfile}.exp $testfile] == -1} {
     25      1.1  christos     return
     26      1.1  christos }
     27      1.1  christos 
     28      1.1  christos if {[dap_initialize] == ""} {
     29      1.1  christos     return
     30      1.1  christos }
     31      1.1  christos 
     32  1.1.1.2  christos set launch_id [dap_launch $testfile]
     33  1.1.1.2  christos 
     34      1.1  christos set obj [dap_check_request_and_response "set breakpoint on function" \
     35      1.1  christos 	     setFunctionBreakpoints \
     36      1.1  christos 	     {o breakpoints [a [o name [s function_breakpoint_here]]]}]
     37      1.1  christos set fn_bpno [dap_get_breakpoint_number $obj]
     38      1.1  christos 
     39      1.1  christos dap_check_request_and_response "configurationDone" configurationDone
     40      1.1  christos 
     41  1.1.1.2  christos dap_check_response "launch response" launch $launch_id
     42  1.1.1.2  christos 
     43      1.1  christos dap_wait_for_event_and_check "inferior started" thread "body reason" started
     44      1.1  christos 
     45      1.1  christos dap_wait_for_event_and_check "stopped at function breakpoint" stopped \
     46      1.1  christos     "body reason" breakpoint \
     47      1.1  christos     "body hitBreakpointIds" $fn_bpno
     48      1.1  christos 
     49      1.1  christos dap_check_request_and_response "return from function" stepOut \
     50      1.1  christos     {o threadId [i 1]}
     51      1.1  christos dap_wait_for_event_and_check "stopped after return" stopped \
     52      1.1  christos     "body reason" step
     53      1.1  christos 
     54      1.1  christos set bt [lindex [dap_check_request_and_response "backtrace" stackTrace \
     55      1.1  christos 		    {o threadId [i 1]}] \
     56      1.1  christos 	    0]
     57      1.1  christos set frame_id [dict get [lindex [dict get $bt body stackFrames] 0] id]
     58      1.1  christos 
     59      1.1  christos set scopes [dap_check_request_and_response "get scopes" scopes \
     60      1.1  christos 		[format {o frameId [i %d]} $frame_id]]
     61      1.1  christos set scopes [dict get [lindex $scopes 0] body scopes]
     62      1.1  christos 
     63  1.1.1.2  christos gdb_assert {[llength $scopes] == 2 || [llength $scopes] == 3} "two or three scopes"
     64  1.1.1.2  christos 
     65  1.1.1.2  christos lassign $scopes scope reg_scope return_scope
     66  1.1.1.2  christos 
     67  1.1.1.2  christos set test "scope is locals"
     68  1.1.1.2  christos if { $return_scope == "" } {
     69  1.1.1.2  christos     unsupported $test
     70  1.1.1.2  christos } else {
     71  1.1.1.2  christos     gdb_assert {[dict get $scope name] == "Locals"} $test
     72  1.1.1.2  christos     gdb_assert {[dict get $scope presentationHint] == "locals"} \
     73  1.1.1.2  christos 	"locals presentation hint"
     74  1.1.1.2  christos     gdb_assert {[dict get $scope namedVariables] == 1} "one var in scope"
     75  1.1.1.2  christos 
     76  1.1.1.2  christos     gdb_assert {[dict get $return_scope name] == "Return"} "scope is return"
     77  1.1.1.2  christos     gdb_assert {[dict get $return_scope presentationHint] == "returnValue"} \
     78  1.1.1.2  christos 	"returnValue presentation hint"
     79  1.1.1.2  christos     gdb_assert {[dict get $return_scope namedVariables] == 1} \
     80  1.1.1.2  christos 	"one var in return scope"
     81  1.1.1.2  christos 
     82  1.1.1.2  christos     set num [dict get $return_scope variablesReference]
     83  1.1.1.2  christos     set refs [lindex [dap_check_request_and_response "fetch arguments" \
     84  1.1.1.2  christos 			  "variables" \
     85  1.1.1.2  christos 			  [format {o variablesReference [i %d]} $num]] \
     86  1.1.1.2  christos 		  0]
     87  1.1.1.2  christos     set varlist [lindex [dict get $refs body variables] 0]
     88  1.1.1.2  christos 
     89  1.1.1.2  christos     gdb_assert {[dict get $varlist variablesReference] > 0} \
     90  1.1.1.2  christos 	"variable has children"
     91  1.1.1.2  christos     gdb_assert {[dict get $varlist name] == "(return)"} \
     92  1.1.1.2  christos 	"variable is return value"
     93  1.1.1.2  christos }
     94  1.1.1.2  christos 
     95  1.1.1.2  christos set response_and_events [dap_request_and_response stepOut {o threadId [i 1]}]
     96  1.1.1.2  christos set response [lindex $response_and_events 0]
     97  1.1.1.2  christos if {[dict get $response success] == "true"} {
     98  1.1.1.2  christos     fail "stepOut from outermost frame should not succeed"
     99  1.1.1.2  christos } else {
    100  1.1.1.2  christos     pass "stepOut from outermost frame failed like it should"
    101  1.1.1.2  christos }
    102      1.1  christos 
    103  1.1.1.2  christos dap_check_request_and_response "still stopped and may request backtrace" \
    104  1.1.1.2  christos     stackTrace {o threadId [i 1]}
    105      1.1  christos 
    106      1.1  christos dap_shutdown
    107