2019-10-18 09:05:08 -04:00
|
|
|
#include "master.h"
|
2004-07-16 02:26:21 -04:00
|
|
|
|
2019-10-18 09:05:06 -04:00
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
2006-11-01 00:20:49 -05:00
|
|
|
/* Get things started */
|
2019-10-18 09:05:06 -04:00
|
|
|
void init_factor(F_PARAMETERS *p)
|
2004-11-22 19:15:14 -05:00
|
|
|
{
|
2019-10-18 09:05:08 -04:00
|
|
|
/* 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);
|
|
|
|
|
|
|
|
|
|
/* Megabytes */
|
|
|
|
|
p->young_size <<= 20;
|
|
|
|
|
p->aging_size <<= 20;
|
|
|
|
|
p->code_size <<= 20;
|
|
|
|
|
|
2019-10-18 09:05:06 -04:00
|
|
|
gc_off = true;
|
|
|
|
|
|
|
|
|
|
early_init();
|
|
|
|
|
|
|
|
|
|
if(p->image == NULL)
|
|
|
|
|
p->image = default_image_path();
|
|
|
|
|
|
2006-10-17 02:44:05 -04:00
|
|
|
srand(current_millis());
|
2019-10-18 09:05:06 -04:00
|
|
|
init_primitives();
|
2005-04-30 00:43:39 -04:00
|
|
|
init_ffi();
|
2019-10-18 09:05:06 -04:00
|
|
|
init_stacks(p->ds_size,p->rs_size,p->cs_size);
|
|
|
|
|
load_image(p);
|
2005-04-22 20:09:46 -04:00
|
|
|
init_c_io();
|
2004-11-22 19:15:14 -05:00
|
|
|
init_signals();
|
2019-10-18 09:05:08 -04:00
|
|
|
|
|
|
|
|
stack_chain = NULL;
|
|
|
|
|
|
|
|
|
|
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));
|
|
|
|
|
|
2019-10-18 09:05:06 -04:00
|
|
|
gc_off = false;
|
2004-11-22 19:15:14 -05:00
|
|
|
}
|
|
|
|
|
|
2005-03-27 01:52:13 -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;
|
|
|
|
|
}
|
|
|
|
|
|
2019-10-18 09:05:08 -04:00
|
|
|
void init_factor_from_args(F_CHAR *image, int argc, char **argv, bool embedded)
|
2004-07-16 02:26:21 -04:00
|
|
|
{
|
2019-10-18 09:05:06 -04:00
|
|
|
F_PARAMETERS p;
|
|
|
|
|
default_parameters(&p);
|
2004-08-22 01:46:26 -04:00
|
|
|
|
2019-10-18 09:05:08 -04:00
|
|
|
if(image) p.image = image;
|
|
|
|
|
|
2019-10-18 09:05:06 -04:00
|
|
|
CELL i;
|
2004-07-16 02:26:21 -04:00
|
|
|
|
2005-03-27 01:52:13 -05:00
|
|
|
for(i = 1; i < argc; i++)
|
|
|
|
|
{
|
2019-10-18 09:05:06 -04:00
|
|
|
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)
|
2019-10-18 09:05:08 -04:00
|
|
|
p.image = char_to_F_CHAR((char*)argv[i] + 3);
|
2005-03-27 01:52:13 -05:00
|
|
|
}
|
|
|
|
|
|
2019-10-18 09:05:06 -04:00
|
|
|
init_factor(&p);
|
2006-10-31 16:45:12 -05:00
|
|
|
|
2019-10-18 09:05:06 -04:00
|
|
|
F_ARRAY *args = allot_array(ARRAY_TYPE,argc,F);
|
2006-10-31 16:45:12 -05:00
|
|
|
|
2019-10-18 09:05:06 -04:00
|
|
|
for(i = 1; i < argc; i++)
|
2004-08-22 01:46:26 -04:00
|
|
|
{
|
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);
|
2004-08-22 01:46:26 -04:00
|
|
|
}
|
|
|
|
|
|
2006-05-15 00:03:55 -04:00
|
|
|
userenv[ARGS_ENV] = tag_object(args);
|
2019-10-18 09:05:06 -04:00
|
|
|
userenv[EXECUTABLE_ENV] = tag_object(from_char_string(argv[0]));
|
2019-10-18 09:05:08 -04:00
|
|
|
userenv[EMBEDDED_ENV] = (embedded ? T : F);
|
|
|
|
|
|
|
|
|
|
nest_stacks();
|
|
|
|
|
call(userenv[BOOT_ENV]);
|
|
|
|
|
run_toplevel();
|
|
|
|
|
unnest_stacks();
|
2019-10-18 09:05:06 -04:00
|
|
|
}
|
2004-08-22 01:46:26 -04:00
|
|
|
|
2019-10-18 09:05:08 -04:00
|
|
|
char *factor_eval_string(char *string)
|
2019-10-18 09:05:06 -04:00
|
|
|
{
|
2019-10-18 09:05:08 -04:00
|
|
|
char* (*callback)(char*) = alien_offset(userenv[EVAL_CALLBACK_ENV]);
|
|
|
|
|
return callback(string);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void factor_eval_free(char *result)
|
|
|
|
|
{
|
|
|
|
|
free(result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void factor_yield(void)
|
|
|
|
|
{
|
|
|
|
|
void (*callback)() = alien_offset(userenv[YIELD_CALLBACK_ENV]);
|
|
|
|
|
callback();
|
2004-07-16 02:26:21 -04:00
|
|
|
}
|