stack-checker.state: docs and tests
							parent
							
								
									b493dac3c9
								
							
						
					
					
						commit
						bd376f5094
					
				| 
						 | 
				
			
			@ -1,6 +1,29 @@
 | 
			
		|||
USING: help.markup help.syntax quotations sequences ;
 | 
			
		||||
USING: compiler.tree effects help.markup help.syntax quotations sequences
 | 
			
		||||
stack-checker.values stack-checker.visitor ;
 | 
			
		||||
IN: stack-checker.state
 | 
			
		||||
 | 
			
		||||
HELP: terminated?
 | 
			
		||||
{ $var-description "Did the current control-flow path throw an error?" } ;
 | 
			
		||||
 | 
			
		||||
HELP: current-effect
 | 
			
		||||
{ $values { "effect" effect } }
 | 
			
		||||
{ $description "Returns what the current analysis states stack effect is." }
 | 
			
		||||
{ $examples
 | 
			
		||||
  { $example
 | 
			
		||||
    "USING: namespaces prettyprint stack-checker.state ;"
 | 
			
		||||
    "{ { input-count 2 } { terminated? t } { (meta-d) { 1 2 } } }"
 | 
			
		||||
    "[ current-effect ] with-variables ."
 | 
			
		||||
    "( x x -- x x * )"
 | 
			
		||||
  }
 | 
			
		||||
} ;
 | 
			
		||||
 | 
			
		||||
HELP: commit-literals
 | 
			
		||||
{ $description "Outputs all remaining literals to the current " { $link stack-visitor } " as " { $link #push } " instructions. They are also pushed onto the compile-time data stack." }
 | 
			
		||||
{ $see-also meta-d } ;
 | 
			
		||||
 | 
			
		||||
HELP: input-count
 | 
			
		||||
{ $var-description "Number of inputs current word expects from the stack." } ;
 | 
			
		||||
 | 
			
		||||
HELP: meta-d
 | 
			
		||||
{ $values { "stack" sequence } }
 | 
			
		||||
{ $description "Compile-time data stack." } ;
 | 
			
		||||
| 
						 | 
				
			
			@ -11,3 +34,7 @@ HELP: meta-r
 | 
			
		|||
 | 
			
		||||
HELP: literals
 | 
			
		||||
{ $var-description "Uncommitted literals. This is a form of local dead-code elimination; the goal is to reduce the number of IR nodes which get constructed. Technically it is redundant since we do global DCE later, but it speeds up compile time." } ;
 | 
			
		||||
 | 
			
		||||
HELP: (push-literal)
 | 
			
		||||
{ $values { "obj" "a literal" } }
 | 
			
		||||
{ $description "Pushes a literal value to the end of the current " { $link stack-visitor } ". The literal is also given a number and registered in the assoc of " { $link known-values } "." } ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,37 @@
 | 
			
		|||
USING: accessors assocs classes.tuple compiler.tree kernel namespaces sequences
 | 
			
		||||
stack-checker.backend stack-checker.recursive-state stack-checker.state
 | 
			
		||||
stack-checker.values stack-checker.visitor tools.test ;
 | 
			
		||||
IN: stack-checker.state.tests
 | 
			
		||||
 | 
			
		||||
{
 | 
			
		||||
    V{ 1 2 3 }
 | 
			
		||||
} [
 | 
			
		||||
    0 \ <value> set-global
 | 
			
		||||
    init-inference init-known-values
 | 
			
		||||
    V{ 1 2 3 } literals set commit-literals
 | 
			
		||||
    (meta-d) get
 | 
			
		||||
] unit-test
 | 
			
		||||
 | 
			
		||||
: node-seqs-eq? ( seq1 seq2 -- ? )
 | 
			
		||||
    [ [ tuple-slots ] map concat ] bi@ = ;
 | 
			
		||||
 | 
			
		||||
{ t t } [
 | 
			
		||||
    23 \ <value> set-global [
 | 
			
		||||
        V{ } clone stack-visitor set
 | 
			
		||||
        33 (push-literal)
 | 
			
		||||
        known-values get 24 of value>> 33 =
 | 
			
		||||
    ] with-infer nip
 | 
			
		||||
    V{
 | 
			
		||||
        T{ #push { literal 33 } { out-d { 24 } } }
 | 
			
		||||
        T{ #return { in-d V{ 24 } } }
 | 
			
		||||
    } node-seqs-eq?
 | 
			
		||||
] unit-test
 | 
			
		||||
 | 
			
		||||
{ t } [
 | 
			
		||||
    0 \ <value> set-global
 | 
			
		||||
    V{ } clone stack-visitor set
 | 
			
		||||
    V{ [ call ] } literals set commit-literals
 | 
			
		||||
    stack-visitor get
 | 
			
		||||
    V{ T{ #push { literal [ call ] } { out-d { 1 } } } }
 | 
			
		||||
    node-seqs-eq?
 | 
			
		||||
] unit-test
 | 
			
		||||
| 
						 | 
				
			
			@ -6,10 +6,8 @@ compiler.units stack-checker.values stack-checker.visitor
 | 
			
		|||
stack-checker.errors ;
 | 
			
		||||
IN: stack-checker.state
 | 
			
		||||
 | 
			
		||||
! Did the current control-flow path throw an error?
 | 
			
		||||
SYMBOL: terminated?
 | 
			
		||||
 | 
			
		||||
! Number of inputs current word expects from the stack
 | 
			
		||||
SYMBOL: input-count
 | 
			
		||||
SYMBOL: inner-d-index
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -29,9 +27,7 @@ SYMBOL: literals
 | 
			
		|||
    [ nip (meta-d) get push ] [ #push, ] 2bi ;
 | 
			
		||||
 | 
			
		||||
: commit-literals ( -- )
 | 
			
		||||
    literals get [
 | 
			
		||||
        [ [ (push-literal) ] each ] [ delete-all ] bi
 | 
			
		||||
    ] unless-empty ;
 | 
			
		||||
    literals get [ [ (push-literal) ] each ] [ delete-all ] bi ;
 | 
			
		||||
 | 
			
		||||
: current-stack-height ( -- n ) meta-d length input-count get - ;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue