factor/basis/tools/annotations/annotations.factor

127 lines
2.7 KiB
Factor
Raw Normal View History

! Copyright (C) 2005, 2009 Slava Pestov.
2007-09-20 18:09:08 -04:00
! See http://factorcode.org/license.txt for BSD license.
USING: accessors kernel math sorting words parser io summary
quotations sequences prettyprint continuations effects
definitions compiler.units namespaces assocs tools.walker
tools.time generic inspector fry tools.continuations ;
2007-09-20 18:09:08 -04:00
IN: tools.annotations
2008-04-05 23:59:31 -04:00
GENERIC: reset ( word -- )
M: generic reset
[ call-next-method ]
[ subwords [ reset ] each ] bi ;
M: word reset
dup "unannotated-def" word-prop [
[
2008-02-07 18:07:43 -05:00
dup dup "unannotated-def" word-prop define
] with-compilation-unit
2008-02-07 18:07:43 -05:00
f "unannotated-def" set-word-prop
] [ drop ] if ;
ERROR: cannot-annotate-twice word ;
<PRIVATE
: check-annotate-twice ( word -- word )
dup "unannotated-def" word-prop [
cannot-annotate-twice
] when ;
: save-unannotated-def ( word -- )
dup def>> "unannotated-def" set-word-prop ;
: (annotate) ( word quot -- )
2009-03-17 03:19:50 -04:00
[ dup def>> ] dip call( old -- new ) define ;
PRIVATE>
2007-09-20 18:09:08 -04:00
: annotate ( word quot -- )
2009-04-06 03:59:59 -04:00
[ check-annotate-twice ] dip
2009-03-17 03:19:50 -04:00
[ over save-unannotated-def (annotate) ] with-compilation-unit ;
<PRIVATE
2007-09-20 18:09:08 -04:00
2008-02-07 18:07:43 -05:00
: word-inputs ( word -- seq )
stack-effect [
2008-11-29 01:37:37 -05:00
[ datastack ] dip in>> length tail*
] [
2008-02-07 18:07:43 -05:00
datastack
] if* ;
: entering ( str -- )
"/-- Entering: " write dup .
word-inputs stack.
"\\--" print flush ;
2007-09-20 18:09:08 -04:00
2008-11-29 01:37:37 -05:00
: word-outputs ( word -- seq )
stack-effect [
2008-11-29 01:37:37 -05:00
[ datastack ] dip out>> length tail*
] [
2008-11-29 01:37:37 -05:00
datastack
] if* ;
: leaving ( str -- )
"/-- Leaving: " write dup .
word-outputs stack.
"\\--" print flush ;
2007-09-20 18:09:08 -04:00
2008-11-29 01:37:37 -05:00
: (watch) ( word def -- def )
over '[ _ entering @ _ leaving ] ;
2007-09-20 18:09:08 -04:00
PRIVATE>
2007-09-20 18:09:08 -04:00
: watch ( word -- )
dup '[ [ _ ] dip (watch) ] annotate ;
<PRIVATE
2007-09-20 18:09:08 -04:00
2008-11-29 01:37:37 -05:00
: (watch-vars) ( word vars quot -- newquot )
'[
2008-11-29 01:37:37 -05:00
"--- Entering: " write _ .
"--- Variable values:" print _ [ dup get ] H{ } map>assoc describe
@
] ;
2008-02-10 02:38:51 -05:00
2009-03-06 15:58:52 -05:00
PRIVATE>
2008-02-10 02:38:51 -05:00
: watch-vars ( word vars -- )
2008-11-29 01:37:37 -05:00
dupd '[ [ _ _ ] dip (watch-vars) ] annotate ;
2008-02-10 02:38:51 -05:00
2008-04-05 23:59:31 -04:00
GENERIC# annotate-methods 1 ( word quot -- )
M: generic annotate-methods
2008-11-29 01:37:37 -05:00
[ "methods" word-prop values ] dip [ annotate ] curry each ;
2008-04-05 23:59:31 -04:00
M: word annotate-methods
annotate ;
2007-09-20 18:09:08 -04:00
: breakpoint ( word -- )
2008-04-05 23:59:31 -04:00
[ add-breakpoint ] annotate-methods ;
2007-09-20 18:09:08 -04:00
: breakpoint-if ( word quot -- )
2008-11-29 01:37:37 -05:00
'[ [ _ [ [ break ] when ] ] dip 3append ] annotate-methods ;
SYMBOL: word-timing
word-timing [ H{ } clone ] initialize
: reset-word-timing ( -- )
word-timing get clear-assoc ;
<PRIVATE
: (add-timing) ( def word -- def' )
'[ _ benchmark _ word-timing get at+ ] ;
PRIVATE>
: add-timing ( word -- )
dup '[ _ (add-timing) ] annotate ;
: word-timing. ( -- )
word-timing get
>alist [ 1000000 /f ] assoc-map sort-values
simple-table. ;