moved image functions to vm

db4
Phil Dawes 2009-08-17 21:37:08 +01:00
parent ee07c0b4e5
commit 1bba717b36
2 changed files with 131 additions and 21 deletions

View File

@ -4,7 +4,7 @@ namespace factor
{
/* Certain special objects in the image are known to the runtime */
static void init_objects(image_header *h)
void factorvm::init_objects(image_header *h)
{
memcpy(userenv,h->userenv,sizeof(userenv));
@ -14,9 +14,14 @@ static void init_objects(image_header *h)
bignum_neg_one = h->bignum_neg_one;
}
void init_objects(image_header *h)
{
return vm->init_objects(h);
}
cell data_relocation_base;
static void load_data_heap(FILE *file, image_header *h, vm_parameters *p)
void factorvm::load_data_heap(FILE *file, image_header *h, vm_parameters *p)
{
cell good_size = h->data_size + (1 << 20);
@ -49,9 +54,14 @@ static void load_data_heap(FILE *file, image_header *h, vm_parameters *p)
data_relocation_base = h->data_relocation_base;
}
void load_data_heap(FILE *file, image_header *h, vm_parameters *p)
{
return vm->load_data_heap(file,h,p);
}
cell code_relocation_base;
static void load_code_heap(FILE *file, image_header *h, vm_parameters *p)
void factorvm::load_code_heap(FILE *file, image_header *h, vm_parameters *p)
{
if(h->code_size > p->code_size)
fatal_error("Code heap too small to fit image",h->code_size);
@ -76,8 +86,13 @@ static void load_code_heap(FILE *file, image_header *h, vm_parameters *p)
build_free_list(&code,h->code_size);
}
void load_code_heap(FILE *file, image_header *h, vm_parameters *p)
{
return vm->load_code_heap(file,h,p);
}
/* Save the current image to disk */
bool save_image(const vm_char *filename)
bool factorvm::save_image(const vm_char *filename)
{
FILE* file;
image_header h;
@ -122,7 +137,12 @@ bool save_image(const vm_char *filename)
return ok;
}
PRIMITIVE(save_image)
bool save_image(const vm_char *filename)
{
return vm->save_image(filename);
}
inline void factorvm::vmprim_save_image()
{
/* do a full GC to push everything into tenured space */
gc();
@ -132,7 +152,12 @@ PRIMITIVE(save_image)
save_image((vm_char *)(path.untagged() + 1));
}
PRIMITIVE(save_image_and_exit)
PRIMITIVE(save_image)
{
PRIMITIVE_GETVM()->vmprim_save_image();
}
inline void factorvm::vmprim_save_image_and_exit()
{
/* We unbox this before doing anything else. This is the only point
where we might throw an error, so we have to throw an error here since
@ -158,7 +183,12 @@ PRIMITIVE(save_image_and_exit)
exit(1);
}
static void data_fixup(cell *cell)
PRIMITIVE(save_image_and_exit)
{
PRIMITIVE_GETVM()->vmprim_save_image_and_exit();
}
void factorvm::data_fixup(cell *cell)
{
if(immediate_p(*cell))
return;
@ -167,14 +197,24 @@ static void data_fixup(cell *cell)
*cell += (tenured->start - data_relocation_base);
}
template <typename T> void code_fixup(T **handle)
void data_fixup(cell *cell)
{
return vm->data_fixup(cell);
}
template <typename T> void factorvm::code_fixup(T **handle)
{
T *ptr = *handle;
T *new_ptr = (T *)(((cell)ptr) + (code.seg->start - code_relocation_base));
*handle = new_ptr;
}
static void fixup_word(word *word)
template <typename T> void code_fixup(T **handle)
{
return vm->code_fixup(handle);
}
void factorvm::fixup_word(word *word)
{
if(word->code)
code_fixup(&word->code);
@ -183,7 +223,12 @@ static void fixup_word(word *word)
code_fixup(&word->xt);
}
static void fixup_quotation(quotation *quot)
void fixup_word(word *word)
{
return vm->fixup_word(word);
}
void factorvm::fixup_quotation(quotation *quot)
{
if(quot->code)
{
@ -194,24 +239,44 @@ static void fixup_quotation(quotation *quot)
quot->xt = (void *)lazy_jit_compile;
}
static void fixup_alien(alien *d)
void fixup_quotation(quotation *quot)
{
return vm->fixup_quotation(quot);
}
void factorvm::fixup_alien(alien *d)
{
d->expired = T;
}
static void fixup_stack_frame(stack_frame *frame)
void fixup_alien(alien *d)
{
return vm->fixup_alien(d);
}
void factorvm::fixup_stack_frame(stack_frame *frame)
{
code_fixup(&frame->xt);
code_fixup(&FRAME_RETURN_ADDRESS(frame));
}
static void fixup_callstack_object(callstack *stack)
void fixup_stack_frame(stack_frame *frame)
{
iterate_callstack_object(stack,fixup_stack_frame);
return vm->fixup_stack_frame(frame);
}
void factorvm::fixup_callstack_object(callstack *stack)
{
iterate_callstack_object(stack,factor::fixup_stack_frame);
}
void fixup_callstack_object(callstack *stack)
{
return vm->fixup_callstack_object(stack);
}
/* Initialize an object in a newly-loaded image */
static void relocate_object(object *object)
void factorvm::relocate_object(object *object)
{
cell hi_tag = object->h.hi_tag();
@ -231,7 +296,7 @@ static void relocate_object(object *object)
}
else
{
do_slots((cell)object,data_fixup);
do_slots((cell)object,factor::data_fixup);
switch(hi_tag)
{
@ -254,9 +319,14 @@ static void relocate_object(object *object)
}
}
void relocate_object(object *object)
{
return vm->relocate_object(object);
}
/* Since the image might have been saved with a different base address than
where it is loaded, we need to fix up pointers in the image. */
void relocate_data()
void factorvm::relocate_data()
{
cell relocating;
@ -281,7 +351,12 @@ void relocate_data()
}
}
static void fixup_code_block(code_block *compiled)
void relocate_data()
{
return vm->relocate_data();
}
void factorvm::fixup_code_block(code_block *compiled)
{
/* relocate literal table data */
data_fixup(&compiled->relocation);
@ -290,14 +365,24 @@ static void fixup_code_block(code_block *compiled)
relocate_code_block(compiled);
}
void fixup_code_block(code_block *compiled)
{
return vm->fixup_code_block(compiled);
}
void factorvm::relocate_code()
{
iterate_code_heap(factor::fixup_code_block);
}
void relocate_code()
{
iterate_code_heap(fixup_code_block);
return vm->relocate_code();
}
/* Read an image file from disk, only done once during startup */
/* This function also initializes the data and code heaps */
void load_image(vm_parameters *p)
void factorvm::load_image(vm_parameters *p)
{
FILE *file = OPEN_READ(p->image_path);
if(file == NULL)
@ -331,4 +416,9 @@ void load_image(vm_parameters *p)
userenv[IMAGE_ENV] = allot_alien(F,(cell)p->image_path);
}
void load_image(vm_parameters *p)
{
return vm->load_image(p);
}
}

View File

@ -397,6 +397,26 @@ struct factorvm {
void forward_object_xts();
void fixup_object_xts();
void compact_code_heap();
//image
void init_objects(image_header *h);
void load_data_heap(FILE *file, image_header *h, vm_parameters *p);
void load_code_heap(FILE *file, image_header *h, vm_parameters *p);
bool save_image(const vm_char *filename);
inline void vmprim_save_image();
inline void vmprim_save_image_and_exit();
void data_fixup(cell *cell);
template <typename T> void code_fixup(T **handle);
void fixup_word(word *word);
void fixup_quotation(quotation *quot);
void fixup_alien(alien *d);
void fixup_stack_frame(stack_frame *frame);
void fixup_callstack_object(callstack *stack);
void relocate_object(object *object);
void relocate_data();
void fixup_code_block(code_block *compiled);
void relocate_code();
void load_image(vm_parameters *p);
// next method here: