factor/basis/stack-checker/state/state.factor

55 lines
1.3 KiB
Factor

! Copyright (C) 2008 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: assocs arrays namespaces sequences kernel definitions
math effects accessors words fry classes.algebra
compiler.units ;
IN: stack-checker.state
! Did the current control-flow path throw an error?
SYMBOL: terminated?
! Number of inputs current word expects from the stack
SYMBOL: d-in
! Compile-time data stack
SYMBOL: meta-d
! Compile-time retain stack
SYMBOL: meta-r
: current-stack-height ( -- n ) meta-d get length d-in get - ;
: current-effect ( -- effect )
d-in get
meta-d get length <effect>
terminated? get >>terminated? ;
: init-inference ( -- )
terminated? off
V{ } clone meta-d set
V{ } clone meta-r set
0 d-in set ;
! Words that the current quotation depends on
SYMBOL: dependencies
: depends-on ( word how -- )
over primitive? [ 2drop ] [
dependencies get dup [
swap '[ _ strongest-dependency ] change-at
] [ 3drop ] if
] if ;
! Generic words that the current quotation depends on
SYMBOL: generic-dependencies
: ?class-or ( class/f class -- class' )
swap [ class-or ] when* ;
: depends-on-generic ( generic class -- )
generic-dependencies get dup
[ swap '[ _ ?class-or ] change-at ] [ 3drop ] if ;
! Words we've inferred the stack effect of, for rollback
SYMBOL: recorded