add stack variable unification to M\ declared-effect infer-call*

db4
Joe Groff 2010-03-07 17:51:41 -08:00
parent bbbda64ee7
commit b14d59030f
3 changed files with 33 additions and 11 deletions

View File

@ -34,9 +34,5 @@ ERROR: transform-expansion-error < inference-error error continuation word ;
ERROR: bad-declaration-error < inference-error declaration ; ERROR: bad-declaration-error < inference-error declaration ;
ERROR: invalid-quotation-input < inference-error word branches quots ; ERROR: invalid-quotation-input < inference-error word quot variables expected actual ;
ERROR: invalid-effect-variable < inference-error effect ;
ERROR: effect-variable-can't-have-type < inference-error effect ;

View File

@ -68,8 +68,3 @@ M: do-not-compile summary
M: invalid-quotation-input summary M: invalid-quotation-input summary
word>> name>> word>> name>>
"The input quotations to " " don't match their expected effects" surround ; "The input quotations to " " don't match their expected effects" surround ;
M: invalid-quotation-input error.
dup summary print
[ quots>> ] [ branches>> ] bi quots-and-branches. ;

View File

@ -53,5 +53,36 @@ IN: stack-checker.row-polymorphism
in "x" <array> out "x" <array> terminated? get <terminated-effect> ; inline in "x" <array> out "x" <array> terminated? get <terminated-effect> ; inline
:: check-variable ( actual-count declared-count variable vars -- difference )
actual-count declared-count -
variable [
variable vars at* nip
[ variable vars at - ]
[ variable vars set-at 0 ] if
] [ drop 0 ] if ;
: adjust-variable ( diff var vars -- )
pick 0 >=
[ at+ ]
[ 3drop ] if ; inline
:: check-variables ( vars declared actual -- ? )
actual terminated?>> [ t ] [
actual declared [ in>> length ] bi@ declared in-var>>
[ vars check-variable ] keep :> ( in-diff in-var )
actual declared [ out>> length ] bi@ declared out-var>>
[ vars check-variable ] keep :> ( out-diff out-var )
{ [ in-var not ] [ out-var not ] [ in-diff out-diff = ] } 0||
dup [
in-var [ in-diff swap vars adjust-variable ] when*
out-var [ out-diff swap vars adjust-variable ] when*
] when
] if ;
: check-declared-effect ( known effect -- ) : check-declared-effect ( known effect -- )
[ known>callable P. ] [ P. ] bi* ; 2dup [ [ variables>> ] [ effect>> ] bi ] dip check-variables
[ 2drop ] [
[ { [ word>> ] [ known>callable ] [ variables>> ] [ effect>> ] } cleave ]
dip invalid-quotation-input
] if ;