Merge branch 'master' into simd-cleanup

db4
Joe Groff 2009-11-08 21:54:53 -06:00
commit 788289e51e
24 changed files with 216 additions and 157 deletions

View File

@ -12,6 +12,8 @@ compiler.errors compiler.units compiler.utilities
compiler.tree.builder compiler.tree.builder
compiler.tree.optimizer compiler.tree.optimizer
compiler.crossref
compiler.cfg compiler.cfg
compiler.cfg.builder compiler.cfg.builder
compiler.cfg.optimizer compiler.cfg.optimizer
@ -193,6 +195,14 @@ M: optimizing-compiler recompile ( words -- alist )
] with-scope ] with-scope
"--- compile done" compiler-message ; "--- compile done" compiler-message ;
M: optimizing-compiler to-recompile ( -- words )
changed-definitions get compiled-usages
changed-generics get compiled-generic-usages
append assoc-combine keys ;
M: optimizing-compiler process-forgotten-words
[ delete-compiled-xref ] each ;
: with-optimizer ( quot -- ) : with-optimizer ( quot -- )
[ optimizing-compiler compiler-impl ] dip with-variable ; inline [ optimizing-compiler compiler-impl ] dip with-variable ; inline

View File

@ -0,0 +1 @@
Slava Pestov

View File

@ -0,0 +1,67 @@
! Copyright (C) 2009 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: assocs classes.algebra compiler.units definitions graphs
grouping kernel namespaces sequences words stack-checker.state ;
IN: compiler.crossref
SYMBOL: compiled-crossref
compiled-crossref [ H{ } clone ] initialize
SYMBOL: compiled-generic-crossref
compiled-generic-crossref [ H{ } clone ] initialize
: compiled-usage ( word -- assoc )
compiled-crossref get at ;
: (compiled-usages) ( word -- assoc )
#! If the word is not flushable anymore, we have to recompile
#! all words which flushable away a call (presumably when the
#! word was still flushable). If the word is flushable, we
#! don't have to recompile words that folded this away.
[ compiled-usage ]
[ "flushable" word-prop inlined-dependency flushed-dependency ? ] bi
[ dependency>= nip ] curry assoc-filter ;
: compiled-usages ( seq -- assocs )
[ drop word? ] assoc-filter
[ [ drop (compiled-usages) ] { } assoc>map ] keep suffix ;
: compiled-generic-usage ( word -- assoc )
compiled-generic-crossref get at ;
: (compiled-generic-usages) ( generic class -- assoc )
[ compiled-generic-usage ] dip
[
2dup [ valid-class? ] both?
[ classes-intersect? ] [ 2drop f ] if nip
] curry assoc-filter ;
: compiled-generic-usages ( assoc -- assocs )
[ (compiled-generic-usages) ] { } assoc>map ;
: (compiled-xref) ( word dependencies word-prop variable -- )
[ [ concat ] dip set-word-prop ] [ get add-vertex* ] bi-curry* 2bi ;
: compiled-xref ( word dependencies generic-dependencies -- )
[ [ drop crossref? ] { } assoc-filter-as ] bi@
[ "compiled-uses" compiled-crossref (compiled-xref) ]
[ "compiled-generic-uses" compiled-generic-crossref (compiled-xref) ]
bi-curry* bi ;
: (compiled-unxref) ( word word-prop variable -- )
[ [ [ dupd word-prop 2 <groups> ] dip get remove-vertex* ] 2curry ]
[ drop [ remove-word-prop ] curry ]
2bi bi ;
: compiled-unxref ( word -- )
[ "compiled-uses" compiled-crossref (compiled-unxref) ]
[ "compiled-generic-uses" compiled-generic-crossref (compiled-unxref) ]
bi ;
: delete-compiled-xref ( word -- )
[ compiled-unxref ]
[ compiled-crossref get delete-at ]
[ compiled-generic-crossref get delete-at ]
tri ;

View File

@ -1,6 +1,6 @@
USING: accessors compiler compiler.units tools.test math parser USING: accessors compiler compiler.units tools.test math parser
kernel sequences sequences.private classes.mixin generic kernel sequences sequences.private classes.mixin generic
definitions arrays words assocs eval ; definitions arrays words assocs eval grouping ;
IN: compiler.tests.redefine3 IN: compiler.tests.redefine3
GENERIC: sheeple ( obj -- x ) GENERIC: sheeple ( obj -- x )
@ -13,20 +13,23 @@ M: empty-mixin sheeple drop "wake up" ; inline
: sheeple-test ( -- string ) { } sheeple ; : sheeple-test ( -- string ) { } sheeple ;
: compiled-use? ( key word -- ? )
"compiled-uses" word-prop 2 <groups> key? ;
[ "sheeple" ] [ sheeple-test ] unit-test [ "sheeple" ] [ sheeple-test ] unit-test
[ t ] [ \ sheeple-test optimized? ] unit-test [ t ] [ \ sheeple-test optimized? ] unit-test
[ t ] [ object \ sheeple method \ sheeple-test "compiled-uses" word-prop key? ] unit-test [ t ] [ object \ sheeple method \ sheeple-test compiled-use? ] unit-test
[ f ] [ empty-mixin \ sheeple method \ sheeple-test "compiled-uses" word-prop key? ] unit-test [ f ] [ empty-mixin \ sheeple method \ sheeple-test compiled-use? ] unit-test
[ ] [ "IN: compiler.tests.redefine3 USE: arrays INSTANCE: array empty-mixin" eval( -- ) ] unit-test [ ] [ "IN: compiler.tests.redefine3 USE: arrays INSTANCE: array empty-mixin" eval( -- ) ] unit-test
[ "wake up" ] [ sheeple-test ] unit-test [ "wake up" ] [ sheeple-test ] unit-test
[ f ] [ object \ sheeple method \ sheeple-test "compiled-uses" word-prop key? ] unit-test [ f ] [ object \ sheeple method \ sheeple-test compiled-use? ] unit-test
[ t ] [ empty-mixin \ sheeple method \ sheeple-test "compiled-uses" word-prop key? ] unit-test [ t ] [ empty-mixin \ sheeple method \ sheeple-test compiled-use? ] unit-test
[ ] [ [ array empty-mixin remove-mixin-instance ] with-compilation-unit ] unit-test [ ] [ [ array empty-mixin remove-mixin-instance ] with-compilation-unit ] unit-test
[ "sheeple" ] [ sheeple-test ] unit-test [ "sheeple" ] [ sheeple-test ] unit-test
[ t ] [ \ sheeple-test optimized? ] unit-test [ t ] [ \ sheeple-test optimized? ] unit-test
[ t ] [ object \ sheeple method \ sheeple-test "compiled-uses" word-prop key? ] unit-test [ t ] [ object \ sheeple method \ sheeple-test compiled-use? ] unit-test
[ f ] [ empty-mixin \ sheeple method \ sheeple-test "compiled-uses" word-prop key? ] unit-test [ f ] [ empty-mixin \ sheeple method \ sheeple-test compiled-use? ] unit-test

View File

@ -38,12 +38,15 @@ INSTANCE: fried-callable fried
[ [ \ 3curry suffix! ] dip 3 - (ncurry) ] [ [ \ 3curry suffix! ] dip 3 - (ncurry) ]
} case ; } case ;
: wrap-non-callable ( obj -- quot )
dup callable? [ ] [ [ call ] curry ] if ; inline
: [ncurry] ( n -- quot ) : [ncurry] ( n -- quot )
[ V{ } clone ] dip (ncurry) >quotation ; [ V{ } clone ] dip (ncurry) >quotation ;
: [ndip] ( quot n -- quot' ) : [ndip] ( quot n -- quot' )
{ {
{ 0 [ ] } { 0 [ wrap-non-callable ] }
{ 1 [ \ dip [ ] 2sequence ] } { 1 [ \ dip [ ] 2sequence ] }
{ 2 [ \ 2dip [ ] 2sequence ] } { 2 [ \ 2dip [ ] 2sequence ] }
{ 3 [ \ 3dip [ ] 2sequence ] } { 3 [ \ 3dip [ ] 2sequence ] }

View File

@ -177,7 +177,7 @@ M: winnt file-system-info ( path -- file-system-info )
handle buf buf-length FindNextVolume :> ret handle buf buf-length FindNextVolume :> ret
ret 0 = [ ret 0 = [
GetLastError ERROR_NO_MORE_FILES = GetLastError ERROR_NO_MORE_FILES =
[ drop f ] [ win32-error-string throw ] if [ f ] [ win32-error-string throw ] if
] [ ] [
buf utf16n alien>string buf utf16n alien>string
] if ; ] if ;

View File

@ -389,7 +389,7 @@ M:: integer lambda-method-forget-test ( a -- b ) a ;
eval( -- ) call eval( -- ) call
] [ error>> >r/r>-in-fry-error? ] must-fail-with ] [ error>> >r/r>-in-fry-error? ] must-fail-with
:: (funny-macro-test) ( obj quot -- ? ) obj { quot } 1&& ; inline :: (funny-macro-test) ( obj quot -- ? ) obj { [ quot call ] } 1&& ; inline
: funny-macro-test ( n -- ? ) [ odd? ] (funny-macro-test) ; : funny-macro-test ( n -- ? ) [ odd? ] (funny-macro-test) ;
\ funny-macro-test def>> must-infer \ funny-macro-test def>> must-infer

View File

@ -28,3 +28,11 @@ SYMBOL: b
b inlined-dependency depends-on b inlined-dependency depends-on
] computing-dependencies ] computing-dependencies
] unit-test ] unit-test
[ flushed-dependency ] [ f flushed-dependency strongest-dependency ] unit-test
[ flushed-dependency ] [ flushed-dependency f strongest-dependency ] unit-test
[ inlined-dependency ] [ flushed-dependency inlined-dependency strongest-dependency ] unit-test
[ inlined-dependency ] [ called-dependency inlined-dependency strongest-dependency ] unit-test
[ flushed-dependency ] [ called-dependency flushed-dependency strongest-dependency ] unit-test
[ called-dependency ] [ called-dependency f strongest-dependency ] unit-test

View File

@ -48,6 +48,18 @@ SYMBOL: literals
! Words that the current quotation depends on ! Words that the current quotation depends on
SYMBOL: dependencies SYMBOL: dependencies
SYMBOLS: inlined-dependency flushed-dependency called-dependency ;
: index>= ( obj1 obj2 seq -- ? )
[ index ] curry bi@ >= ;
: dependency>= ( how1 how2 -- ? )
{ called-dependency flushed-dependency inlined-dependency }
index>= ;
: strongest-dependency ( how1 how2 -- how )
[ called-dependency or ] bi@ [ dependency>= ] most ;
: depends-on ( word how -- ) : depends-on ( word how -- )
over primitive? [ 2drop ] [ over primitive? [ 2drop ] [
dependencies get dup [ dependencies get dup [

View File

@ -9,6 +9,7 @@ compiler.units definitions generic generic.standard
generic.single tools.deploy.config combinators classes generic.single tools.deploy.config combinators classes
classes.builtin slots.private grouping command-line ; classes.builtin slots.private grouping command-line ;
QUALIFIED: bootstrap.stage2 QUALIFIED: bootstrap.stage2
QUALIFIED: compiler.crossref
QUALIFIED: compiler.errors QUALIFIED: compiler.errors
QUALIFIED: continuations QUALIFIED: continuations
QUALIFIED: definitions QUALIFIED: definitions
@ -340,8 +341,8 @@ IN: tools.deploy.shaker
implementors-map implementors-map
update-map update-map
main-vocab-hook main-vocab-hook
compiled-crossref compiler.crossref:compiled-crossref
compiled-generic-crossref compiler.crossref:compiled-generic-crossref
compiler-impl compiler-impl
compiler.errors:compiler-errors compiler.errors:compiler-errors
lexer-factory lexer-factory

View File

@ -1,9 +1,10 @@
! Copyright (C) 2007, 2008 Slava Pestov. ! Copyright (C) 2007, 2008 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: accessors words sequences math prettyprint kernel arrays io USING: accessors words sequences math prettyprint kernel arrays
io.styles namespaces assocs kernel.private strings combinators io io.styles namespaces assocs kernel.private strings
sorting math.parser vocabs definitions tools.profiler.private combinators sorting math.parser vocabs definitions
tools.crossref continuations generic compiler.units sets classes fry ; tools.profiler.private tools.crossref continuations generic
compiler.units compiler.crossref sets classes fry ;
IN: tools.profiler IN: tools.profiler
: profile ( quot -- ) : profile ( quot -- )

View File

@ -5,13 +5,6 @@ IN: compiler.units.tests
[ [ [ ] define-temp ] with-compilation-unit ] must-infer [ [ [ ] define-temp ] with-compilation-unit ] must-infer
[ [ [ ] define-temp ] with-nested-compilation-unit ] must-infer [ [ [ ] define-temp ] with-nested-compilation-unit ] must-infer
[ flushed-dependency ] [ f flushed-dependency strongest-dependency ] unit-test
[ flushed-dependency ] [ flushed-dependency f strongest-dependency ] unit-test
[ inlined-dependency ] [ flushed-dependency inlined-dependency strongest-dependency ] unit-test
[ inlined-dependency ] [ called-dependency inlined-dependency strongest-dependency ] unit-test
[ flushed-dependency ] [ called-dependency flushed-dependency strongest-dependency ] unit-test
[ called-dependency ] [ called-dependency f strongest-dependency ] unit-test
! Non-optimizing compiler bugs ! Non-optimizing compiler bugs
[ 1 1 ] [ [ 1 1 ] [
"A" "B" <word> [ [ [ 1 ] dip ] 2array 1array modify-code-heap ] keep "A" "B" <word> [ [ [ 1 ] dip ] 2array 1array modify-code-heap ] keep

View File

@ -40,8 +40,19 @@ SYMBOL: compiler-impl
HOOK: recompile compiler-impl ( words -- alist ) HOOK: recompile compiler-impl ( words -- alist )
HOOK: to-recompile compiler-impl ( -- words )
HOOK: process-forgotten-words compiler-impl ( words -- )
! Non-optimizing compiler ! Non-optimizing compiler
M: f recompile [ dup def>> ] { } map>assoc ; M: f recompile
[ dup def>> ] { } map>assoc ;
M: f to-recompile
changed-definitions get [ drop word? ] assoc-filter
changed-generics get assoc-union keys ;
M: f process-forgotten-words drop ;
: without-optimizer ( quot -- ) : without-optimizer ( quot -- )
[ f compiler-impl ] dip with-variable ; inline [ f compiler-impl ] dip with-variable ; inline
@ -50,8 +61,12 @@ M: f recompile [ dup def>> ] { } map>assoc ;
! during stage1 bootstrap, it would just waste time. ! during stage1 bootstrap, it would just waste time.
SINGLETON: dummy-compiler SINGLETON: dummy-compiler
M: dummy-compiler to-recompile f ;
M: dummy-compiler recompile drop { } ; M: dummy-compiler recompile drop { } ;
M: dummy-compiler process-forgotten-words drop ;
: <definitions> ( -- pair ) { H{ } H{ } } [ clone ] map ; : <definitions> ( -- pair ) { H{ } H{ } } [ clone ] map ;
SYMBOL: definition-observers SYMBOL: definition-observers
@ -89,59 +104,9 @@ GENERIC: definitions-changed ( assoc obj -- )
: compile ( words -- ) recompile modify-code-heap ; : compile ( words -- ) recompile modify-code-heap ;
: index>= ( obj1 obj2 seq -- ? )
[ index ] curry bi@ >= ;
: dependency>= ( how1 how2 -- ? )
{ called-dependency flushed-dependency inlined-dependency }
index>= ;
: strongest-dependency ( how1 how2 -- how )
[ called-dependency or ] bi@ [ dependency>= ] most ;
: weakest-dependency ( how1 how2 -- how )
[ inlined-dependency or ] bi@ [ dependency>= not ] most ;
: compiled-usage ( word -- assoc )
compiled-crossref get at ;
: (compiled-usages) ( word -- assoc )
#! If the word is not flushable anymore, we have to recompile
#! all words which flushable away a call (presumably when the
#! word was still flushable). If the word is flushable, we
#! don't have to recompile words that folded this away.
[ compiled-usage ]
[ "flushable" word-prop inlined-dependency flushed-dependency ? ] bi
[ dependency>= nip ] curry assoc-filter ;
: compiled-usages ( assoc -- assocs )
[ drop word? ] assoc-filter
[ [ drop (compiled-usages) ] { } assoc>map ] keep suffix ;
: compiled-generic-usage ( word -- assoc )
compiled-generic-crossref get at ;
: (compiled-generic-usages) ( generic class -- assoc )
[ compiled-generic-usage ] dip
[
2dup [ valid-class? ] both?
[ classes-intersect? ] [ 2drop f ] if nip
] curry assoc-filter ;
: compiled-generic-usages ( assoc -- assocs )
[ (compiled-generic-usages) ] { } assoc>map ;
: words-only ( assoc -- assoc' )
[ drop word? ] assoc-filter ;
: to-recompile ( -- seq )
changed-definitions get compiled-usages
changed-generics get compiled-generic-usages
append assoc-combine keys ;
: process-forgotten-definitions ( -- ) : process-forgotten-definitions ( -- )
forgotten-definitions get keys forgotten-definitions get keys
[ [ word? ] filter [ delete-compiled-xref ] each ] [ [ word? ] filter process-forgotten-words ]
[ [ delete-definition-errors ] each ] [ [ delete-definition-errors ] each ]
bi ; bi ;

View File

@ -7,15 +7,13 @@ MIXIN: definition
ERROR: no-compilation-unit definition ; ERROR: no-compilation-unit definition ;
SYMBOLS: inlined-dependency flushed-dependency called-dependency ;
: set-in-unit ( value key assoc -- ) : set-in-unit ( value key assoc -- )
[ set-at ] [ no-compilation-unit ] if* ; [ set-at ] [ no-compilation-unit ] if* ;
SYMBOL: changed-definitions SYMBOL: changed-definitions
: changed-definition ( defspec -- ) : changed-definition ( defspec -- )
inlined-dependency swap changed-definitions get set-in-unit ; dup changed-definitions get set-in-unit ;
SYMBOL: changed-effects SYMBOL: changed-effects

View File

@ -3,7 +3,8 @@ classes.tuple classes.union compiler.units continuations
definitions eval generic generic.math generic.standard definitions eval generic generic.math generic.standard
hashtables io io.streams.string kernel layouts math math.order hashtables io io.streams.string kernel layouts math math.order
namespaces parser prettyprint quotations sequences sorting namespaces parser prettyprint quotations sequences sorting
strings tools.test vectors words generic.single ; strings tools.test vectors words generic.single
compiler.crossref ;
IN: generic.tests IN: generic.tests
GENERIC: foobar ( x -- y ) GENERIC: foobar ( x -- y )

View File

@ -102,7 +102,7 @@ HELP: load-docs
HELP: reload HELP: reload
{ $values { "name" "a vocabulary name" } } { $values { "name" "a vocabulary name" } }
{ $description "Loads it's source code and documentation." } { $description "Reloads the source code and documentation for a vocabulary." }
{ $errors "Throws a " { $link no-vocab } " error if the vocabulary does not exist on disk." } ; { $errors "Throws a " { $link no-vocab } " error if the vocabulary does not exist on disk." } ;
HELP: require HELP: require

View File

@ -1,7 +1,7 @@
USING: arrays generic assocs kernel math namespaces USING: arrays generic assocs kernel math namespaces
sequences tools.test words definitions parser quotations sequences tools.test words definitions parser quotations
vocabs continuations classes.tuple compiler.units vocabs continuations classes.tuple compiler.units
io.streams.string accessors eval words.symbol ; io.streams.string accessors eval words.symbol grouping ;
IN: words.tests IN: words.tests
[ 4 ] [ [ 4 ] [
@ -121,7 +121,7 @@ DEFER: x
[ { } ] [ { } ]
[ [
all-words [ all-words [
"compiled-uses" word-prop "compiled-uses" word-prop 2 <groups>
keys [ "forgotten" word-prop ] filter keys [ "forgotten" word-prop ] filter
] map harvest ] map harvest
] unit-test ] unit-test

View File

@ -64,41 +64,6 @@ GENERIC: crossref? ( word -- ? )
M: word crossref? M: word crossref?
dup "forgotten" word-prop [ drop f ] [ vocabulary>> >boolean ] if ; dup "forgotten" word-prop [ drop f ] [ vocabulary>> >boolean ] if ;
SYMBOL: compiled-crossref
compiled-crossref [ H{ } clone ] initialize
SYMBOL: compiled-generic-crossref
compiled-generic-crossref [ H{ } clone ] initialize
: (compiled-xref) ( word dependencies word-prop variable -- )
[ [ set-word-prop ] curry ]
[ [ get add-vertex* ] curry ]
bi* 2bi ;
: compiled-xref ( word dependencies generic-dependencies -- )
[ [ drop crossref? ] { } assoc-filter-as f like ] bi@
[ "compiled-uses" compiled-crossref (compiled-xref) ]
[ "compiled-generic-uses" compiled-generic-crossref (compiled-xref) ]
bi-curry* bi ;
: (compiled-unxref) ( word word-prop variable -- )
[ [ [ dupd word-prop ] dip get remove-vertex* ] 2curry ]
[ drop [ remove-word-prop ] curry ]
2bi bi ;
: compiled-unxref ( word -- )
[ "compiled-uses" compiled-crossref (compiled-unxref) ]
[ "compiled-generic-uses" compiled-generic-crossref (compiled-unxref) ]
bi ;
: delete-compiled-xref ( word -- )
[ compiled-unxref ]
[ compiled-crossref get delete-at ]
[ compiled-generic-crossref get delete-at ]
tri ;
: inline? ( word -- ? ) "inline" word-prop ; inline : inline? ( word -- ? ) "inline" word-prop ; inline
GENERIC: subwords ( word -- seq ) GENERIC: subwords ( word -- seq )

View File

@ -0,0 +1 @@
Joe Groff

View File

@ -0,0 +1,28 @@
! (c)2009 Joe Groff bsd license
USING: fry io io.directories io.encodings.ascii
io.encodings.utf8 io.launcher io.pathnames kernel lexer
namespaces parser sequences splitting vocabs vocabs.loader ;
IN: vocabs.git
<PRIVATE
: git-object-id ( filename rev -- id/f )
[ [ parent-directory ] [ file-name ] bi ] dip swap '[
{ "git" "ls-tree" } _ suffix _ suffix ascii [
readln
[ " " split1 nip " " split1 nip "\t" split1 drop ]
[ f ] if*
] with-process-reader
] with-directory ;
: with-git-object-stream ( id quot -- )
[ { "git" "cat-file" "-p" } swap suffix utf8 ] dip with-process-reader ; inline
PRIVATE>
ERROR: git-revision-not-found path ;
: use-vocab-rev ( vocab-name rev -- )
[ create-vocab vocab-source-path dup ] dip git-object-id
[ [ input-stream get swap parse-stream call( -- ) ] with-git-object-stream ]
[ git-revision-not-found ] if* ;
SYNTAX: USE-REV: scan scan use-vocab-rev ;

View File

@ -1,7 +1,29 @@
namespace factor namespace factor
{ {
/* These algorithms were snarfed from various places. I did not come up with them myself */ inline cell log2(cell x)
{
cell n;
#if defined(FACTOR_X86) || defined(FACTOR_AMD64)
asm ("bsr %1, %0;":"=r"(n):"r"(x));
#elif defined(FACTOR_PPC)
asm ("cntlzw %1, %0;":"=r"(n):"r"(x));
n = (31 - n);
#else
#error Unsupported CPU
#endif
return n;
}
inline cell rightmost_clear_bit(cell x)
{
return log2(~x & (x + 1));
}
inline cell rightmost_set_bit(cell x)
{
return log2(x & -x);
}
inline cell popcount(cell x) inline cell popcount(cell x)
{ {
@ -24,39 +46,7 @@ inline cell popcount(cell x)
x = (x + (x >> 4)) & k4 ; // put count of each 8 bits into those 8 bits x = (x + (x >> 4)) & k4 ; // put count of each 8 bits into those 8 bits
x = (x * kf) >> ks; // returns 8 most significant bits of x + (x<<8) + (x<<16) + (x<<24) + ... x = (x * kf) >> ks; // returns 8 most significant bits of x + (x<<8) + (x<<16) + (x<<24) + ...
return (cell)x; return x;
}
inline cell log2(cell x)
{
#if defined(FACTOR_X86)
cell n;
asm ("bsr %1, %0;":"=r"(n):"r"(x));
#elif defined(FACTOR_AMD64)
cell n;
asm ("bsr %1, %0;":"=r"(n):"r"(x));
#else
cell n = 0;
#ifdef FACTOR_64
if (x >= (cell)1 << 32) { x >>= 32; n += 32; }
#endif
if (x >= (cell)1 << 16) { x >>= 16; n += 16; }
if (x >= (cell)1 << 8) { x >>= 8; n += 8; }
if (x >= (cell)1 << 4) { x >>= 4; n += 4; }
if (x >= (cell)1 << 2) { x >>= 2; n += 2; }
if (x >= (cell)1 << 1) { n += 1; }
#endif
return n;
}
inline cell rightmost_clear_bit(cell x)
{
return log2(~x & (x + 1));
}
inline cell rightmost_set_bit(cell x)
{
return log2(x & -x);
} }
} }

View File

@ -3,6 +3,20 @@
namespace factor namespace factor
{ {
context::context(cell ds_size, cell rs_size) :
callstack_top(NULL),
callstack_bottom(NULL),
datastack(0),
retainstack(0),
datastack_save(0),
retainstack_save(0),
magic_frame(NULL),
datastack_region(new segment(ds_size,false)),
retainstack_region(new segment(rs_size,false)),
catchstack_save(0),
current_callback_save(0),
next(NULL) {}
void factor_vm::reset_datastack() void factor_vm::reset_datastack()
{ {
ds = ds_bot - sizeof(cell); ds = ds_bot - sizeof(cell);
@ -42,11 +56,7 @@ context *factor_vm::alloc_context()
unused_contexts = unused_contexts->next; unused_contexts = unused_contexts->next;
} }
else else
{ new_context = new context(ds_size,rs_size);
new_context = new context;
new_context->datastack_region = new segment(ds_size,false);
new_context->retainstack_region = new segment(rs_size,false);
}
return new_context; return new_context;
} }

View File

@ -46,6 +46,8 @@ struct context {
cell current_callback_save; cell current_callback_save;
context *next; context *next;
context(cell ds_size, cell rs_size);
}; };
#define ds_bot (ctx->datastack_region->start) #define ds_bot (ctx->datastack_region->start)

View File

@ -126,7 +126,7 @@ void factor_vm::collect_full(bool trace_contexts_p)
{ {
collect_mark_impl(trace_contexts_p); collect_mark_impl(trace_contexts_p);
collect_sweep_impl(); collect_sweep_impl();
if(data->tenured->largest_free_block() <= data->nursery->size + data->aging->size) if(data->low_memory_p())
collect_compact_impl(trace_contexts_p); collect_compact_impl(trace_contexts_p);
else else
update_code_heap_words_and_literals(); update_code_heap_words_and_literals();