Fix hang when clicking presentations in the walker; improve traceback widget
							parent
							
								
									f8df1936a6
								
							
						
					
					
						commit
						a5503782d7
					
				| 
						 | 
				
			
			@ -14,6 +14,10 @@ HELP: raise-flag
 | 
			
		|||
{ $values { "flag" flag } }
 | 
			
		||||
{ $description "Raises a flag, notifying any threads waiting on it. Does nothing if the flag has already been raised." } ;
 | 
			
		||||
 | 
			
		||||
HELP: wait-for-flag
 | 
			
		||||
{ $values { "flag" flag } }
 | 
			
		||||
{ $description "Waits for a flag to be raised. If the flag has already been raised, returns immediately." } ;
 | 
			
		||||
 | 
			
		||||
HELP: lower-flag
 | 
			
		||||
{ $values { "flag" flag } }
 | 
			
		||||
{ $description "Attempts to lower a flag. If the flag has been raised previously, returns immediately, otherwise waits for it to be raised first." } ;
 | 
			
		||||
| 
						 | 
				
			
			@ -26,8 +30,9 @@ $nl
 | 
			
		|||
"Essentially, a flag can be thought of as a counting semaphore where the count never goes above one."
 | 
			
		||||
{ $subsection flag }
 | 
			
		||||
{ $subsection flag? }
 | 
			
		||||
"Raising and lowering flags:"
 | 
			
		||||
"Waiting for a flag to be raised:"
 | 
			
		||||
{ $subsection raise-flag }
 | 
			
		||||
{ $subsection wait-for-flag }
 | 
			
		||||
{ $subsection lower-flag } ;
 | 
			
		||||
 | 
			
		||||
ABOUT: "concurrency.flags"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,9 +13,14 @@ TUPLE: flag value? thread ;
 | 
			
		|||
        [ resume ] [ drop t over set-flag-value? ] if
 | 
			
		||||
    ] unless drop ;
 | 
			
		||||
 | 
			
		||||
: wait-for-flag ( flag -- )
 | 
			
		||||
    dup flag-value? [ drop ] [
 | 
			
		||||
        [ flag-thread >box ] curry "flag" suspend drop
 | 
			
		||||
    ] if ;
 | 
			
		||||
 | 
			
		||||
: lower-flag ( flag -- )
 | 
			
		||||
    dup flag-value? [
 | 
			
		||||
        f swap set-flag-value?
 | 
			
		||||
    ] [
 | 
			
		||||
        [ flag-thread >box ] curry "flag" suspend drop
 | 
			
		||||
        wait-for-flag
 | 
			
		||||
    ] if ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,18 +1,15 @@
 | 
			
		|||
! Copyright (C) 2006, 2008 Slava Pestov.
 | 
			
		||||
! See http://factorcode.org/license.txt for BSD license.
 | 
			
		||||
USING: arrays assocs combinators continuations documents
 | 
			
		||||
ui.tools.workspace hashtables io io.styles kernel math
 | 
			
		||||
 hashtables io io.styles kernel math
 | 
			
		||||
math.vectors models namespaces parser prettyprint quotations
 | 
			
		||||
sequences sequences.lib strings threads listener
 | 
			
		||||
tuples ui.commands ui.gadgets ui.gadgets.editors
 | 
			
		||||
ui.gadgets.presentations ui.gadgets.worlds ui.gestures
 | 
			
		||||
definitions boxes calendar ;
 | 
			
		||||
definitions boxes calendar concurrency.flags ui.tools.workspace ;
 | 
			
		||||
IN: ui.tools.interactor
 | 
			
		||||
 | 
			
		||||
TUPLE: interactor
 | 
			
		||||
history output
 | 
			
		||||
thread quot
 | 
			
		||||
help ;
 | 
			
		||||
TUPLE: interactor history output flag thread help ;
 | 
			
		||||
 | 
			
		||||
: interactor-continuation ( interactor -- continuation )
 | 
			
		||||
    interactor-thread box-value
 | 
			
		||||
| 
						 | 
				
			
			@ -35,12 +32,16 @@ help ;
 | 
			
		|||
: init-interactor-history ( interactor -- )
 | 
			
		||||
    V{ } clone swap set-interactor-history ;
 | 
			
		||||
 | 
			
		||||
: init-interactor-state ( interactor -- )
 | 
			
		||||
    <flag> over set-interactor-flag
 | 
			
		||||
    <box> swap set-interactor-thread ;
 | 
			
		||||
 | 
			
		||||
: <interactor> ( output -- gadget )
 | 
			
		||||
    <source-editor>
 | 
			
		||||
    interactor construct-editor
 | 
			
		||||
    tuck set-interactor-output
 | 
			
		||||
    <box> over set-interactor-thread
 | 
			
		||||
    dup init-interactor-history
 | 
			
		||||
    dup init-interactor-state
 | 
			
		||||
    dup init-caret-help ;
 | 
			
		||||
 | 
			
		||||
M: interactor graft*
 | 
			
		||||
| 
						 | 
				
			
			@ -97,7 +98,10 @@ M: interactor model-changed
 | 
			
		|||
    ] unless drop ;
 | 
			
		||||
 | 
			
		||||
: interactor-yield ( interactor -- obj )
 | 
			
		||||
    [ interactor-thread >box ] curry "input" suspend ;
 | 
			
		||||
    [
 | 
			
		||||
        [ interactor-thread >box ] keep
 | 
			
		||||
        interactor-flag raise-flag
 | 
			
		||||
    ] curry "input" suspend ;
 | 
			
		||||
 | 
			
		||||
M: interactor stream-readln
 | 
			
		||||
    [ interactor-yield ] keep interactor-finish ?first ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,7 +6,7 @@ kernel models namespaces parser quotations sequences ui.commands
 | 
			
		|||
ui.gadgets ui.gadgets.editors ui.gadgets.labelled
 | 
			
		||||
ui.gadgets.panes ui.gadgets.buttons ui.gadgets.scrollers
 | 
			
		||||
ui.gadgets.tracks ui.gestures ui.operations vocabs words
 | 
			
		||||
prettyprint listener debugger threads boxes ;
 | 
			
		||||
prettyprint listener debugger threads boxes concurrency.flags ;
 | 
			
		||||
IN: ui.tools.listener
 | 
			
		||||
 | 
			
		||||
TUPLE: listener-gadget input output stack ;
 | 
			
		||||
| 
						 | 
				
			
			@ -131,10 +131,18 @@ M: stack-display tool-scroller
 | 
			
		|||
        listener
 | 
			
		||||
    ] with-stream* ;
 | 
			
		||||
 | 
			
		||||
: start-listener-thread ( listener -- )
 | 
			
		||||
    [ listener-thread ] curry "Listener" spawn drop ;
 | 
			
		||||
 | 
			
		||||
: wait-for-listener ( listener -- )
 | 
			
		||||
    #! Wait for the listener to start.
 | 
			
		||||
    listener-gadget-input interactor-flag wait-for-flag ;
 | 
			
		||||
 | 
			
		||||
: restart-listener ( listener -- )
 | 
			
		||||
    #! Returns when listener is ready to receive input.
 | 
			
		||||
    dup com-end dup clear-output
 | 
			
		||||
    [ listener-thread ] curry
 | 
			
		||||
    "Listener" spawn drop ;
 | 
			
		||||
    dup start-listener-thread
 | 
			
		||||
    wait-for-listener ;
 | 
			
		||||
 | 
			
		||||
: init-listener ( listener -- )
 | 
			
		||||
    f <model> swap set-listener-gadget-stack ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -83,5 +83,7 @@ workspace "workflow" f {
 | 
			
		|||
} define-command-map
 | 
			
		||||
 | 
			
		||||
[
 | 
			
		||||
    <workspace> "Factor workspace" open-status-window
 | 
			
		||||
    <workspace>
 | 
			
		||||
    dup "Factor workspace" open-status-window
 | 
			
		||||
    workspace-listener wait-for-listener
 | 
			
		||||
] workspace-window-hook set-global
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,8 +1,10 @@
 | 
			
		|||
! Copyright (C) 2006, 2007 Slava Pestov.
 | 
			
		||||
! Copyright (C) 2006, 2008 Slava Pestov.
 | 
			
		||||
! See http://factorcode.org/license.txt for BSD license.
 | 
			
		||||
USING: continuations kernel models namespaces prettyprint ui
 | 
			
		||||
ui.commands ui.gadgets ui.gadgets.labelled assocs
 | 
			
		||||
ui.gadgets.tracks ui.gestures sequences hashtables inspector ;
 | 
			
		||||
ui.gadgets.tracks ui.gadgets.buttons ui.gadgets.panes
 | 
			
		||||
ui.gadgets.status-bar ui.gadgets.scrollers
 | 
			
		||||
ui.gestures sequences hashtables inspector ;
 | 
			
		||||
IN: ui.tools.traceback
 | 
			
		||||
 | 
			
		||||
: <callstack-display> ( model -- gadget )
 | 
			
		||||
| 
						 | 
				
			
			@ -17,10 +19,6 @@ IN: ui.tools.traceback
 | 
			
		|||
    [ [ continuation-retain stack. ] when* ]
 | 
			
		||||
    t "Retain stack" <labelled-pane> ;
 | 
			
		||||
 | 
			
		||||
: <namestack-display> ( model -- gadget )
 | 
			
		||||
    [ [ continuation-name namestack. ] when* ]
 | 
			
		||||
    f "Dynamic variables" <labelled-pane> ;
 | 
			
		||||
 | 
			
		||||
TUPLE: traceback-gadget ;
 | 
			
		||||
 | 
			
		||||
M: traceback-gadget pref-dim* drop { 550 600 } ;
 | 
			
		||||
| 
						 | 
				
			
			@ -31,11 +29,32 @@ M: traceback-gadget pref-dim* drop { 550 600 } ;
 | 
			
		|||
            [
 | 
			
		||||
                g gadget-model <datastack-display> 1/2 track,
 | 
			
		||||
                g gadget-model <retainstack-display> 1/2 track,
 | 
			
		||||
            ] { 1 0 } make-track 1/5 track,
 | 
			
		||||
            g gadget-model <callstack-display> 2/5 track,
 | 
			
		||||
            g gadget-model <namestack-display> 2/5 track,
 | 
			
		||||
            ] { 1 0 } make-track 1/3 track,
 | 
			
		||||
            g gadget-model <callstack-display> 2/3 track,
 | 
			
		||||
            toolbar,
 | 
			
		||||
        ] with-gadget
 | 
			
		||||
    ] keep ;
 | 
			
		||||
 | 
			
		||||
: <namestack-display> ( model -- gadget )
 | 
			
		||||
    [ [ continuation-name namestack. ] when* ]
 | 
			
		||||
    <pane-control> ;
 | 
			
		||||
 | 
			
		||||
TUPLE: variables-gadget ;
 | 
			
		||||
 | 
			
		||||
: <variables-gadget> ( model -- gadget )
 | 
			
		||||
    <namestack-display> <scroller>
 | 
			
		||||
    variables-gadget construct-empty
 | 
			
		||||
    [ set-gadget-delegate ] keep ;
 | 
			
		||||
 | 
			
		||||
M: variables-gadget pref-dim* drop { 400 400 } ;
 | 
			
		||||
 | 
			
		||||
: variables ( traceback -- )
 | 
			
		||||
    gadget-model <variables-gadget>
 | 
			
		||||
    "Dynamic variables" open-status-window ;
 | 
			
		||||
 | 
			
		||||
: traceback-window ( continuation -- )
 | 
			
		||||
    <model> <traceback-gadget> "Traceback" open-window ;
 | 
			
		||||
 | 
			
		||||
traceback-gadget "toolbar" f {
 | 
			
		||||
    { T{ key-down f f "v" } variables }
 | 
			
		||||
} define-command-map
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,5 +7,4 @@ ARTICLE: "ui-walker" "UI walker"
 | 
			
		|||
$nl
 | 
			
		||||
"The walker can travel backwards through time, and restore stacks. This does not undo side effects and therefore can only be used reliably on referentially transparent code."
 | 
			
		||||
{ $command-map walker-gadget "toolbar" }
 | 
			
		||||
{ $command-map walker-gadget "other" }
 | 
			
		||||
"Walkers are instances of " { $link walker-gadget } "." ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,10 +26,6 @@ TUPLE: walker-gadget status continuation thread ;
 | 
			
		|||
 | 
			
		||||
: com-abandon ( walker -- ) abandon walker-command ;
 | 
			
		||||
 | 
			
		||||
: com-inspect ( walker -- )
 | 
			
		||||
    walker-continuation model-value
 | 
			
		||||
    [ inspect ] curry call-listener ;
 | 
			
		||||
 | 
			
		||||
M: walker-gadget ungraft*
 | 
			
		||||
    dup delegate ungraft* detach walker-command ;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -69,12 +65,8 @@ walker-gadget "toolbar" f {
 | 
			
		|||
    { T{ key-down f f "b" } com-back }
 | 
			
		||||
    { T{ key-down f f "c" } com-continue }
 | 
			
		||||
    { T{ key-down f f "a" } com-abandon }
 | 
			
		||||
    { T{ key-down f f "F1" } walker-help }
 | 
			
		||||
} define-command-map
 | 
			
		||||
 | 
			
		||||
walker-gadget "other" f {
 | 
			
		||||
    { T{ key-down f f "n" } com-inspect }
 | 
			
		||||
    { T{ key-down f f "d" } close-window }
 | 
			
		||||
    { T{ key-down f f "F1" } walker-help }
 | 
			
		||||
} define-command-map
 | 
			
		||||
 | 
			
		||||
: walker-window ( -- )
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue