Fix instances to not allocate memory while scanning heap

db4
Slava Pestov 2008-09-06 20:34:02 -05:00
parent 445747ee4e
commit 38b65e00f4
2 changed files with 11 additions and 2 deletions

View File

@ -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 ;

View File

@ -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 ;