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* ;
 |