factor/library/tools/annotations.factor

47 lines
1.4 KiB
Factor

! Copyright (C) 2005 Slava Pestov.
! See http://factor.sf.net/license.txt for BSD license.
IN: words
USING: inspector io kernel lists math namespaces prettyprint
sequences strings walker ;
! The annotation words let you flag a word for either tracing
! or single-stepping. Note that currently, words referring to
! annotated words cannot be compiled.
: annotate ( word quot -- | quot: word def -- def )
over >r >r dup word-def r> call r> swap define-compound ;
inline
: watch-msg ( word prefix -- ) write word-name print .s flush ;
: (watch) ( word def -- def )
[
swap literalize
dup , "===> Entering: " , \ watch-msg ,
swap %
, "===> Leaving: " , \ watch-msg ,
] [ ] make ;
: watch ( word -- )
#! Cause a message to be printed out when the word is
#! executed.
[ (watch) ] annotate ;
: break ( word -- )
#! Cause the word to start the code walker when executed.
[ nip [ walk ] curry ] annotate ;
: break-on ( word test -- | test: -- ? )
#! Conditional breakpoint.
swap [
nip [ swap % dup [ walk ] curry , , \ if , ] [ ] make
] annotate ;
: with-profile ( quot word -- )
millis >r >r call r> millis r> - swap global [ +@ ] bind ;
inline
: profile ( word -- )
#! When the word is called, time it, and add the time to
#! the value in a global variable named by the word.
[ swap [ with-profile ] curry cons ] annotate ;