Files
mercury/tests/debugger/browser_test.exp3
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

281 lines
6.8 KiB
Plaintext

E1: C1 CALL pred browser_test.main/2-0 (det) browser_test.m:23
mdb> echo on
Command echo enabled.
mdb> register --quiet
mdb> list_context_lines 10
mdb> break big_data
0: + stop interface pred browser_test.big_data/1-0 (det)
mdb> continue
E2: C2 CALL pred browser_test.big_data/1-0 (det) browser_test.m:41 (browser_test.m:26)
mdb> finish
E3: C2 EXIT pred browser_test.big_data/1-0 (det) browser_test.m:41 (browser_test.m:26)
mdb> delete *
0: E stop interface pred browser_test.big_data/1-0 (det)
mdb> dump -q 1 browser_test.save.1
mdb> format raw_pretty
mdb> print *
Data (arg 1)
big(big(big(small, 1, small), 2, small), 3, big(big(small, 4, big/3), 6, small))
mdb> format -A verbose
mdb> print *
Data (arg 1)
big
1-big
| 1-big
| | 1-small
| | 2-1
mdb> browse 1; ls; quit
big(
big(big(small, 1, small), 2, small),
3,
big(big(small, 4, big(small, 5, small)), 6, small))
mdb> format -AP flat
mdb> print -f 1
Data (arg 1) big(big(big(small, 1, small), 2, small), 3, big(big(small, 4, big/3), 6, small))
mdb> print -p 1
Data (arg 1)
big(big(big(...), ...), 3, ...)
mdb> print -v 1
Data (arg 1)
big
1-big
| 1-big
| | 1-small
| | 2-1
| | 3-small
| 2-2
| 3-small
2-3
3-big
1-big
| 1-small
| 2-4
| 3-big/3
2-6
3-small
mdb> print -r 1
Data (arg 1)
big(
big(big(small, 1, small), 2, small),
3,
big(big(small, 4, big(small, 5, small)), 6, small))
mdb> print --xyzzy 1
print: unrecognized option: `xyzzy'
mdb: print: usage error -- type `help print' for help.
mdb> browse 1; print; quit
big(
big(big(small, 1, small), 2, small),
3,
big(big(small, 4, big(small, 5, small)), 6, small))
mdb> browse -f 1; ls; quit
big(big(big(small, 1, small), 2, small), 3, big(big(small, 4, big(small, 5, small)), 6, small))
mdb> browse Data
browser> ls
big(
big(big(small, 1, small), 2, small),
3,
big(big(small, 4, big(small, 5, small)), 6, small))
browser> cd /1
browser> ls
big(big(small, 1, small), 2, small)
browser> cd /1/2
browser> ls
2
browser> cd /3
browser> ls
big(big(small, 4, big(small, 5, small)), 6, small)
browser> cd 1/3/2
browser> ls
5
browser> cd
browser> ls
big(
big(big(small, 1, small), 2, small),
3,
big(big(small, 4, big(small, 5, small)), 6, small))
browser> cdr 100 2
error: in subdir 2: there is no subterm 2
browser> cdr 3 1
browser> ls
small
browser> cdr 3 ../1/..
browser> ls
big(
big(big(small, 1, small), 2, small),
3,
big(big(small, 4, big(small, 5, small)), 6, small))
browser> quit
mdb> format_param -A -f depth 1
mdb> print *
Data (arg 1) big(big/3, 3, big/3)
mdb> print Data/1
Data (arg 1)^1 big(big(small, 1, small), 2, small)
mdb> format_param -f depth 3
mdb> print 1
Data (arg 1) big(big(big(small, 1, small), 2, small), 3, big(big(small, 4, big/3), 6, small))
mdb> print Data/1/2
Data (arg 1)/1/2 2
mdb> print 1^1^2^3
mdb: at 1^2^ the path 3 does not exist in variable 1.
mdb> retry
E2: C2 CALL pred browser_test.big_data/1-0 (det) browser_test.m:41 (browser_test.m:26)
mdb> break list_data
0: + stop interface pred browser_test.list_data/1-0 (det)
mdb> continue
big(big(big(small, 1, small), 2, small), 3, big(big(small, 4, big(small, 5, small)), 6, small)).
E4: C3 CALL pred browser_test.list_data/1-0 (det) browser_test.m:70 (browser_test.m:29)
mdb> finish
E5: C3 EXIT pred browser_test.list_data/1-0 (det) browser_test.m:70 (browser_test.m:29)
mdb> dump Data browser_test.save.2
Dumped Data to browser_test.save.2
mdb> dump -x Data browser_test.save.3
Dumped Data to browser_test.save.3
mdb> dump -p Data browser_test.save.4
Dumped Data to browser_test.save.4
mdb> dump -p Data^2 browser_test.save.5
Dumped Data to browser_test.save.5
mdb> dump -p Data^42 browser_test.save.5
mdb: there is no path 42.
mdb> break a_func
1: + stop interface func browser_test.a_func/1-0 (det)
mdb> continue
seq(1, [big(big(small, 1, small), 2, small), small, big(small, 4, big(small, 5, small))], 5).
browser_test.save.1:
big(
big(
big(
small,
1,
small
),
2,
small
),
3,
big(
big(
small,
4,
big(
small,
5,
small
)
),
6,
small
)
)
browser_test.save.2:
seq(
1,
[
big(
big(
small,
1,
small
),
2,
small
),
small,
big(
small,
4,
big(
small,
5,
small
)
)
],
5
)
browser_test.save.3:
<?xml version="1.0"?>
<seq functor="seq" type="browser_test.big" arity="3">
<Int type="int">1</Int>
<List functor="[|]" type="list.list(browser_test.big)" arity="2">
<big functor="big" type="browser_test.big" arity="3">
<big functor="big" type="browser_test.big" arity="3">
<small functor="small" type="browser_test.big" arity="0" />
<Int type="int">1</Int>
<small functor="small" type="browser_test.big" arity="0" />
</big>
<Int type="int">2</Int>
<small functor="small" type="browser_test.big" arity="0" />
</big>
<List functor="[|]" type="list.list(browser_test.big)" arity="2">
<small functor="small" type="browser_test.big" arity="0" />
<List functor="[|]" type="list.list(browser_test.big)" arity="2">
<big functor="big" type="browser_test.big" arity="3">
<small functor="small" type="browser_test.big" arity="0" />
<Int type="int">4</Int>
<big functor="big" type="browser_test.big" arity="3">
<small functor="small" type="browser_test.big" arity="0" />
<Int type="int">5</Int>
<small functor="small" type="browser_test.big" arity="0" />
</big>
</big>
<Nil functor="[]" type="list.list(browser_test.big)" arity="0" />
</List>
</List>
</List>
<Int type="int">5</Int>
</seq>
browser_test.save.4:
seq(1,
[big(big(small, 1, small), 2, small), small,
big(small, 4, big(small, 5, small))], 5)
browser_test.save.5:
[big(big(small, 1, small), 2, small), small,
big(small, 4, big(small, 5, small))]
E6: C4 CALL func browser_test.a_func/1-0 (det) browser_test.m:116 (browser_test.m:35)
mdb> finish
E7: C4 EXIT func browser_test.a_func/1-0 (det) browser_test.m:116 (browser_test.m:35)
mdb> print -p
a_func(big(big(...), ...)) = big(big(...), ...)
mdb> print -r
a_func(
big(
big(big(small, 1, small), 2, small),
3,
big(big(small, 4, big(small, 5, small)), 6, small)))
= big(
big(big(small, 1, small), 2, small),
3,
big(big(small, 4, big(small, 5, small)), 6, small))
mdb> print -v
a_func
1-big
| 1-big
| | 1-big/3
| | 2-2
| | 3-small
| 2-3
| 3-big
| 1-big/3
| 2-6
| 3-small
2-big
1-big
| 1-big/3
| 2-2
| 3-small
2-3
3-big
1-big/3
2-6
3-small
mdb> print -f
a_func(big(big(big/3, 2, small), 3, big(big/3, 6, small))) = big(big(big/3, 2, small), 3, big(big/3, 6, small))
mdb> continue
big(big(big(small, 1, small), 2, small), 3, big(big(small, 4, big(small, 5, small)), 6, small))