83 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Factor
		
	
	
		
		
			
		
	
	
			83 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Factor
		
	
	
| 
								 | 
							
								! Copyright (C) 2005, 2008 Slava Pestov.
							 | 
						||
| 
								 | 
							
								! See http://factorcode.org/license.txt for BSD license.
							 | 
						||
| 
								 | 
							
								USING: accessors kernel words parser io summary quotations
							 | 
						||
| 
								 | 
							
								sequences prettyprint continuations effects definitions
							 | 
						||
| 
								 | 
							
								compiler.units namespaces assocs tools.walker generic
							 | 
						||
| 
								 | 
							
								inspector ;
							 | 
						||
| 
								 | 
							
								IN: tools.annotations
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								GENERIC: reset ( word -- )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: generic reset
							 | 
						||
| 
								 | 
							
								    [ call-next-method ]
							 | 
						||
| 
								 | 
							
								    [ subwords [ reset ] each ] bi ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: word reset
							 | 
						||
| 
								 | 
							
								    dup "unannotated-def" word-prop [
							 | 
						||
| 
								 | 
							
								        [
							 | 
						||
| 
								 | 
							
								            dup dup "unannotated-def" word-prop define
							 | 
						||
| 
								 | 
							
								        ] with-compilation-unit
							 | 
						||
| 
								 | 
							
								        f "unannotated-def" set-word-prop
							 | 
						||
| 
								 | 
							
								    ] [ drop ] if ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: annotate ( word quot -- )
							 | 
						||
| 
								 | 
							
								    over "unannotated-def" word-prop [
							 | 
						||
| 
								 | 
							
								        "Cannot annotate a word twice" throw
							 | 
						||
| 
								 | 
							
								    ] when
							 | 
						||
| 
								 | 
							
								    [
							 | 
						||
| 
								 | 
							
								        over dup def>> "unannotated-def" set-word-prop
							 | 
						||
| 
								 | 
							
								        >r dup def>> r> call define
							 | 
						||
| 
								 | 
							
								    ] with-compilation-unit ; inline
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: word-inputs ( word -- seq )
							 | 
						||
| 
								 | 
							
								    stack-effect [
							 | 
						||
| 
								 | 
							
								        >r datastack r> effect-in length tail*
							 | 
						||
| 
								 | 
							
								    ] [
							 | 
						||
| 
								 | 
							
								        datastack
							 | 
						||
| 
								 | 
							
								    ] if* ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: entering ( str -- )
							 | 
						||
| 
								 | 
							
								    "/-- Entering: " write dup .
							 | 
						||
| 
								 | 
							
								    word-inputs stack.
							 | 
						||
| 
								 | 
							
								    "\\--" print flush ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: leaving ( str -- )
							 | 
						||
| 
								 | 
							
								    "/-- Leaving: " write dup .
							 | 
						||
| 
								 | 
							
								    stack-effect [
							 | 
						||
| 
								 | 
							
								        >r datastack r> effect-out length tail* stack.
							 | 
						||
| 
								 | 
							
								    ] [
							 | 
						||
| 
								 | 
							
								        .s
							 | 
						||
| 
								 | 
							
								    ] if* "\\--" print flush ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: (watch) ( word def -- def )
							 | 
						||
| 
								 | 
							
								    over [ entering ] curry
							 | 
						||
| 
								 | 
							
								    rot [ leaving ] curry
							 | 
						||
| 
								 | 
							
								    swapd 3append ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: watch ( word -- )
							 | 
						||
| 
								 | 
							
								    dup [ (watch) ] annotate ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: (watch-vars) ( quot word vars -- newquot )
							 | 
						||
| 
								 | 
							
								    [
							 | 
						||
| 
								 | 
							
								        "--- Entering: " write swap .
							 | 
						||
| 
								 | 
							
								        "--- Variable values:" print
							 | 
						||
| 
								 | 
							
								        [ dup get ] H{ } map>assoc describe
							 | 
						||
| 
								 | 
							
								    ] 2curry prepose ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: watch-vars ( word vars -- )
							 | 
						||
| 
								 | 
							
								    dupd [ (watch-vars) ] 2curry annotate ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								GENERIC# annotate-methods 1 ( word quot -- )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: generic annotate-methods
							 | 
						||
| 
								 | 
							
								    >r "methods" word-prop values r> [ annotate ] curry each ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: word annotate-methods
							 | 
						||
| 
								 | 
							
								    annotate ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: breakpoint ( word -- )
							 | 
						||
| 
								 | 
							
								    [ add-breakpoint ] annotate-methods ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: breakpoint-if ( word quot -- )
							 | 
						||
| 
								 | 
							
								    [ [ [ break ] when ] rot 3append ] curry annotate-methods ;
							 |