Files
mercury/tests/debugger/browser_test.m
Zoltan Somogyi 0de9ea32c7 Let mdb's dump command dump just a part of a variable' value.
trace/mercury_trace_cmd_browsing.c:
    Change the dump command to allow the name of the variable
    whose value is to be dumped to be followed by a path,
    specifying the *part* of the variable's value to be printed.

trace/mercury_trace_vars.[ch]:
    To make that possible, provide a version of an existing function
    that returns an extra value that the new code in
    mercury_trace_cmd_browsing.c needs, and another extra value
    that conceptually belongs with it.

    Mark strange code with an XXX.

NEWS.md:
    Announce both this new capability and a just-now contributes predicate.

library/pqueue.m:
    Make the just-now contributed code more readable.

tests/debugger/browser_test.{m,inp,exp3}:
    Extend this test case to test the new functionality.
2025-07-26 19:36:21 +02:00

136 lines
3.2 KiB
Mathematica

%---------------------------------------------------------------------------%
% vim: ts=4 sw=4 et ft=mercury
%---------------------------------------------------------------------------%
% The .exp file is for ???.
% The .exp2 file is for ???.
% The .exp3 file is for asm_fast.gc and asm_fast.gc.debug.
:- module browser_test.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is det.
:- implementation.
:- import_module io.file.
:- import_module list.
:- type big
---> big(big, int, big)
; small
; seq(int, list(big), int).
main(!IO) :-
% In case we have these files lying around.
remove_dump_files(!IO),
big_data(Data),
io.print(Data, !IO),
io.write_string(".\n", !IO),
list_data(List),
io.print(List, !IO),
io.write_string(".\n", !IO),
print_dump_files(!IO),
% Clean up after the test.
remove_dump_files(!IO),
a_func(Data) = Data2,
io.write(Data2, !IO),
io.nl(!IO).
:- pred big_data(big::out) is det.
big_data(Data) :-
Data = big(
big(
big(
small,
1,
small
),
2,
small
),
3,
big(
big(
small,
4,
big(
small,
5,
small
)
),
6,
small
)
).
:- pred list_data(big::out) is det.
list_data(Data) :-
Element1 = big(
big(
small,
1,
small
),
2,
small
),
Element2 = small,
Element3 = big(
small,
4,
big(
small,
5,
small
)
),
Data = seq(1, [Element1, Element2, Element3], 5).
:- pred print_file(string::in, io::di, io::uo) is det.
print_file(FileName, !IO) :-
io.open_input(FileName, OpenRes, !IO),
(
OpenRes = ok(Stream),
io.read_file_as_string(Stream, ReadRes, !IO),
(
ReadRes = ok(Contents),
io.write_string(FileName, !IO),
io.write_string(":\n", !IO),
io.write_string(Contents, !IO),
io.write_string("\n", !IO)
;
ReadRes = error(_, _),
io.write_string("read failed\n", !IO)
)
;
OpenRes = error(_),
io.write_string("open failed\n", !IO)
).
:- func a_func(big) = big.
a_func(_) = Big :-
big_data(Big).
:- pred remove_dump_files(io::di, io::uo) is det.
remove_dump_files(!IO) :-
io.file.remove_file("browser_test.save.1", _, !IO),
io.file.remove_file("browser_test.save.2", _, !IO),
io.file.remove_file("browser_test.save.3", _, !IO),
io.file.remove_file("browser_test.save.4", _, !IO),
io.file.remove_file("browser_test.save.5", _, !IO).
:- pred print_dump_files(io::di, io::uo) is det.
print_dump_files(!IO) :-
print_file("browser_test.save.1", !IO),
print_file("browser_test.save.2", !IO),
print_file("browser_test.save.3", !IO),
print_file("browser_test.save.4", !IO),
print_file("browser_test.save.5", !IO).