fix incorrect sharing of submodule-declaration tables

Cuts the peak memory use of

 racket -c -l match

from 1.2 GB to 400 MB on a 64-bit machine.
This commit is contained in:
Matthew Flatt 2014-04-21 14:53:23 -06:00
parent 7f8f8c0b59
commit 6856e5253f
3 changed files with 8 additions and 6 deletions

View File

@ -937,14 +937,15 @@ static Scheme_Env *make_env(Scheme_Env *base, int toplevel_size)
}
Scheme_Env *
scheme_new_module_env(Scheme_Env *env, Scheme_Module *m, int new_exp_module_tree)
scheme_new_module_env(Scheme_Env *env, Scheme_Module *m,
int new_exp_module_tree, int new_pre_registry)
{
Scheme_Env *menv;
Scheme_Module_Registry *reg;
menv = make_env(env, 7);
if (new_exp_module_tree && !menv->module_pre_registry) {
if (new_pre_registry) {
/* pre_registry is for declarations to be used by submodules */
reg = MALLOC_ONE_TAGGED(Scheme_Module_Registry);
reg->so.type = scheme_module_registry_type;

View File

@ -5332,7 +5332,7 @@ static Scheme_Env *instantiate_module(Scheme_Module *m, Scheme_Env *env, int res
scheme_write_to_string(m->modname, NULL));
/* printf("new %ld %s\n", env->phase, scheme_write_to_string(m->modname, NULL)); */
menv = scheme_new_module_env(env, m, 0);
menv = scheme_new_module_env(env, m, 0, 0);
scheme_hash_set(MODCHAIN_TABLE(env->modchain), m->modname, (Scheme_Object *)menv);
running = (char *)scheme_malloc_atomic(menv->module->num_phases);
@ -5975,7 +5975,7 @@ Scheme_Env *scheme_primitive_module(Scheme_Object *name, Scheme_Env *for_env)
m->predefined = scheme_starting_up;
m->phaseless = scheme_true;
env = scheme_new_module_env(for_env, m, 0);
env = scheme_new_module_env(for_env, m, 0, 0);
if (!scheme_defining_primitives) {
config = scheme_current_config();
@ -7295,7 +7295,7 @@ static Scheme_Object *do_module(Scheme_Object *form, Scheme_Comp_Env *env,
/* Create module environment. This environment gets a fresh table
for phase-1 instances: */
menv = scheme_new_module_env(top_env, m, 1);
menv = scheme_new_module_env(top_env, m, 1, SCHEME_NULLP(submodule_ancestry));
menv->disallow_unbound = 1;

View File

@ -3478,7 +3478,8 @@ Scheme_Object *scheme_sys_wraps_phase(Scheme_Object *phase);
THREAD_LOCAL_DECL(extern Scheme_Bucket_Table *scheme_module_code_cache);
Scheme_Object *scheme_module_execute(Scheme_Object *data, Scheme_Env *genv);
Scheme_Env *scheme_new_module_env(Scheme_Env *env, Scheme_Module *m, int new_exp_module_tree);
Scheme_Env *scheme_new_module_env(Scheme_Env *env, Scheme_Module *m,
int new_exp_module_tree, int new_pre_registry);
int scheme_is_module_env(Scheme_Comp_Env *env);
Scheme_Object *scheme_module_resolve(Scheme_Object *modidx, int load_it);