| 
									
										
										
										
											2010-03-04 22:30:08 -05:00
										 |  |  | ! (c)2010 Joe Groff bsd license | 
					
						
							|  |  |  | USING: accessors arrays assocs combinators combinators.short-circuit | 
					
						
							| 
									
										
										
										
											2010-03-07 19:45:33 -05:00
										 |  |  | continuations effects fry kernel locals math math.order 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 | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-11 03:53:40 -05:00
										 |  |  | : with-inner-d ( quot -- inner-d )
 | 
					
						
							|  |  |  |     inner-d-index get
 | 
					
						
							|  |  |  |     [ meta-d length inner-d-index set call ] dip
 | 
					
						
							|  |  |  |     inner-d-index get [ min inner-d-index set ] keep ; inline
 | 
					
						
							| 
									
										
										
										
											2010-03-08 22:32:25 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-11 03:53:40 -05:00
										 |  |  | :: (effect-here) ( inner-d old-meta-d-length old-input-count -- effect )
 | 
					
						
							|  |  |  |     old-meta-d-length inner-d - input-count get old-input-count - +
 | 
					
						
							| 
									
										
										
										
											2010-06-22 22:29:24 -04:00
										 |  |  |     terminated? get [ [ 0 ] [ meta-d length inner-d - ] if [ "x" <array> ] bi@ ] keep
 | 
					
						
							|  |  |  |     <terminated-effect> ; inline
 | 
					
						
							| 
									
										
										
										
											2010-03-07 19:45:33 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-11 03:53:40 -05:00
										 |  |  | : with-effect-here ( quot -- effect )
 | 
					
						
							|  |  |  |     meta-d length input-count get
 | 
					
						
							|  |  |  |     [ with-inner-d ] 2dip (effect-here) ; inline
 | 
					
						
							| 
									
										
										
										
											2010-03-07 19:45:33 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-11 17:09:18 -05:00
										 |  |  | : (diff-variable) ( diff variable vars -- diff' )
 | 
					
						
							| 
									
										
										
										
											2010-04-13 08:24:49 -04:00
										 |  |  |     [ key? ] [ '[ _ _ at - ] ] [ '[ _ _ set-at 0 ] ] 2tri if ;
 | 
					
						
							| 
									
										
										
										
											2010-03-11 17:09:18 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : (check-variable) ( actual-count declared-count variable vars -- diff ? )
 | 
					
						
							|  |  |  |     [ - ] 2dip dupd '[ _ _ (diff-variable) t ] [ dup 0 <= ] if ;
 | 
					
						
							| 
									
										
										
										
											2010-03-07 20:51:41 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : adjust-variable ( diff var vars -- )
 | 
					
						
							| 
									
										
										
										
											2010-03-11 17:09:18 -05:00
										 |  |  |     pick 0 >= [ at+ ] [ 3drop ] if ; inline
 | 
					
						
							| 
									
										
										
										
											2010-03-07 20:51:41 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-11 03:53:40 -05:00
										 |  |  | :: check-variable ( vars declared actual slot var-slot -- diff ok? var )
 | 
					
						
							|  |  |  |     actual declared [ slot call length ] bi@ declared var-slot call
 | 
					
						
							|  |  |  |     [ vars (check-variable) ] keep ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :: unify-variables ( in-diff in-ok? in-var out-diff out-ok? out-var vars -- ? )
 | 
					
						
							| 
									
										
										
										
											2010-03-11 17:09:18 -05:00
										 |  |  |     { [ in-ok? ] [ out-ok? ] [ in-diff out-diff = ] } 0&& dup [ | 
					
						
							| 
									
										
										
										
											2010-03-11 03:53:40 -05:00
										 |  |  |         in-var  [ in-diff  swap vars adjust-variable ] when*
 | 
					
						
							|  |  |  |         out-var [ out-diff swap vars adjust-variable ] when*
 | 
					
						
							|  |  |  |     ] when ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-09 21:08:27 -04:00
										 |  |  | ! 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* ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-11 17:09:18 -05:00
										 |  |  | : (check-variables) ( vars declared actual -- ? )
 | 
					
						
							| 
									
										
										
										
											2011-09-09 21:08:27 -04:00
										 |  |  |     balance-actual | 
					
						
							| 
									
										
										
										
											2010-03-11 17:09:18 -05:00
										 |  |  |     [ [ in>>  ] [ in-var>>  ] check-variable ] | 
					
						
							|  |  |  |     [ [ out>> ] [ out-var>> ] check-variable ] | 
					
						
							|  |  |  |     [ 2drop ] 3tri unify-variables ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-11 03:53:40 -05:00
										 |  |  | : check-variables ( vars declared actual -- ? )
 | 
					
						
							| 
									
										
										
										
											2010-03-11 17:09:18 -05:00
										 |  |  |     dup terminated?>> [ 3drop t ] [ (check-variables) ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : combinator-branches-effects ( branches -- quots declareds actuals )
 | 
					
						
							|  |  |  |     [ [ known>callable ] { } map-as ] | 
					
						
							|  |  |  |     [ [ effect>> ] { } map-as ] | 
					
						
							|  |  |  |     [ [ actual>> ] { } map-as ] tri ;
 | 
					
						
							| 
									
										
										
										
											2010-03-07 20:51:41 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-11 03:53:40 -05:00
										 |  |  | : combinator-unbalanced-branches-error ( known -- * )
 | 
					
						
							| 
									
										
										
										
											2010-03-11 17:09:18 -05:00
										 |  |  |     [ word>> ] [ branches>> <reversed> combinator-branches-effects ] bi
 | 
					
						
							|  |  |  |     unbalanced-branches-error ;
 | 
					
						
							| 
									
										
										
										
											2010-03-07 21:27:55 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-07 19:45:33 -05:00
										 |  |  | : check-declared-effect ( known effect -- )
 | 
					
						
							| 
									
										
										
										
											2010-03-07 21:40:58 -05:00
										 |  |  |     [ >>actual ] keep
 | 
					
						
							| 
									
										
										
										
											2010-03-07 20:51:41 -05:00
										 |  |  |     2dup [ [ variables>> ] [ effect>> ] bi ] dip check-variables | 
					
						
							| 
									
										
										
										
											2010-03-11 03:53:40 -05:00
										 |  |  |     [ 2drop ] [ drop combinator-unbalanced-branches-error ] if ;
 |