share modidx for module imported into multiple phases

This commit is contained in:
Matthew Flatt 2011-07-08 20:34:39 -06:00
parent 50bd06af9a
commit 9e694ce5cb

View File

@ -219,7 +219,8 @@ static void parse_requires(Scheme_Object *form,
Scheme_Object *redef_modname, Scheme_Object *redef_modname,
int unpack_kern, int copy_vars, int can_save_marshal, int unpack_kern, int copy_vars, int can_save_marshal,
int eval_exp, int eval_run, int eval_exp, int eval_run,
int *all_simple); int *all_simple,
Scheme_Hash_Table *modix_cache);
static void parse_provides(Scheme_Object *form, Scheme_Object *fst, Scheme_Object *e, static void parse_provides(Scheme_Object *form, Scheme_Object *fst, Scheme_Object *e,
Scheme_Hash_Table *all_provided, Scheme_Hash_Table *all_provided,
Scheme_Hash_Table *all_reprovided, Scheme_Hash_Table *all_reprovided,
@ -1183,7 +1184,7 @@ static Scheme_Object *do_namespace_require(Scheme_Env *env, int argc, Scheme_Obj
NULL, NULL,
1, copy, 0, 1, copy, 0,
(etonly ? 1 : -1), !etonly, (etonly ? 1 : -1), !etonly,
NULL); NULL, NULL);
scheme_append_rename_set_to_env(rns, env); scheme_append_rename_set_to_env(rns, env);
@ -5943,7 +5944,7 @@ Scheme_Object *scheme_parse_lifted_require(Scheme_Object *module_path,
redef_modname, redef_modname,
0, 0, 1, 0, 0, 1,
1, 0, 1, 0,
all_simple); all_simple, NULL);
return e; return e;
} }
@ -6017,6 +6018,7 @@ static Scheme_Object *do_module_begin(Scheme_Object *orig_form, Scheme_Comp_Env
int maybe_has_lifts = 0; int maybe_has_lifts = 0;
Scheme_Object *redef_modname; Scheme_Object *redef_modname;
Scheme_Object *observer; Scheme_Object *observer;
Scheme_Hash_Table *modidx_cache;
form = scheme_stx_taint_disarm(orig_form, NULL); form = scheme_stx_taint_disarm(orig_form, NULL);
@ -6095,6 +6097,7 @@ static Scheme_Object *do_module_begin(Scheme_Object *orig_form, Scheme_Comp_Env
/* Put initial requires into the table: /* Put initial requires into the table:
(This is redundant for the rename set, but we need to fill (This is redundant for the rename set, but we need to fill
the `all_requires' table, etc.) */ the `all_requires' table, etc.) */
modidx_cache = scheme_make_hash_table_equal();
{ {
Scheme_Module *iim; Scheme_Module *iim;
Scheme_Object *nmidx, *orig_src; Scheme_Object *nmidx, *orig_src;
@ -6113,6 +6116,8 @@ static Scheme_Object *do_module_begin(Scheme_Object *orig_form, Scheme_Comp_Env
iim, nmidx, iim, nmidx,
scheme_make_integer(0), scheme_make_integer(0),
NULL, 1); NULL, 1);
scheme_hash_set(modidx_cache, ((Scheme_Modidx *)nmidx)->path, nmidx);
} }
{ {
@ -6491,7 +6496,7 @@ static Scheme_Object *do_module_begin(Scheme_Object *orig_form, Scheme_Comp_Env
redef_modname, redef_modname,
0, 0, 1, 0, 0, 1,
1, 0, 1, 0,
all_simple_renames); all_simple_renames, modidx_cache);
if (rec[drec].comp) if (rec[drec].comp)
e = NULL; e = NULL;
@ -8763,7 +8768,8 @@ void parse_requires(Scheme_Object *form,
Scheme_Object *redef_modname, Scheme_Object *redef_modname,
int unpack_kern, int copy_vars, int can_save_marshal, int unpack_kern, int copy_vars, int can_save_marshal,
int eval_exp, int eval_run, int eval_exp, int eval_run,
int *all_simple) int *all_simple,
Scheme_Hash_Table *modidx_cache)
{ {
Scheme_Object *ll = form, *mode = scheme_make_integer(0), *just_mode = NULL, *x_mode, *x_just_mode; Scheme_Object *ll = form, *mode = scheme_make_integer(0), *just_mode = NULL, *x_mode, *x_just_mode;
Scheme_Module *m; Scheme_Module *m;
@ -9052,9 +9058,16 @@ void parse_requires(Scheme_Object *form,
rename_env = env; rename_env = env;
} }
idx = scheme_make_modidx(scheme_syntax_to_datum(idxstx, 0, NULL), name = scheme_syntax_to_datum(idxstx, 0, NULL);
base_modidx, if (modidx_cache)
scheme_false); idx = scheme_hash_get(modidx_cache, name);
else
idx = NULL;
if (!idx) {
idx = scheme_make_modidx(name, base_modidx, scheme_false);
if (modidx_cache)
scheme_hash_set(modidx_cache, name, idx);
}
name = _module_resolve(idx, idxstx, NULL, 1); name = _module_resolve(idx, idxstx, NULL, 1);
@ -9210,7 +9223,7 @@ do_require_execute(Scheme_Env *env, Scheme_Object *form)
NULL, NULL,
!env->module, 0, 0, !env->module, 0, 0,
-1, 1, -1, 1,
NULL); NULL, NULL);
scheme_append_rename_set_to_env(rn_set, env); scheme_append_rename_set_to_env(rn_set, env);
@ -9265,7 +9278,7 @@ static Scheme_Object *do_require(Scheme_Object *form, Scheme_Comp_Env *env,
NULL, NULL,
0, 0, 0, 0, 0, 0,
1, 0, 1, 0,
NULL); NULL, NULL);
if (rec && rec[drec].comp) { if (rec && rec[drec].comp) {
/* Dummy lets us access a top-level environment: */ /* Dummy lets us access a top-level environment: */