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 ;
|
||||
IN: memory.tests
|
||||
|
||||
[ [ ] instances ] must-infer
|
||||
|
||||
! Code GC wasn't kicking in when needed
|
||||
: leak-step 800000 f <array> 1quotation call drop ;
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
! Copyright (C) 2005, 2008 Slava Pestov.
|
||||
! 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
|
||||
|
||||
: (each-object) ( quot: ( obj -- ) -- )
|
||||
|
@ -9,7 +9,14 @@ IN: memory
|
|||
: each-object ( quot -- )
|
||||
begin-scan [ (each-object) ] [ end-scan ] [ ] cleanup ; inline
|
||||
|
||||
: count-instances ( quot -- n )
|
||||
0 swap [ 1 0 ? + ] compose each-object ; inline
|
||||
|
||||
: 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 ;
|
||||
|
|
Loading…
Reference in New Issue