1 ! Copyright (C) 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel accessors namespaces assocs sequences sets fry ;
6 TUPLE: procedure entry word label ;
8 C: <procedure> procedure
10 ! - "id" is a globally unique id used for hashcode*.
11 ! - "number" is assigned by linearization.
12 TUPLE: basic-block < identity-tuple
22 : <basic-block> ( -- basic-block )
24 next-block-id counter >>id
25 V{ } clone >>instructions
26 V{ } clone >>successors
27 V{ } clone >>predecessors ;
29 M: basic-block hashcode* id>> nip ;
32 SYMBOL: visited-blocks
34 : visit-block ( basic-block quot -- )
35 over visited-blocks get 2dup key?
36 [ 2drop 2drop ] [ conjoin call ] if ; inline
38 : (each-block) ( basic-block quot -- )
42 [ [ successors>> ] dip '[ _ (each-block) ] each ]
44 ] visit-block ; inline
46 : each-block ( basic-block quot -- )
47 H{ } clone visited-blocks [ (each-block) ] with-variable ; inline