moved code_heap functions to vm
parent
0097e76a82
commit
ee07c0b4e5
|
@ -6,18 +6,28 @@ namespace factor
|
||||||
heap code;
|
heap code;
|
||||||
|
|
||||||
/* Allocate a code heap during startup */
|
/* Allocate a code heap during startup */
|
||||||
void init_code_heap(cell size)
|
void factorvm::init_code_heap(cell size)
|
||||||
{
|
{
|
||||||
new_heap(&code,size);
|
new_heap(&code,size);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool in_code_heap_p(cell ptr)
|
void init_code_heap(cell size)
|
||||||
|
{
|
||||||
|
return vm->init_code_heap(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool factorvm::in_code_heap_p(cell ptr)
|
||||||
{
|
{
|
||||||
return (ptr >= code.seg->start && ptr <= code.seg->end);
|
return (ptr >= code.seg->start && ptr <= code.seg->end);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool in_code_heap_p(cell ptr)
|
||||||
|
{
|
||||||
|
return vm->in_code_heap_p(ptr);
|
||||||
|
}
|
||||||
|
|
||||||
/* Compile a word definition with the non-optimizing compiler. Allocates memory */
|
/* Compile a word definition with the non-optimizing compiler. Allocates memory */
|
||||||
void jit_compile_word(cell word_, cell def_, bool relocate)
|
void factorvm::jit_compile_word(cell word_, cell def_, bool relocate)
|
||||||
{
|
{
|
||||||
gc_root<word> word(word_);
|
gc_root<word> word(word_);
|
||||||
gc_root<quotation> def(def_);
|
gc_root<quotation> def(def_);
|
||||||
|
@ -30,8 +40,13 @@ void jit_compile_word(cell word_, cell def_, bool relocate)
|
||||||
if(word->pic_tail_def != F) jit_compile(word->pic_tail_def,relocate);
|
if(word->pic_tail_def != F) jit_compile(word->pic_tail_def,relocate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void jit_compile_word(cell word_, cell def_, bool relocate)
|
||||||
|
{
|
||||||
|
return vm->jit_compile_word(word_,def_,relocate);
|
||||||
|
}
|
||||||
|
|
||||||
/* Apply a function to every code block */
|
/* Apply a function to every code block */
|
||||||
void iterate_code_heap(code_heap_iterator iter)
|
void factorvm::iterate_code_heap(code_heap_iterator iter)
|
||||||
{
|
{
|
||||||
heap_block *scan = first_block(&code);
|
heap_block *scan = first_block(&code);
|
||||||
|
|
||||||
|
@ -43,21 +58,36 @@ void iterate_code_heap(code_heap_iterator iter)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void iterate_code_heap(code_heap_iterator iter)
|
||||||
|
{
|
||||||
|
return vm->iterate_code_heap(iter);
|
||||||
|
}
|
||||||
|
|
||||||
/* Copy literals referenced from all code blocks to newspace. Only for
|
/* Copy literals referenced from all code blocks to newspace. Only for
|
||||||
aging and nursery collections */
|
aging and nursery collections */
|
||||||
|
void factorvm::copy_code_heap_roots()
|
||||||
|
{
|
||||||
|
iterate_code_heap(factor::copy_literal_references);
|
||||||
|
}
|
||||||
|
|
||||||
void copy_code_heap_roots()
|
void copy_code_heap_roots()
|
||||||
{
|
{
|
||||||
iterate_code_heap(copy_literal_references);
|
return vm->copy_code_heap_roots();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update pointers to words referenced from all code blocks. Only after
|
/* Update pointers to words referenced from all code blocks. Only after
|
||||||
defining a new word. */
|
defining a new word. */
|
||||||
void update_code_heap_words()
|
void factorvm::update_code_heap_words()
|
||||||
{
|
{
|
||||||
iterate_code_heap(update_word_references);
|
iterate_code_heap(factor::update_word_references);
|
||||||
}
|
}
|
||||||
|
|
||||||
PRIMITIVE(modify_code_heap)
|
void update_code_heap_words()
|
||||||
|
{
|
||||||
|
return vm->update_code_heap_words();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void factorvm::vmprim_modify_code_heap()
|
||||||
{
|
{
|
||||||
gc_root<array> alist(dpop());
|
gc_root<array> alist(dpop());
|
||||||
|
|
||||||
|
@ -108,8 +138,13 @@ PRIMITIVE(modify_code_heap)
|
||||||
update_code_heap_words();
|
update_code_heap_words();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PRIMITIVE(modify_code_heap)
|
||||||
|
{
|
||||||
|
PRIMITIVE_GETVM()->vmprim_modify_code_heap();
|
||||||
|
}
|
||||||
|
|
||||||
/* Push the free space and total size of the code heap */
|
/* Push the free space and total size of the code heap */
|
||||||
PRIMITIVE(code_room)
|
inline void factorvm::vmprim_code_room()
|
||||||
{
|
{
|
||||||
cell used, total_free, max_free;
|
cell used, total_free, max_free;
|
||||||
heap_usage(&code,&used,&total_free,&max_free);
|
heap_usage(&code,&used,&total_free,&max_free);
|
||||||
|
@ -119,14 +154,24 @@ PRIMITIVE(code_room)
|
||||||
dpush(tag_fixnum(max_free / 1024));
|
dpush(tag_fixnum(max_free / 1024));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PRIMITIVE(code_room)
|
||||||
|
{
|
||||||
|
PRIMITIVE_GETVM()->vmprim_code_room();
|
||||||
|
}
|
||||||
|
|
||||||
static unordered_map<heap_block *,char *> forwarding;
|
static unordered_map<heap_block *,char *> forwarding;
|
||||||
|
|
||||||
code_block *forward_xt(code_block *compiled)
|
code_block *factorvm::forward_xt(code_block *compiled)
|
||||||
{
|
{
|
||||||
return (code_block *)forwarding[compiled];
|
return (code_block *)forwarding[compiled];
|
||||||
}
|
}
|
||||||
|
|
||||||
void forward_frame_xt(stack_frame *frame)
|
code_block *forward_xt(code_block *compiled)
|
||||||
|
{
|
||||||
|
return vm->forward_xt(compiled);
|
||||||
|
}
|
||||||
|
|
||||||
|
void factorvm::forward_frame_xt(stack_frame *frame)
|
||||||
{
|
{
|
||||||
cell offset = (cell)FRAME_RETURN_ADDRESS(frame) - (cell)frame_code(frame);
|
cell offset = (cell)FRAME_RETURN_ADDRESS(frame) - (cell)frame_code(frame);
|
||||||
code_block *forwarded = forward_xt(frame_code(frame));
|
code_block *forwarded = forward_xt(frame_code(frame));
|
||||||
|
@ -134,7 +179,12 @@ void forward_frame_xt(stack_frame *frame)
|
||||||
FRAME_RETURN_ADDRESS(frame) = (void *)((cell)forwarded + offset);
|
FRAME_RETURN_ADDRESS(frame) = (void *)((cell)forwarded + offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
void forward_object_xts()
|
void forward_frame_xt(stack_frame *frame)
|
||||||
|
{
|
||||||
|
return vm->forward_frame_xt(frame);
|
||||||
|
}
|
||||||
|
|
||||||
|
void factorvm::forward_object_xts()
|
||||||
{
|
{
|
||||||
begin_scan();
|
begin_scan();
|
||||||
|
|
||||||
|
@ -165,7 +215,7 @@ void forward_object_xts()
|
||||||
case CALLSTACK_TYPE:
|
case CALLSTACK_TYPE:
|
||||||
{
|
{
|
||||||
callstack *stack = untag<callstack>(obj);
|
callstack *stack = untag<callstack>(obj);
|
||||||
iterate_callstack_object(stack,forward_frame_xt);
|
iterate_callstack_object(stack,factor::forward_frame_xt);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -176,8 +226,13 @@ void forward_object_xts()
|
||||||
end_scan();
|
end_scan();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void forward_object_xts()
|
||||||
|
{
|
||||||
|
return vm->forward_object_xts();
|
||||||
|
}
|
||||||
|
|
||||||
/* Set the XT fields now that the heap has been compacted */
|
/* Set the XT fields now that the heap has been compacted */
|
||||||
void fixup_object_xts()
|
void factorvm::fixup_object_xts()
|
||||||
{
|
{
|
||||||
begin_scan();
|
begin_scan();
|
||||||
|
|
||||||
|
@ -205,11 +260,16 @@ void fixup_object_xts()
|
||||||
end_scan();
|
end_scan();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void fixup_object_xts()
|
||||||
|
{
|
||||||
|
return vm->fixup_object_xts();
|
||||||
|
}
|
||||||
|
|
||||||
/* Move all free space to the end of the code heap. This is not very efficient,
|
/* Move all free space to the end of the code heap. This is not very efficient,
|
||||||
since it makes several passes over the code and data heaps, but we only ever
|
since it makes several passes over the code and data heaps, but we only ever
|
||||||
do this before saving a deployed image and exiting, so performaance is not
|
do this before saving a deployed image and exiting, so performaance is not
|
||||||
critical here */
|
critical here */
|
||||||
void compact_code_heap()
|
void factorvm::compact_code_heap()
|
||||||
{
|
{
|
||||||
/* Free all unreachable code blocks */
|
/* Free all unreachable code blocks */
|
||||||
gc();
|
gc();
|
||||||
|
@ -231,4 +291,9 @@ void compact_code_heap()
|
||||||
build_free_list(&code,size);
|
build_free_list(&code,size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void compact_code_heap()
|
||||||
|
{
|
||||||
|
return vm->compact_code_heap();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
15
vm/vm.hpp
15
vm/vm.hpp
|
@ -382,6 +382,21 @@ struct factorvm {
|
||||||
void fixup_labels(array *labels, code_block *compiled);
|
void fixup_labels(array *labels, code_block *compiled);
|
||||||
code_block *allot_code_block(cell size);
|
code_block *allot_code_block(cell size);
|
||||||
code_block *add_code_block(cell type,cell code_,cell labels_,cell relocation_,cell literals_);
|
code_block *add_code_block(cell type,cell code_,cell labels_,cell relocation_,cell literals_);
|
||||||
|
|
||||||
|
//code_heap
|
||||||
|
void init_code_heap(cell size);
|
||||||
|
bool in_code_heap_p(cell ptr);
|
||||||
|
void jit_compile_word(cell word_, cell def_, bool relocate);
|
||||||
|
void iterate_code_heap(code_heap_iterator iter);
|
||||||
|
void copy_code_heap_roots();
|
||||||
|
void update_code_heap_words();
|
||||||
|
inline void vmprim_modify_code_heap();
|
||||||
|
inline void vmprim_code_room();
|
||||||
|
code_block *forward_xt(code_block *compiled);
|
||||||
|
void forward_frame_xt(stack_frame *frame);
|
||||||
|
void forward_object_xts();
|
||||||
|
void fixup_object_xts();
|
||||||
|
void compact_code_heap();
|
||||||
// next method here:
|
// next method here:
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue