| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | ! Copyright (C) 2008 Slava Pestov. | 
					
						
							|  |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2008-08-22 18:38:23 -04:00
										 |  |  | USING: fry accessors quotations kernel sequences namespaces | 
					
						
							|  |  |  | assocs words arrays vectors hints combinators stack-checker | 
					
						
							| 
									
										
										
										
											2008-07-24 00:50:21 -04:00
										 |  |  | stack-checker.state stack-checker.visitor stack-checker.errors | 
					
						
							|  |  |  | stack-checker.backend compiler.tree ;
 | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | IN: compiler.tree.builder | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-27 21:25:42 -04:00
										 |  |  | : with-tree-builder ( quot -- nodes )
 | 
					
						
							|  |  |  |     [ V{ } clone stack-visitor set ] prepose
 | 
					
						
							|  |  |  |     with-infer ; inline
 | 
					
						
							| 
									
										
										
										
											2008-07-24 00:50:21 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-30 04:38:10 -04:00
										 |  |  | : build-tree ( quot -- nodes )
 | 
					
						
							|  |  |  |     #! Not safe to call from inference transforms. | 
					
						
							|  |  |  |     [ f infer-quot ] with-tree-builder nip ;
 | 
					
						
							| 
									
										
										
										
											2008-07-24 00:50:21 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-30 04:38:10 -04:00
										 |  |  | : build-tree-with ( in-stack quot -- nodes out-stack )
 | 
					
						
							| 
									
										
										
										
											2008-07-24 00:50:21 -04:00
										 |  |  |     #! Not safe to call from inference transforms. | 
					
						
							|  |  |  |     [ | 
					
						
							| 
									
										
										
										
											2008-07-30 04:38:10 -04:00
										 |  |  |         [ >vector meta-d set ] [ f infer-quot ] bi*
 | 
					
						
							|  |  |  |     ] with-tree-builder nip
 | 
					
						
							|  |  |  |     unclip-last in-d>> ;
 | 
					
						
							| 
									
										
										
										
											2008-07-24 00:50:21 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-10 23:22:26 -04:00
										 |  |  | : build-sub-tree ( #call quot -- nodes )
 | 
					
						
							| 
									
										
										
										
											2008-08-15 00:35:19 -04:00
										 |  |  |     [ [ out-d>> ] [ in-d>> ] bi ] dip build-tree-with | 
					
						
							|  |  |  |     over ends-with-terminate? | 
					
						
							|  |  |  |     [ drop swap [ f swap #push ] map append ] | 
					
						
							|  |  |  |     [ rot #copy suffix ] | 
					
						
							|  |  |  |     if ;
 | 
					
						
							| 
									
										
										
										
											2008-08-10 23:22:26 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-15 00:35:19 -04:00
										 |  |  | : (build-tree-from-word) ( word -- )
 | 
					
						
							|  |  |  |     dup
 | 
					
						
							|  |  |  |     [ "inline" word-prop ] | 
					
						
							|  |  |  |     [ "recursive" word-prop ] bi and [ | 
					
						
							|  |  |  |         1quotation f infer-quot | 
					
						
							|  |  |  |     ] [ | 
					
						
							|  |  |  |         [ specialized-def ] | 
					
						
							|  |  |  |         [ dup 2array 1array ] bi infer-quot | 
					
						
							|  |  |  |     ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : check-cannot-infer ( word -- )
 | 
					
						
							| 
									
										
										
										
											2008-08-22 23:07:59 -04:00
										 |  |  |     dup "cannot-infer" word-prop [ cannot-infer-effect ] [ drop ] if ;
 | 
					
						
							| 
									
										
										
										
											2008-08-15 00:35:19 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : check-no-compile ( word -- )
 | 
					
						
							|  |  |  |     dup "no-compile" word-prop [ cannot-infer-effect ] [ drop ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-27 21:25:42 -04:00
										 |  |  | : build-tree-from-word ( word -- effect nodes )
 | 
					
						
							| 
									
										
										
										
											2008-07-24 00:50:21 -04:00
										 |  |  |     [ | 
					
						
							|  |  |  |         [ | 
					
						
							| 
									
										
										
										
											2008-08-15 00:35:19 -04:00
										 |  |  |             { | 
					
						
							|  |  |  |                 [ check-cannot-infer ] | 
					
						
							|  |  |  |                 [ check-no-compile ] | 
					
						
							|  |  |  |                 [ (build-tree-from-word) ] | 
					
						
							|  |  |  |                 [ finish-word ] | 
					
						
							|  |  |  |             } cleave
 | 
					
						
							| 
									
										
										
										
											2008-07-24 00:50:21 -04:00
										 |  |  |         ] maybe-cannot-infer | 
					
						
							|  |  |  |     ] with-tree-builder ;
 |