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