declare effect on inputs to infer-if in non-literal case, so we get a better error than "unbalanced drop call/nip call"

Joe Groff 2010-03-07 21:37:24 -08:00
parent ce0e5d030c
commit 51de9cbb4a
4 changed files with 36 additions and 27 deletions

View File

@ -3,7 +3,7 @@
USING: fry arrays generic io io.streams.string kernel math namespaces USING: fry arrays generic io io.streams.string kernel math namespaces
parser sequences strings vectors words quotations effects classes parser sequences strings vectors words quotations effects classes
continuations assocs combinators compiler.errors accessors math.order continuations assocs combinators compiler.errors accessors math.order
definitions sets hints macros stack-checker.state definitions locals sets hints macros stack-checker.state
stack-checker.visitor stack-checker.errors stack-checker.values stack-checker.visitor stack-checker.errors stack-checker.values
stack-checker.recursive-state stack-checker.dependencies summary ; stack-checker.recursive-state stack-checker.dependencies summary ;
FROM: sequences.private => from-end ; FROM: sequences.private => from-end ;
@ -170,3 +170,27 @@ M: bad-call summary
: (infer) ( quot -- effect ) : (infer) ( quot -- effect )
[ infer-quot-here ] with-infer drop ; [ infer-quot-here ] with-infer drop ;
: ?quotation-effect ( in -- effect/f )
dup pair? [ second dup effect? [ drop f ] unless ] [ drop f ] if ;
:: declare-effect-d ( word effect variables branches n -- )
meta-d length :> d-length
n d-length < [
d-length 1 - n - :> n'
n' meta-d nth :> value
value known :> known
known word effect variables branches <declared-effect> :> known'
known' value set-known
known' branches push
] [ word unknown-macro-input ] if ;
:: declare-input-effects ( word -- )
H{ } clone :> variables
V{ } clone :> branches
word stack-effect in>> <reversed> [| in n |
in ?quotation-effect [| effect |
word effect variables branches n declare-effect-d
] when*
] each-index ;

View File

@ -1,7 +1,7 @@
! Copyright (C) 2008 Slava Pestov. ! Copyright (C) 2008 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: fry vectors sequences assocs math math.order accessors kernel USING: fry vectors sequences assocs math math.order accessors kernel
combinators quotations namespaces grouping stack-checker.state combinators quotations namespaces grouping locals stack-checker.state
stack-checker.backend stack-checker.errors stack-checker.visitor stack-checker.backend stack-checker.errors stack-checker.visitor
stack-checker.values stack-checker.recursive-state ; stack-checker.values stack-checker.recursive-state ;
IN: stack-checker.branches IN: stack-checker.branches
@ -119,11 +119,19 @@ M: curried curried/composed? drop t ;
M: composed curried/composed? drop t ; M: composed curried/composed? drop t ;
M: declared-effect curried/composed? known>> curried/composed? ; M: declared-effect curried/composed? known>> curried/composed? ;
:: declare-if-effects ( -- )
H{ } clone :> variables
V{ } clone :> branches
\ if (( ..a -- ..b )) variables branches 0 declare-effect-d
\ if (( ..a -- ..b )) variables branches 1 declare-effect-d ;
: infer-if ( -- ) : infer-if ( -- )
2 literals-available? [ 2 literals-available? [
(infer-if) (infer-if)
] [ ] [
drop 2 consume-d drop 2 ensure-d
declare-if-effects
2 shorten-d
dup [ known curried/composed? ] any? [ dup [ known curried/composed? ] any? [
output-d output-d
[ rot [ drop call ] [ nip call ] if ] [ rot [ drop call ] [ nip call ] if ]

View File

@ -10,29 +10,6 @@ stack-checker.values
stack-checker.visitor ; stack-checker.visitor ;
IN: stack-checker.row-polymorphism IN: stack-checker.row-polymorphism
: ?quotation-effect ( in -- effect/f )
dup pair? [ second dup effect? [ drop f ] unless ] [ drop f ] if ;
:: declare-effect-d ( word effect variables branches n -- )
meta-d length :> d-length
n d-length < [
d-length 1 - n - :> n'
n' meta-d nth :> value
value known :> known
known word effect variables branches <declared-effect> :> known'
known' value set-known
known' branches push
] [ word unknown-macro-input ] if ;
:: declare-input-effects ( word -- )
H{ } clone :> variables
V{ } clone :> branches
word stack-effect in>> <reversed> [| in n |
in ?quotation-effect [| effect |
word effect variables branches n declare-effect-d
] when*
] each-index ;
:: with-effect-here ( quot -- effect ) :: with-effect-here ( quot -- effect )
inner-d-index get :> old-inner-d-index inner-d-index get :> old-inner-d-index
input-count get :> old-input-count input-count get :> old-input-count

View File

@ -448,6 +448,6 @@ FROM: splitting.private => split, ;
[ [ [ ] [ drop ] if* ] infer ] [ invalid-quotation-input? ] must-fail-with [ [ [ ] [ drop ] if* ] infer ] [ invalid-quotation-input? ] must-fail-with
[ [ [ ] [ 2dup ] if* ] infer ] [ invalid-quotation-input? ] must-fail-with [ [ [ ] [ 2dup ] if* ] infer ] [ invalid-quotation-input? ] must-fail-with
! edge cases in polymorphic checking ! M\ declared-effect infer-call* didn't properly unify branches
{ 1 0 } [ [ 1 [ drop ] [ drop ] if ] each ] must-infer-as { 1 0 } [ [ 1 [ drop ] [ drop ] if ] each ] must-infer-as