1 USING: accessors arrays assocs compiler.cfg.instructions
2 compiler.cfg.linearization compiler.cfg.stacks.map fry kernel math sequences ;
3 IN: compiler.cfg.stacks.vacant
6 : write-slots ( tuple values slots -- )
7 [ execute( x y -- z ) ] 2each drop ;
9 : vacant>bits ( vacant -- bits )
11 dup supremum 1 + 1 <array>
12 [ '[ _ 0 -rot set-nth ] each ] keep
15 : stack>overinitialized ( stack -- seq )
16 second [ 0 < ] filter ;
18 : overinitialized>bits ( overinitialized -- bits )
19 [ neg 1 - ] map vacant>bits ;
21 : stack>scrub-and-check ( stack -- pair )
22 [ stack>vacant vacant>bits ]
23 [ stack>overinitialized overinitialized>bits ] bi 2array ;
25 ! Operations on the analysis state
26 : state>gc-data ( state -- gc-data )
27 [ stack>scrub-and-check ] map ;
29 : set-gc-map ( state gc-map -- )
30 swap state>gc-data concat
31 { >>scrub-d >>check-d >>scrub-r >>check-r } write-slots ;
33 : fill-gc-maps ( cfg -- )
34 [ trace-stack-state ] [ cfg>insns [ gc-map-insn? ] filter ] bi
35 [ [ insn#>> of ] [ gc-map>> ] bi set-gc-map ] with each ;