]> gitweb.factorcode.org Git - factor.git/blob - basis/compiler/cfg/stack-frame/stack-frame.factor
Merge branch 'master' of git://factorcode.org/git/factor
[factor.git] / basis / compiler / cfg / stack-frame / stack-frame.factor
1 ! Copyright (C) 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: math math.order namespaces accessors kernel layouts combinators
4 combinators.smart assocs sequences cpu.architecture ;
5 IN: compiler.cfg.stack-frame
6
7 TUPLE: stack-frame
8 { params integer }
9 { return integer }
10 { total-size integer }
11 { gc-root-size integer }
12 { spill-area-size integer }
13 { calls-vm? boolean } ;
14
15 ! Stack frame utilities
16 : param-base ( -- n )
17     stack-frame get [ params>> ] [ return>> ] bi + ;
18
19 : spill-offset ( n -- offset )
20     param-base + ;
21
22 : gc-root-base ( -- n )
23     stack-frame get spill-area-size>> param-base + ;
24
25 : gc-root-offset ( n -- n' ) gc-root-base + ;
26
27 : (stack-frame-size) ( stack-frame -- n )
28     [
29         {
30             [ params>> ]
31             [ return>> ]
32             [ gc-root-size>> ]
33             [ spill-area-size>> ]
34         } cleave
35     ] sum-outputs ;
36
37 : max-stack-frame ( frame1 frame2 -- frame3 )
38     [ stack-frame new ] 2dip
39     {
40         [ [ params>> ] bi@ max >>params ]
41         [ [ return>> ] bi@ max >>return ]
42         [ [ gc-root-size>> ] bi@ max >>gc-root-size ]
43         [ [ calls-vm?>> ] bi@ or >>calls-vm? ]
44     } 2cleave ;