2010-03-04 22:30:08 -05:00
|
|
|
! (c)2010 Joe Groff bsd license
|
|
|
|
USING: accessors arrays assocs combinators combinators.short-circuit
|
|
|
|
continuations effects fry kernel locals math namespaces
|
2010-03-05 17:27:36 -05:00
|
|
|
quotations sequences splitting
|
2010-03-04 22:30:08 -05:00
|
|
|
stack-checker.backend
|
|
|
|
stack-checker.errors
|
|
|
|
stack-checker.known-words
|
2010-03-05 18:12:03 -05:00
|
|
|
stack-checker.state
|
|
|
|
stack-checker.values
|
|
|
|
stack-checker.visitor ;
|
2010-03-04 22:30:08 -05:00
|
|
|
IN: stack-checker.row-polymorphism
|
|
|
|
|
|
|
|
<PRIVATE
|
2010-03-05 18:12:03 -05:00
|
|
|
SYMBOLS: current-effect-variables current-word-effect current-meta-d ;
|
2010-03-04 22:30:08 -05:00
|
|
|
|
|
|
|
: quotation-effect? ( in -- ? )
|
|
|
|
dup pair? [ second effect? ] [ drop f ] if ;
|
|
|
|
|
2010-03-05 00:51:49 -05:00
|
|
|
SYMBOL: (unknown)
|
|
|
|
|
|
|
|
GENERIC: >error-quot ( known -- quot )
|
|
|
|
|
|
|
|
M: object >error-quot drop (unknown) ;
|
|
|
|
M: literal >error-quot value>> ;
|
|
|
|
M: composed >error-quot
|
|
|
|
[ quot1>> known >error-quot ] [ quot2>> known >error-quot ] bi
|
|
|
|
\ compose [ ] 3sequence ;
|
|
|
|
M: curried >error-quot
|
|
|
|
[ obj>> known >error-quot ] [ quot>> known >error-quot ] bi
|
|
|
|
\ curry [ ] 3sequence ;
|
|
|
|
|
|
|
|
: >error-branches-and-quots ( branch/values -- branches quots )
|
|
|
|
[ [ second ] [ known >error-quot ] bi* ] assoc-map unzip ;
|
|
|
|
|
|
|
|
: abandon-check ( -- * )
|
|
|
|
current-word get
|
2010-03-05 18:12:03 -05:00
|
|
|
current-word-effect get in>> current-meta-d get zip
|
2010-03-05 00:51:49 -05:00
|
|
|
[ first quotation-effect? ] filter
|
|
|
|
>error-branches-and-quots
|
|
|
|
invalid-quotation-input ;
|
2010-03-04 22:30:08 -05:00
|
|
|
|
|
|
|
:: check-variable ( actual-count declared-count variable -- difference )
|
|
|
|
actual-count declared-count -
|
|
|
|
variable [
|
2010-03-05 00:51:49 -05:00
|
|
|
variable current-effect-variables get at* nip
|
|
|
|
[ variable current-effect-variables get at - ]
|
|
|
|
[ variable current-effect-variables get set-at 0 ] if
|
2010-03-04 22:30:08 -05:00
|
|
|
] [
|
|
|
|
dup [ abandon-check ] unless-zero
|
|
|
|
] if ;
|
|
|
|
|
|
|
|
: adjust-variable ( diff var -- )
|
|
|
|
over 0 >=
|
2010-03-05 00:51:49 -05:00
|
|
|
[ current-effect-variables get at+ ]
|
2010-03-04 22:30:08 -05:00
|
|
|
[ 2drop ] if ; inline
|
|
|
|
|
|
|
|
:: (check-input) ( declared actual -- )
|
2010-03-06 00:51:38 -05:00
|
|
|
actual terminated?>> [
|
|
|
|
actual declared [ in>> length ] bi@ declared in-var>>
|
|
|
|
[ check-variable ] keep :> ( in-diff in-var )
|
|
|
|
actual declared [ out>> length ] bi@ declared out-var>>
|
|
|
|
[ check-variable ] keep :> ( out-diff out-var )
|
|
|
|
{ [ in-var not ] [ out-var not ] [ in-diff out-diff = ] } 0||
|
|
|
|
[
|
|
|
|
in-var [ in-diff swap adjust-variable ] when*
|
|
|
|
out-var [ out-diff swap adjust-variable ] when*
|
|
|
|
] [
|
|
|
|
abandon-check
|
|
|
|
] if
|
|
|
|
] unless ;
|
2010-03-04 22:30:08 -05:00
|
|
|
|
2010-03-05 18:12:03 -05:00
|
|
|
: infer-value ( value -- effect )
|
|
|
|
dup known [ nest-visitor init-inference infer-call* current-effect ] with-scope ; inline
|
2010-03-04 22:30:08 -05:00
|
|
|
|
|
|
|
: check-input ( in value -- )
|
|
|
|
over quotation-effect? [
|
2010-03-05 18:12:03 -05:00
|
|
|
[ second ] dip infer-value (check-input)
|
2010-03-04 22:30:08 -05:00
|
|
|
] [ 2drop ] if ;
|
|
|
|
|
2010-03-04 23:15:26 -05:00
|
|
|
: normalize-variables ( -- variables' )
|
2010-03-05 00:51:49 -05:00
|
|
|
current-effect-variables get dup values [
|
2010-03-04 22:30:08 -05:00
|
|
|
infimum dup 0 <
|
|
|
|
[ '[ _ - ] assoc-map ] [ drop ] if
|
|
|
|
] unless-empty ;
|
|
|
|
|
|
|
|
PRIVATE>
|
|
|
|
|
|
|
|
: infer-polymorphic-vars ( effect -- variables )
|
2010-03-05 00:51:49 -05:00
|
|
|
H{ } clone current-effect-variables set
|
2010-03-05 18:12:03 -05:00
|
|
|
dup current-word-effect set
|
2010-03-05 00:51:49 -05:00
|
|
|
in>> dup length ensure-d dup current-meta-d set
|
|
|
|
[ check-input ] 2each
|
2010-03-04 23:15:26 -05:00
|
|
|
normalize-variables ;
|
2010-03-04 22:30:08 -05:00
|
|
|
|
|
|
|
: check-polymorphic-effect ( word -- )
|
2010-03-04 23:15:26 -05:00
|
|
|
current-word get [
|
2010-03-06 00:51:38 -05:00
|
|
|
dup current-word set
|
|
|
|
stack-effect dup { [ in-var>> ] [ out-var>> ] } 1||
|
2010-03-05 18:12:03 -05:00
|
|
|
[ infer-polymorphic-vars ] when drop
|
2010-03-04 23:15:26 -05:00
|
|
|
] dip current-word set ;
|
2010-03-04 22:30:08 -05:00
|
|
|
|
|
|
|
SYMBOL: infer-polymorphic?
|
2010-03-06 00:51:38 -05:00
|
|
|
infer-polymorphic? [ t ] initialize
|