61 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Factor
		
	
	
		
		
			
		
	
	
			61 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Factor
		
	
	
| 
								 | 
							
								! Copyright (C) 2006, 2007 Slava Pestov.
							 | 
						||
| 
								 | 
							
								! See http://factorcode.org/license.txt for BSD license.
							 | 
						||
| 
								 | 
							
								USING: arrays generic hashtables kernel kernel.private math
							 | 
						||
| 
								 | 
							
								namespaces sequences vectors words strings layouts combinators
							 | 
						||
| 
								 | 
							
								combinators.private classes optimizer.backend optimizer.def-use
							 | 
						||
| 
								 | 
							
								optimizer.known-words optimizer.math inference.class
							 | 
						||
| 
								 | 
							
								generic.standard ;
							 | 
						||
| 
								 | 
							
								IN: optimizer
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: optimize-1 ( node -- newnode ? )
							 | 
						||
| 
								 | 
							
								    [
							 | 
						||
| 
								 | 
							
								        H{ } clone class-substitutions set
							 | 
						||
| 
								 | 
							
								        H{ } clone literal-substitutions set
							 | 
						||
| 
								 | 
							
								        H{ } clone value-substitutions set
							 | 
						||
| 
								 | 
							
								        dup compute-def-use
							 | 
						||
| 
								 | 
							
								        dup kill-values
							 | 
						||
| 
								 | 
							
								        dup infer-classes
							 | 
						||
| 
								 | 
							
								        optimizer-changed off
							 | 
						||
| 
								 | 
							
								        optimize-nodes
							 | 
						||
| 
								 | 
							
								        optimizer-changed get
							 | 
						||
| 
								 | 
							
								    ] with-scope ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: optimize ( node -- newnode )
							 | 
						||
| 
								 | 
							
								    optimize-1 [ optimize ] when ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: simple-specializer ( quot dispatch# classes -- quot )
							 | 
						||
| 
								 | 
							
								    swap (dispatch#) [
							 | 
						||
| 
								 | 
							
								        object add* swap [ 2array ] curry map
							 | 
						||
| 
								 | 
							
								        object method-alist>quot
							 | 
						||
| 
								 | 
							
								    ] with-variable ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: dispatch-specializer ( quot dispatch# symbol dispatcher -- quot )
							 | 
						||
| 
								 | 
							
								    rot (dispatch#) [
							 | 
						||
| 
								 | 
							
								        [
							 | 
						||
| 
								 | 
							
								            picker %
							 | 
						||
| 
								 | 
							
								            ,
							 | 
						||
| 
								 | 
							
								            get swap <array> ,
							 | 
						||
| 
								 | 
							
								            \ dispatch ,
							 | 
						||
| 
								 | 
							
								        ] [ ] make
							 | 
						||
| 
								 | 
							
								    ] with-variable ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: tag-specializer ( quot dispatch# -- quot )
							 | 
						||
| 
								 | 
							
								    num-tags \ tag dispatch-specializer ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: type-specializer ( quot dispatch# -- quot )
							 | 
						||
| 
								 | 
							
								    num-types \ type dispatch-specializer ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: make-specializer ( quot dispatch# spec -- quot )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        { [ dup number eq? ] [ drop tag-specializer ] }
							 | 
						||
| 
								 | 
							
								        { [ dup object eq? ] [ drop type-specializer ] }
							 | 
						||
| 
								 | 
							
								        { [ dup \ * eq? ] [ 2drop ] }
							 | 
						||
| 
								 | 
							
								        { [ dup array? ] [ simple-specializer ] }
							 | 
						||
| 
								 | 
							
								        { [ t ] [ 1array simple-specializer ] }
							 | 
						||
| 
								 | 
							
								    } cond ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: specialized-def ( word -- quot )
							 | 
						||
| 
								 | 
							
								    dup word-def swap "specializer" word-prop [
							 | 
						||
| 
								 | 
							
								        [ length ] keep <reversed> [ make-specializer ] 2each
							 | 
						||
| 
								 | 
							
								    ] when* ;
							 |