add partial #%linklet primitive module

The `#%linklet` module is intended to eventually provide
a simplified compiler for the core Racket language. For
now, it provides minimal hooks for bootstrapping an
expander implementation.
This commit is contained in:
Matthew Flatt 2016-06-22 11:59:18 -06:00
parent 22d397cfe1
commit 4a1afa66c8
8 changed files with 94 additions and 11 deletions

View File

@ -12,7 +12,7 @@
(define collection 'multi)
(define version "6.5.0.6")
(define version "6.5.0.7")
(define deps `("racket-lib"
["racket" #:version ,version]))

View File

@ -1522,7 +1522,7 @@
SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,53,46,48,46,54,84,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,17,0,0,0,1,0,0,8,0,18,0,
24,0,38,0,52,0,64,0,84,0,98,0,113,0,126,0,131,0,135,0,147,
0,231,0,238,0,8,1,0,0,199,1,0,0,3,1,5,105,110,115,112,48,
0,231,0,238,0,8,1,0,0,214,1,0,0,3,1,5,105,110,115,112,48,
71,35,37,98,117,105,108,116,105,110,67,113,117,111,116,101,29,94,2,3,70,
35,37,107,101,114,110,101,108,11,29,94,2,3,70,35,37,101,120,112,111,98,
115,11,29,94,2,3,68,35,37,98,111,111,116,11,29,94,2,3,76,35,37,
@ -1539,11 +1539,12 @@
56,9,2,2,2,2,29,11,11,11,11,11,11,11,9,9,11,11,11,33,16,
40,80,143,39,39,20,122,145,2,1,39,16,0,16,0,40,42,39,16,0,39,
16,0,39,11,11,11,16,0,16,0,16,0,39,39,40,12,11,11,16,0,16,
0,16,0,39,39,11,12,11,11,16,0,16,0,16,0,39,39,16,0,104,2,
0,16,0,39,39,11,12,11,11,16,0,16,0,16,0,39,39,16,0,105,2,
4,2,5,29,94,2,3,71,35,37,102,111,114,101,105,103,110,11,29,94,2,
3,70,35,37,117,110,115,97,102,101,11,29,94,2,3,71,35,37,102,108,102,
120,110,117,109,11,2,6,2,7,2,8,2,9,2,10,29,94,2,3,69,35,
37,112,108,97,99,101,11,29,94,2,3,71,35,37,102,117,116,117,114,101,115,
11,9,9,9,39,9,0};
EVAL_ONE_SIZED_STR((char *)expr, 531);
11,29,94,2,3,71,35,37,108,105,110,107,108,101,116,11,9,9,9,39,9,
0};
EVAL_ONE_SIZED_STR((char *)expr, 546);
}

View File

@ -571,6 +571,7 @@ static Scheme_Env *place_instance_init(void *stack_base, int initial_main_os_thr
scheme_init_error_config();
/* BEGIN PRIMITIVE MODULES */
scheme_init_linklet(env);
#ifndef NO_TCP_SUPPORT
scheme_init_network(env);
#endif

View File

@ -944,6 +944,85 @@ static Scheme_Module *registry_get_loaded(Scheme_Env *env, Scheme_Object *name)
return (Scheme_Module *)scheme_hash_get(env->module_registry->loaded, name);
}
/**********************************************************************/
/* linklets and instances */
/**********************************************************************/
/* A minimal linklet API to support bootstrapping. */
static Scheme_Object *get_primitive_instance(int argc, Scheme_Object *argv[]);
static Scheme_Object *instance_variable_value(int argc, Scheme_Object *argv[]);
static Scheme_Object *instance_set_variable_value(int argc, Scheme_Object *argv[]);
void scheme_init_linklet(Scheme_Env *env)
{
Scheme_Env *newenv;
Scheme_Object *modname;
modname = scheme_intern_symbol("#%linklet");
newenv = scheme_primitive_module(modname, env);
GLOBAL_PRIM_W_ARITY("get-primitive-instance", get_primitive_instance, 1, 2, newenv);
GLOBAL_PRIM_W_ARITY("instance-variable-value", instance_variable_value, 2, 2, newenv);
GLOBAL_PRIM_W_ARITY("instance-set-variable-value!", instance_set_variable_value, 3, 3, newenv);
scheme_finish_primitive_module(newenv);
scheme_protect_primitive_provide(newenv, NULL);
}
static Scheme_Object *get_primitive_instance(int argc, Scheme_Object *argv[])
{
Scheme_Env *env, *menv;
Scheme_Object *name;
if (!SCHEME_SYMBOLP(argv[0]))
scheme_wrong_contract("get-primitive-instance", "symbol?", 0, argc, argv);
name = scheme_intern_resolved_module_path(argv[0]);
env = scheme_get_env(NULL);
menv = get_special_modenv(name);
if (!menv)
menv = (Scheme_Env *)scheme_hash_get(MODCHAIN_TABLE(env->modchain), name);
if (!menv && (argc > 1) && SCHEME_TRUEP(argv[1])) {
menv = scheme_primitive_module(argv[0], env);
scheme_finish_primitive_module(menv);
start_module(menv->module, env, 0, name, 0, 1, 0, scheme_null, 0);
}
return (menv ? (Scheme_Object *)menv : scheme_false);
}
static Scheme_Object *instance_variable_value(int argc, Scheme_Object *argv[])
{
Scheme_Object *v;
if (!SCHEME_NAMESPACEP(argv[0]))
scheme_wrong_contract("instance-variable-value", "namespace?", 0, argc, argv);
if (!SCHEME_SYMBOLP(argv[1]))
scheme_wrong_contract("instance-variable-value", "symbol?", 1, argc, argv);
v = scheme_lookup_global(argv[1], (Scheme_Env *)argv[0]);
return (v ? v : scheme_false);
}
static Scheme_Object *instance_set_variable_value(int argc, Scheme_Object *argv[])
{
Scheme_Bucket *bucket;
if (!SCHEME_NAMESPACEP(argv[0]))
scheme_wrong_contract("instance-set-variable-value!", "namespace?", 0, argc, argv);
if (!SCHEME_SYMBOLP(argv[1]))
scheme_wrong_contract("instance-set-variable-value!", "symbol?", 1, argc, argv);
bucket = scheme_global_bucket(argv[1], (Scheme_Env *)argv[0]);
scheme_set_global_bucket("instance-set-variable-value!", bucket, argv[2], 1);
return scheme_void;
}
/**********************************************************************/
/* parameters */
/**********************************************************************/

View File

@ -399,7 +399,8 @@ void scheme_init_futures(Scheme_Env *env);
void scheme_init_futures_once();
void scheme_init_futures_per_place();
void scheme_end_futures_per_place();
void scheme_init_linklet(Scheme_Env *env);
void scheme_init_print_buffers_places(void);
void scheme_init_string_places(void);
void scheme_init_thread_places(void);

View File

@ -13,12 +13,12 @@
consistently.)
*/
#define MZSCHEME_VERSION "6.5.0.6"
#define MZSCHEME_VERSION "6.5.0.7"
#define MZSCHEME_VERSION_X 6
#define MZSCHEME_VERSION_Y 5
#define MZSCHEME_VERSION_Z 0
#define MZSCHEME_VERSION_W 6
#define MZSCHEME_VERSION_W 7
#define MZSCHEME_VERSION_MAJOR ((MZSCHEME_VERSION_X * 100) + MZSCHEME_VERSION_Y)
#define MZSCHEME_VERSION_MINOR ((MZSCHEME_VERSION_Z * 1000) + MZSCHEME_VERSION_W)

View File

@ -1485,5 +1485,6 @@
" '#%network"
" '#%utils"
"(only '#%place)"
"(only '#%futures)))"
"(only '#%futures)"
"(only '#%linklet)))"
);

View File

@ -1683,5 +1683,5 @@
'#%network
'#%utils
(only '#%place)
(only '#%futures)))
(only '#%futures)
(only '#%linklet)))