2019-10-18 09:05:08 -04:00
|
|
|
! Copyright (C) 2006, 2007 Slava Pestov.
|
2006-07-30 22:08:47 -04:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
|
|
|
IN: gadgets-walker
|
2019-10-18 09:05:08 -04:00
|
|
|
USING: arrays errors gadgets gadgets-buttons assocs
|
2006-07-30 23:20:08 -04:00
|
|
|
gadgets-listener gadgets-panes gadgets-scrolling gadgets-text
|
2019-10-18 09:05:08 -04:00
|
|
|
gadgets-tracks gadgets-workspace generic hashtables
|
2006-07-30 23:20:08 -04:00
|
|
|
interpreter io kernel kernel-internals listener math models
|
2019-10-18 09:05:08 -04:00
|
|
|
namespaces sequences shells threads vectors quotations
|
|
|
|
|
prettyprint gadgets-traceback inspector ;
|
2006-07-30 22:08:47 -04:00
|
|
|
|
|
|
|
|
: <quotation-display> ( quot -- gadget )
|
2006-08-28 18:14:54 -04:00
|
|
|
[ [ first2 callframe. ] when* ]
|
2006-08-29 18:27:51 -04:00
|
|
|
"Current quotation" <labelled-pane> ;
|
2006-07-30 22:08:47 -04:00
|
|
|
|
2006-08-24 04:08:21 -04:00
|
|
|
TUPLE: walker-gadget model quot ns ;
|
2006-07-30 22:08:47 -04:00
|
|
|
|
2006-07-30 23:20:08 -04:00
|
|
|
: update-stacks ( walker -- )
|
2019-10-18 09:05:08 -04:00
|
|
|
meta-interp get
|
|
|
|
|
over walker-gadget-model set-model
|
|
|
|
|
callframe get callframe-scan get 2array
|
|
|
|
|
swap walker-gadget-quot set-model ;
|
2006-07-30 23:20:08 -04:00
|
|
|
|
2006-08-24 02:40:03 -04:00
|
|
|
: with-walker ( gadget quot -- )
|
2006-08-24 18:23:48 -04:00
|
|
|
swap dup walker-gadget-ns
|
|
|
|
|
[ slip update-stacks ] bind ; inline
|
2006-07-30 23:20:08 -04:00
|
|
|
|
2019-10-18 09:05:08 -04:00
|
|
|
: walker-active? ( walker -- ? )
|
|
|
|
|
meta-interp swap walker-gadget-ns key? ;
|
2006-08-28 03:08:58 -04:00
|
|
|
|
2019-10-18 09:05:08 -04:00
|
|
|
: walker-command ( gadget quot -- )
|
|
|
|
|
over walker-active? [ with-walker ] [ 2drop ] if ; inline
|
2006-08-28 02:57:50 -04:00
|
|
|
|
2019-10-18 09:05:08 -04:00
|
|
|
: com-step [ step ] walker-command ;
|
|
|
|
|
: com-into [ step-in ] walker-command ;
|
|
|
|
|
: com-out [ step-out ] walker-command ;
|
|
|
|
|
: com-back [ step-back ] walker-command ;
|
2006-07-30 22:08:47 -04:00
|
|
|
|
2006-09-08 02:32:14 -04:00
|
|
|
: init-walker-models ( walker -- )
|
2006-08-26 17:13:24 -04:00
|
|
|
f <model> over set-walker-gadget-quot
|
2019-10-18 09:05:08 -04:00
|
|
|
f <model> over set-walker-gadget-model
|
|
|
|
|
H{ } clone swap set-walker-gadget-ns ;
|
2006-07-30 22:08:47 -04:00
|
|
|
|
2019-10-18 09:05:08 -04:00
|
|
|
: reset-walker ( walker -- )
|
|
|
|
|
dup walker-gadget-ns clear-assoc
|
|
|
|
|
[ V{ } clone meta-history set ] with-walker ;
|
2006-08-26 17:13:24 -04:00
|
|
|
|
2006-07-30 22:08:47 -04:00
|
|
|
C: walker-gadget ( -- gadget )
|
2019-10-18 09:05:08 -04:00
|
|
|
dup init-walker-models [
|
|
|
|
|
toolbar,
|
|
|
|
|
g walker-gadget-quot <quotation-display> 1/4 track,
|
|
|
|
|
g walker-gadget-model <traceback-gadget> 3/4 track,
|
|
|
|
|
] { 0 1 } build-track
|
|
|
|
|
dup reset-walker ;
|
2006-09-14 16:15:39 -04:00
|
|
|
|
|
|
|
|
M: walker-gadget call-tool* ( continuation walker -- )
|
2019-10-18 09:05:08 -04:00
|
|
|
[ restore ] with-walker ;
|
|
|
|
|
|
|
|
|
|
: com-inspect ( walker -- )
|
|
|
|
|
dup walker-active? [
|
|
|
|
|
meta-interp swap walker-gadget-ns at
|
|
|
|
|
[ inspect ] curry call-listener
|
|
|
|
|
] [
|
|
|
|
|
drop
|
|
|
|
|
] if ;
|
|
|
|
|
|
|
|
|
|
: com-continue ( walker -- )
|
|
|
|
|
dup [ step-all ] walker-command reset-walker ;
|
|
|
|
|
|
|
|
|
|
: com-abandon ( walker -- )
|
|
|
|
|
dup [ abandon ] walker-command reset-walker ;
|
|
|
|
|
|
|
|
|
|
: walker-help "ui-walker" help-window ;
|
|
|
|
|
|
|
|
|
|
\ walker-help H{ { +nullary+ t } } define-command
|
|
|
|
|
|
|
|
|
|
walker-gadget "toolbar" f {
|
|
|
|
|
{ T{ key-down f { A+ } "s" } com-step }
|
|
|
|
|
{ T{ key-down f { A+ } "i" } com-into }
|
|
|
|
|
{ T{ key-down f { A+ } "o" } com-out }
|
|
|
|
|
{ T{ key-down f { A+ } "b" } com-back }
|
|
|
|
|
{ T{ key-down f { A+ } "c" } com-continue }
|
|
|
|
|
{ T{ key-down f f "F1" } walker-help }
|
|
|
|
|
} define-command-map
|
|
|
|
|
|
|
|
|
|
walker-gadget "other" f {
|
|
|
|
|
{ T{ key-down f { A+ } "a" } com-abandon }
|
|
|
|
|
{ T{ key-down f { A+ } "n" } com-inspect }
|
|
|
|
|
} define-command-map
|
2006-09-14 16:15:39 -04:00
|
|
|
|
|
|
|
|
[ walker-gadget call-tool stop ] break-hook set-global
|
|
|
|
|
|
|
|
|
|
IN: tools
|
|
|
|
|
|
|
|
|
|
: walk ( quot -- ) [ break ] swap append call ;
|