53 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Factor
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Factor
		
	
	
		
			Executable File
		
	
USING: accessors namespaces assocs kernel sequences math
 | 
						|
tools.test words sets combinators.short-circuit
 | 
						|
stack-checker.state compiler.tree compiler.tree.builder
 | 
						|
compiler.tree.normalization compiler.tree.propagation
 | 
						|
compiler.tree.cleanup compiler.tree.def-use arrays kernel.private
 | 
						|
sorting math.order binary-search compiler.tree.checker ;
 | 
						|
IN: compiler.tree.def-use.tests
 | 
						|
 | 
						|
\ compute-def-use must-infer
 | 
						|
 | 
						|
[ t ] [
 | 
						|
    [ 1 2 3 ] build-tree compute-def-use drop
 | 
						|
    def-use get {
 | 
						|
        [ assoc-size 3 = ]
 | 
						|
        [ values [ uses>> [ #return? ] all? ] all? ]
 | 
						|
    } 1&&
 | 
						|
] unit-test
 | 
						|
 | 
						|
: test-def-use ( quot -- )
 | 
						|
    build-tree
 | 
						|
    normalize
 | 
						|
    propagate
 | 
						|
    cleanup
 | 
						|
    compute-def-use
 | 
						|
    check-nodes ;
 | 
						|
 | 
						|
: too-deep ( a b -- c )
 | 
						|
    dup [ drop ] [ 2dup too-deep too-deep drop ] if ; inline recursive
 | 
						|
 | 
						|
[ ] [ [ too-deep ] build-tree normalize compute-def-use check-nodes ] unit-test
 | 
						|
 | 
						|
! compute-def-use checks for SSA violations, so we use that to
 | 
						|
! ensure we generate some common patterns correctly.
 | 
						|
{
 | 
						|
    [ [ drop ] each-integer ]
 | 
						|
    [ [ 2drop ] curry each-integer ]
 | 
						|
    [ [ 1 ] [ 2 ] if drop ]
 | 
						|
    [ [ 1 ] [ dup ] if ]
 | 
						|
    [ [ 1 ] [ dup ] if drop ]
 | 
						|
    [ { array } declare swap ]
 | 
						|
    [ [ ] curry call ]
 | 
						|
    [ [ 1 ] [ 2 ] compose call + ]
 | 
						|
    [ [ 1 ] 2 [ + ] curry compose call + ]
 | 
						|
    [ [ 1 ] [ call 2 ] curry call + ]
 | 
						|
    [ [ 1 ] [ 2 ] compose swap [ 1 ] [ 2 ] if + * ]
 | 
						|
    [ dup slice? [ dup array? [ ] [ ] if ] [ ] if ]
 | 
						|
    [ dup [ drop f ] [ "A" throw ] if ]
 | 
						|
    [ [ <=> ] sort ]
 | 
						|
    [ [ <=> ] with search ]
 | 
						|
} [
 | 
						|
    [ ] swap [ test-def-use ] curry unit-test
 | 
						|
] each
 |