1 ! Copyright (C) 2008, 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors assocs combinators disjoint-sets fry kernel
4 namespaces sequences stack-checker.values ;
5 IN: compiler.tree.escape-analysis.allocations
9 : value-class ( value -- class ) value-classes get at ;
11 : set-value-class ( class value -- ) value-classes get set-at ;
15 : (allocation) ( -- allocations )
16 allocations get ; inline
18 : allocation ( value -- allocation )
21 : record-allocation ( allocation value -- )
24 : record-allocations ( allocations values -- )
25 (allocation) '[ _ set-at ] 2each ;
29 TUPLE: slot-access slot# value ;
31 C: <slot-access> slot-access
33 : record-slot-access ( out slot# in -- )
34 <slot-access> swap slot-accesses get set-at ;
36 SYMBOL: escaping-values
40 : <escaping-values> ( -- disjoint-set )
41 <disjoint-set> +escaping+ over add-atom ;
43 : init-escaping-values ( -- )
44 <escaping-values> escaping-values set ;
46 : (introduce-value) ( values escaping-values -- )
47 2dup disjoint-set-member?
48 [ 2drop ] [ add-atom ] if ; inline
50 : introduce-value ( values -- )
51 escaping-values get (introduce-value) ;
53 : introduce-values ( values -- )
54 escaping-values get '[ _ (introduce-value) ] each ;
56 : <slot-value> ( -- value )
57 <value> dup introduce-value ;
59 : merge-values ( in-values out-value -- )
60 escaping-values get equate-all-with ;
62 : merge-slots ( values -- value )
63 <slot-value> [ merge-values ] keep ;
65 : equate-values ( value1 value2 -- )
66 escaping-values get equate ;
68 : add-escaping-value ( value -- )
71 { [ dup not ] [ drop ] }
72 { [ dup t eq? ] [ drop ] }
73 [ [ add-escaping-value ] each ]
76 [ +escaping+ equate-values ] bi ;
78 : add-escaping-values ( values -- )
79 [ add-escaping-value ] each ;
81 : unknown-allocation ( value -- )
82 [ add-escaping-value ]
83 [ t swap record-allocation ]
86 : unknown-allocations ( values -- )
87 [ unknown-allocation ] each ;
89 : (escaping-value?) ( value escaping-values -- ? )
90 +escaping+ swap equiv? ; inline
92 : escaping-value? ( value -- ? )
93 escaping-values get (escaping-value?) ;
97 : copy-allocation ( allocation -- allocation' )
100 { [ dup t eq? ] [ ] }
101 [ [ <value> [ introduce-value ] [ copy-value ] [ ] tri ] map ]
104 : copy-value ( from to -- )
106 [ [ allocation copy-allocation ] dip record-allocation ]
109 : copy-values ( from to -- )
110 [ copy-value ] 2each ;
112 : copy-slot-value ( out slot# in -- )
114 { [ dup not ] [ 3drop ] }
115 { [ dup t eq? ] [ 3drop ] }
116 [ nth swap copy-value ]
119 SYMBOL: escaping-allocations
121 : compute-escaping-allocations ( -- )
122 allocations get escaping-values get
123 '[ drop _ (escaping-value?) ] assoc-filter
124 escaping-allocations set ;
126 : escaping-allocation? ( value -- ? )
127 escaping-allocations get key? ;
129 : unboxed-allocation ( value -- allocation/f )
130 dup escaping-allocation? [ drop f ] [ allocation ] if ;
132 : unboxed-slot-access? ( value -- ? )
133 slot-accesses get at*
134 [ value>> unboxed-allocation >boolean ] when ;