factor/vm/factor.c

113 lines
2.3 KiB
C
Raw Normal View History

2004-07-16 02:26:21 -04:00
#include "factor.h"
void default_parameters(F_PARAMETERS *p)
{
p->image = NULL;
p->ds_size = 128;
p->rs_size = 128;
p->cs_size = 128;
p->gen_count = 2;
p->young_size = 2 * CELLS;
p->aging_size = 4 * CELLS;
p->code_size = 2 * CELLS;
p->secure_gc = false;
}
void init_environment(void)
{
userenv[CPU_ENV] = tag_object(from_char_string(FACTOR_CPU_STRING));
userenv[OS_ENV] = tag_object(from_char_string(FACTOR_OS_STRING));
userenv[CELL_SIZE_ENV] = tag_fixnum(sizeof(CELL));
}
2006-11-01 00:20:49 -05:00
/* Get things started */
void init_factor(F_PARAMETERS *p)
2004-11-22 19:15:14 -05:00
{
gc_off = true;
early_init();
if(p->image == NULL)
p->image = default_image_path();
srand(current_millis());
init_primitives();
init_ffi();
init_stacks(p->ds_size,p->rs_size,p->cs_size);
load_image(p);
init_c_io();
2004-11-22 19:15:14 -05:00
init_signals();
init_environment();
nest_stacks();
call(userenv[BOOT_ENV]);
gc_off = false;
2004-11-22 19:15:14 -05:00
}
INLINE bool factor_arg(const char* str, const char* arg, CELL* value)
{
int val;
if(sscanf(str,arg,&val))
{
*value = val;
return true;
}
else
return false;
}
void init_factor_from_args(int argc, char **argv)
2004-07-16 02:26:21 -04:00
{
F_PARAMETERS p;
default_parameters(&p);
CELL i;
2004-07-16 02:26:21 -04:00
for(i = 1; i < argc; i++)
{
if(factor_arg(argv[i],"-datastack=%d",&p.ds_size));
else if(factor_arg(argv[i],"-retainstack=%d",&p.rs_size));
else if(factor_arg(argv[i],"-callstack=%d",&p.cs_size));
else if(factor_arg(argv[i],"-generations=%d",&p.gen_count));
else if(factor_arg(argv[i],"-young=%d",&p.young_size));
else if(factor_arg(argv[i],"-aging=%d",&p.aging_size));
else if(factor_arg(argv[i],"-codeheap=%d",&p.code_size));
else if(strcmp(argv[i],"-securegc") == 0)
p.secure_gc = true;
else if(strncmp(argv[i],"-i=",3) == 0)
p.image = argv[i] + 3;
}
/* Kilobytes */
p.ds_size = align_page(p.ds_size << 10);
p.rs_size = align_page(p.rs_size << 10);
p.cs_size = align_page(p.cs_size << 10);
2005-09-24 15:21:17 -04:00
/* Megabytes */
p.young_size <<= 20;
p.aging_size <<= 20;
p.code_size <<= 20;
2004-08-13 01:38:15 -04:00
init_factor(&p);
2006-10-31 16:45:12 -05:00
F_ARRAY *args = allot_array(ARRAY_TYPE,argc,F);
2006-10-31 16:45:12 -05:00
for(i = 1; i < argc; i++)
{
2006-10-31 16:45:12 -05:00
REGISTER_ARRAY(args);
CELL arg = tag_object(from_char_string(argv[i]));
UNREGISTER_ARRAY(args);
2006-11-02 03:00:02 -05:00
set_array_nth(args,i,arg);
}
2006-05-15 00:03:55 -04:00
userenv[ARGS_ENV] = tag_object(args);
userenv[EXECUTABLE_ENV] = tag_object(from_char_string(argv[0]));
}
int main(int argc, char **argv)
{
init_factor_from_args(argc,argv);
2006-10-15 00:10:54 -04:00
run_toplevel();
2004-07-16 02:26:21 -04:00
return 0;
}