Fix instances to not allocate memory while scanning heap
parent
445747ee4e
commit
38b65e00f4
|
@ -3,6 +3,8 @@ sequences tools.test words namespaces layouts classes
|
||||||
classes.builtin arrays quotations ;
|
classes.builtin arrays quotations ;
|
||||||
IN: memory.tests
|
IN: memory.tests
|
||||||
|
|
||||||
|
[ [ ] instances ] must-infer
|
||||||
|
|
||||||
! Code GC wasn't kicking in when needed
|
! Code GC wasn't kicking in when needed
|
||||||
: leak-step 800000 f <array> 1quotation call drop ;
|
: leak-step 800000 f <array> 1quotation call drop ;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
! Copyright (C) 2005, 2008 Slava Pestov.
|
! Copyright (C) 2005, 2008 Slava Pestov.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: kernel continuations sequences arrays system ;
|
USING: kernel continuations sequences vectors arrays system math ;
|
||||||
IN: memory
|
IN: memory
|
||||||
|
|
||||||
: (each-object) ( quot: ( obj -- ) -- )
|
: (each-object) ( quot: ( obj -- ) -- )
|
||||||
|
@ -9,7 +9,14 @@ IN: memory
|
||||||
: each-object ( quot -- )
|
: each-object ( quot -- )
|
||||||
begin-scan [ (each-object) ] [ end-scan ] [ ] cleanup ; inline
|
begin-scan [ (each-object) ] [ end-scan ] [ ] cleanup ; inline
|
||||||
|
|
||||||
|
: count-instances ( quot -- n )
|
||||||
|
0 swap [ 1 0 ? + ] compose each-object ; inline
|
||||||
|
|
||||||
: instances ( quot -- seq )
|
: instances ( quot -- seq )
|
||||||
pusher [ each-object ] dip >array ; inline
|
#! To ensure we don't need to grow the vector while scanning
|
||||||
|
#! the heap, we do two scans, the first one just counts the
|
||||||
|
#! number of objects that satisfy the predicate.
|
||||||
|
[ count-instances 100 + <vector> ] keep swap
|
||||||
|
[ [ push-if ] 2curry each-object ] keep >array ; inline
|
||||||
|
|
||||||
: save ( -- ) image save-image ;
|
: save ( -- ) image save-image ;
|
||||||
|
|
Loading…
Reference in New Issue