2009-03-06 14:32:07 -05:00
|
|
|
! Copyright (C) 2005, 2009 Slava Pestov.
|
2007-09-20 18:09:08 -04:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2008-12-06 01:20:49 -05:00
|
|
|
USING: accessors kernel math sorting words parser io summary
|
|
|
|
quotations sequences prettyprint continuations effects
|
|
|
|
definitions compiler.units namespaces assocs tools.walker
|
2009-04-16 18:03:03 -04:00
|
|
|
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
|
2008-01-05 21:07:13 -05:00
|
|
|
dup "unannotated-def" word-prop [
|
|
|
|
[
|
2008-02-07 18:07:43 -05:00
|
|
|
dup dup "unannotated-def" word-prop define
|
2008-01-05 21:07:13 -05:00
|
|
|
] with-compilation-unit
|
2008-02-07 18:07:43 -05:00
|
|
|
f "unannotated-def" set-word-prop
|
2008-01-05 21:07:13 -05:00
|
|
|
] [ drop ] if ;
|
2007-12-21 21:18:24 -05:00
|
|
|
|
2008-12-06 01:20:49 -05:00
|
|
|
ERROR: cannot-annotate-twice word ;
|
|
|
|
|
2009-03-06 14:32:07 -05:00
|
|
|
<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 ;
|
2009-03-06 14:32:07 -05:00
|
|
|
|
|
|
|
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 ;
|
2009-03-06 14:32:07 -05:00
|
|
|
|
|
|
|
<PRIVATE
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-05-13 18:03:41 -04:00
|
|
|
: stack-values ( names -- alist )
|
|
|
|
[ datastack ] dip [ nip ] [ length tail* ] 2bi zip ;
|
|
|
|
|
|
|
|
: trace-message ( word quot str -- )
|
|
|
|
"--- " write write bl over .
|
|
|
|
[ stack-effect ] dip '[ @ stack-values ] [ f ] if*
|
|
|
|
[ simple-table. ] unless-empty flush ; inline
|
|
|
|
|
|
|
|
: entering ( str -- ) [ in>> ] "Entering" trace-message ;
|
|
|
|
|
|
|
|
: leaving ( str -- ) [ out>> ] "Leaving" trace-message ;
|
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
|
|
|
|
2009-03-06 14:32:07 -05:00
|
|
|
PRIVATE>
|
|
|
|
|
2007-09-20 18:09:08 -04:00
|
|
|
: watch ( word -- )
|
2009-03-06 14:32:07 -05:00
|
|
|
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-09-13 12:12:36 -04:00
|
|
|
'[
|
2008-11-29 01:37:37 -05:00
|
|
|
"--- Entering: " write _ .
|
2008-09-13 12:12:36 -04:00
|
|
|
"--- 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
|
|
|
|
2007-12-28 21:46:06 -05:00
|
|
|
: breakpoint-if ( word quot -- )
|
2008-11-29 01:37:37 -05:00
|
|
|
'[ [ _ [ [ break ] when ] ] dip 3append ] annotate-methods ;
|
2008-12-06 01:20:49 -05:00
|
|
|
|
|
|
|
SYMBOL: word-timing
|
|
|
|
|
2009-02-10 17:16:12 -05:00
|
|
|
word-timing [ H{ } clone ] initialize
|
2008-12-06 01:20:49 -05:00
|
|
|
|
|
|
|
: reset-word-timing ( -- )
|
|
|
|
word-timing get clear-assoc ;
|
|
|
|
|
2009-03-06 14:32:07 -05:00
|
|
|
<PRIVATE
|
|
|
|
|
2008-12-06 01:20:49 -05:00
|
|
|
: (add-timing) ( def word -- def' )
|
|
|
|
'[ _ benchmark _ word-timing get at+ ] ;
|
|
|
|
|
2009-03-06 14:32:07 -05:00
|
|
|
PRIVATE>
|
|
|
|
|
2008-12-06 01:20:49 -05:00
|
|
|
: add-timing ( word -- )
|
|
|
|
dup '[ _ (add-timing) ] annotate ;
|
|
|
|
|
|
|
|
: word-timing. ( -- )
|
|
|
|
word-timing get
|
|
|
|
>alist [ 1000000 /f ] assoc-map sort-values
|
|
|
|
simple-table. ;
|