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 ! The id is a globally unique id used for fast hashcode* and
7 ! equal? on basic blocks. The number is assigned by
9 TUPLE: basic-block < identity-tuple
19 : <basic-block> ( -- basic-block )
21 next-block-id counter >>id
22 V{ } clone >>instructions
23 V{ } clone >>successors
24 V{ } clone >>predecessors ;
26 M: basic-block hashcode* id>> nip ;
29 SYMBOL: visited-blocks
31 : visit-block ( basic-block quot -- )
32 over visited-blocks get 2dup key?
33 [ 2drop 2drop ] [ conjoin call ] if ; inline
35 : (each-block) ( basic-block quot -- )
39 [ [ successors>> ] dip '[ , (each-block) ] each ]
41 ] visit-block ; inline
43 : each-block ( basic-block quot -- )
44 H{ } clone visited-blocks [ (each-block) ] with-variable ; inline
46 : copy-at ( from to assoc -- )
47 3dup nip at* [ -rot set-at drop ] [ 2drop 2drop ] if ; inline