compiler.cfg.stacks.vacant: ##call instructions clear the set of overinitialized locations
							parent
							
								
									e3c2704986
								
							
						
					
					
						commit
						ffacc8370d
					
				| 
						 | 
				
			
			@ -161,6 +161,17 @@ IN: compiler.cfg.stacks.vacant.tests
 | 
			
		|||
    { { 4 { 3 2 1 -3 0 -2 -1 } } { 0 { -1 } } } state>gc-data
 | 
			
		||||
] unit-test
 | 
			
		||||
 | 
			
		||||
! ##call clears the overinitialized slots.
 | 
			
		||||
{
 | 
			
		||||
    { -1 { } }
 | 
			
		||||
} [
 | 
			
		||||
    V{
 | 
			
		||||
        T{ ##replace { src 10 } { loc D 0 } }
 | 
			
		||||
        T{ ##inc-d f -1 }
 | 
			
		||||
        T{ ##call }
 | 
			
		||||
    } create-cfg output-stack-map first
 | 
			
		||||
] unit-test
 | 
			
		||||
 | 
			
		||||
: cfg1 ( -- cfg )
 | 
			
		||||
    V{
 | 
			
		||||
        T{ ##inc-d f 1 }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -68,6 +68,11 @@ M: ##replace visit-insn visit-replace ;
 | 
			
		|||
M: ##peek visit-insn ( state insn -- state' )
 | 
			
		||||
    2dup peek-loc-ok? [ drop ] [ vacant-peek ] if ;
 | 
			
		||||
 | 
			
		||||
M: ##call visit-insn ( state insn -- state' )
 | 
			
		||||
    ! After a word call, we can't trust any overinitialized locations
 | 
			
		||||
    ! to contain valid pointers anymore.
 | 
			
		||||
    drop [ first2 [ 0 >= ] filter 2array ] map ;
 | 
			
		||||
 | 
			
		||||
: set-gc-map ( state gc-map -- )
 | 
			
		||||
    swap state>gc-data concat
 | 
			
		||||
    { >>scrub-d >>check-d >>scrub-r >>check-r } write-slots ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue