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
|
{ { 4 { 3 2 1 -3 0 -2 -1 } } { 0 { -1 } } } state>gc-data
|
||||||
] unit-test
|
] 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 )
|
: cfg1 ( -- cfg )
|
||||||
V{
|
V{
|
||||||
T{ ##inc-d f 1 }
|
T{ ##inc-d f 1 }
|
||||||
|
|
|
||||||
|
|
@ -68,6 +68,11 @@ M: ##replace visit-insn visit-replace ;
|
||||||
M: ##peek visit-insn ( state insn -- state' )
|
M: ##peek visit-insn ( state insn -- state' )
|
||||||
2dup peek-loc-ok? [ drop ] [ vacant-peek ] if ;
|
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 -- )
|
: set-gc-map ( state gc-map -- )
|
||||||
swap state>gc-data concat
|
swap state>gc-data concat
|
||||||
{ >>scrub-d >>check-d >>scrub-r >>check-r } write-slots ;
|
{ >>scrub-d >>check-d >>scrub-r >>check-r } write-slots ;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue