stack-checker.row-polymorphism: check stack effects correctly when a one-sided polymorphic declared effect is matched to a shallow subtype, for example, ( x -- ..a ) to ( -- ); fixes #88
parent
8f6c6e5691
commit
e293966618
|
@ -42,7 +42,34 @@ IN: stack-checker.row-polymorphism
|
||||||
out-var [ out-diff swap vars adjust-variable ] when*
|
out-var [ out-diff swap vars adjust-variable ] when*
|
||||||
] when ;
|
] when ;
|
||||||
|
|
||||||
|
! A bit of a hack. If the declared effect is one-sided monomorphic and the actual effect is a
|
||||||
|
! shallow subtype of the root effect, adjust it here
|
||||||
|
:: (balance-actual-depth) ( declared actual -- depth/f )
|
||||||
|
{
|
||||||
|
{ [ {
|
||||||
|
[ declared in-var>> ]
|
||||||
|
[ declared out-var>> not ]
|
||||||
|
[ actual out>> length declared out>> length < ]
|
||||||
|
} 0&& ] [ declared out>> length actual out>> length - ] }
|
||||||
|
{ [ {
|
||||||
|
[ declared in-var>> not ]
|
||||||
|
[ declared out-var>> ]
|
||||||
|
[ actual in>> length declared in>> length < ]
|
||||||
|
} 0&& ] [ declared in>> length actual in>> length - ] }
|
||||||
|
[ f ]
|
||||||
|
} cond ;
|
||||||
|
|
||||||
|
: (balance-by) ( effect n -- effect' )
|
||||||
|
"x" <array> swap
|
||||||
|
[ in>> append ]
|
||||||
|
[ out>> append ]
|
||||||
|
[ nip terminated?>> ] 2tri <terminated-effect> ;
|
||||||
|
|
||||||
|
: balance-actual ( declared actual -- declared actual' )
|
||||||
|
2dup (balance-actual-depth) [ (balance-by) ] when* ;
|
||||||
|
|
||||||
: (check-variables) ( vars declared actual -- ? )
|
: (check-variables) ( vars declared actual -- ? )
|
||||||
|
balance-actual
|
||||||
[ [ in>> ] [ in-var>> ] check-variable ]
|
[ [ in>> ] [ in-var>> ] check-variable ]
|
||||||
[ [ out>> ] [ out-var>> ] check-variable ]
|
[ [ out>> ] [ out-var>> ] check-variable ]
|
||||||
[ 2drop ] 3tri unify-variables ;
|
[ 2drop ] 3tri unify-variables ;
|
||||||
|
|
|
@ -501,3 +501,30 @@ USING: alien.c-types alien ;
|
||||||
void { } cdecl [ recursive-callback-2 drop ] alien-callback ; inline recursive
|
void { } cdecl [ recursive-callback-2 drop ] alien-callback ; inline recursive
|
||||||
|
|
||||||
[ recursive-callback-2 ] must-infer
|
[ recursive-callback-2 ] must-infer
|
||||||
|
|
||||||
|
! test one-sided row polymorphism
|
||||||
|
|
||||||
|
: poly-output ( x a: ( x -- ..a ) -- ..a ) call ; inline
|
||||||
|
|
||||||
|
[ [ ] poly-output ] must-infer
|
||||||
|
[ [ f f f ] poly-output ] must-infer
|
||||||
|
|
||||||
|
: poly-input ( ..a a: ( ..a -- x ) -- x ) call ; inline
|
||||||
|
|
||||||
|
[ [ ] poly-input ] must-infer
|
||||||
|
[ [ drop drop drop ] poly-input ] must-infer
|
||||||
|
|
||||||
|
: poly-output-input ( x a: ( x -- ..a ) b: ( ..a -- y ) -- y ) [ call ] bi@ ; inline
|
||||||
|
|
||||||
|
[ [ ] [ ] poly-output-input ] must-infer
|
||||||
|
[ [ f f f ] [ drop drop drop ] poly-output-input ] must-infer
|
||||||
|
[ [ [ f f ] [ drop drop drop ] poly-output-input ] infer ] [ unbalanced-branches-error? ] must-fail-with
|
||||||
|
[ [ [ f f f ] [ drop drop ] poly-output-input ] infer ] [ unbalanced-branches-error? ] must-fail-with
|
||||||
|
|
||||||
|
: poly-input-output ( ..a a: ( ..a -- x ) b: ( x -- ..b ) -- ..b ) [ call ] bi@ ; inline
|
||||||
|
|
||||||
|
[ [ ] [ ] poly-input-output ] must-infer
|
||||||
|
[ [ drop drop drop ] [ f f f ] poly-input-output ] must-infer
|
||||||
|
[ [ drop drop ] [ f f f ] poly-input-output ] must-infer
|
||||||
|
[ [ drop drop drop ] [ f f ] poly-input-output ] must-infer
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue