diff --git a/src/mzscheme/src/env.c b/src/mzscheme/src/env.c index 9b01a0f8de..29994d9d25 100644 --- a/src/mzscheme/src/env.c +++ b/src/mzscheme/src/env.c @@ -177,7 +177,7 @@ static void init_compile_data(Scheme_Comp_Env *env); #define COMPILE_DATA(e) (&((Scheme_Full_Comp_Env *)e)->data) #define SCHEME_NON_SIMPLE_FRAME (SCHEME_NO_RENAME | SCHEME_CAPTURE_WITHOUT_RENAME \ - | SCHEME_FOR_STOPS | SCHEME_FOR_INTDEF | SCHEME_CAPTURE_LIFTED) + | SCHEME_FOR_STOPS | SCHEME_CAPTURE_LIFTED) #define ASSERT_IS_VARIABLE_BUCKET(b) /* if (((Scheme_Object *)b)->type != scheme_variable_type) abort() */ diff --git a/src/mzscheme/src/mzmark.c b/src/mzscheme/src/mzmark.c index 3eb6f6027b..f77e6ca995 100644 --- a/src/mzscheme/src/mzmark.c +++ b/src/mzscheme/src/mzmark.c @@ -5286,6 +5286,7 @@ static int lex_rib_MARK(void *p) { gcMARK(rib->rename); gcMARK(rib->timestamp); gcMARK(rib->sealed); + gcMARK(rib->mapped_names); gcMARK(rib->next); return gcBYTES_TO_WORDS(sizeof(Scheme_Lexical_Rib)); @@ -5296,6 +5297,7 @@ static int lex_rib_FIXUP(void *p) { gcFIXUP(rib->rename); gcFIXUP(rib->timestamp); gcFIXUP(rib->sealed); + gcFIXUP(rib->mapped_names); gcFIXUP(rib->next); return gcBYTES_TO_WORDS(sizeof(Scheme_Lexical_Rib)); diff --git a/src/mzscheme/src/mzmarksrc.c b/src/mzscheme/src/mzmarksrc.c index 891c15a51c..f763992a58 100644 --- a/src/mzscheme/src/mzmarksrc.c +++ b/src/mzscheme/src/mzmarksrc.c @@ -2164,6 +2164,7 @@ lex_rib { gcMARK(rib->rename); gcMARK(rib->timestamp); gcMARK(rib->sealed); + gcMARK(rib->mapped_names); gcMARK(rib->next); size: gcBYTES_TO_WORDS(sizeof(Scheme_Lexical_Rib)); diff --git a/src/mzscheme/src/stxobj.c b/src/mzscheme/src/stxobj.c index ba28392ccb..87752942a1 100644 --- a/src/mzscheme/src/stxobj.c +++ b/src/mzscheme/src/stxobj.c @@ -213,6 +213,7 @@ typedef struct Scheme_Lexical_Rib { Scheme_Object *rename; /* a vector for a lexical rename */ Scheme_Object *timestamp; int *sealed; + Scheme_Object *mapped_names; /* only in the initial link; int or hash table */ struct Scheme_Lexical_Rib *next; } Scheme_Lexical_Rib; @@ -1168,6 +1169,8 @@ void scheme_add_rib_rename(Scheme_Object *ro, Scheme_Object *rename) { Scheme_Lexical_Rib *rib, *naya; Scheme_Object *next; + Scheme_Hash_Table *mapped_names; + int i; naya = MALLOC_ONE_TAGGED(Scheme_Lexical_Rib); naya->so.type = scheme_lexical_rib_type; @@ -1186,6 +1189,31 @@ void scheme_add_rib_rename(Scheme_Object *ro, Scheme_Object *rename) SCHEME_CDR(unsealed_dependencies) = NULL; unsealed_dependencies = next; } + + if (!rib->mapped_names) + rib->mapped_names = scheme_make_integer(1); + else if (SCHEME_INTP(rib->mapped_names)) { + rib->mapped_names = scheme_make_integer(SCHEME_INT_VAL(rib->mapped_names) + 1); + if (SCHEME_INT_VAL(rib->mapped_names) > 32) { + /* Build the initial table */ + mapped_names = scheme_make_hash_table(SCHEME_hash_ptr); + while (naya) { + for (i = SCHEME_RENAME_LEN(naya->rename); i--; ) { + scheme_hash_set(mapped_names, + SCHEME_STX_SYM(SCHEME_VEC_ELS(naya->rename)[2+i]), + scheme_true); + } + naya = naya->next; + } + rib->mapped_names = (Scheme_Object *)mapped_names; + } + } else { + for (i = SCHEME_RENAME_LEN(naya->rename); i--; ) { + scheme_hash_set((Scheme_Hash_Table *)rib->mapped_names, + SCHEME_STX_SYM(SCHEME_VEC_ELS(naya->rename)[2+i]), + scheme_true); + } + } } void scheme_drop_first_rib_rename(Scheme_Object *ro) @@ -4747,7 +4775,12 @@ static Scheme_Object *resolve_env(WRAP_POS *_wraps, } else { recur_skip_ribs = add_skip_set(rib->timestamp, recur_skip_ribs); did_rib = rib; - rib = rib->next; /* First rib record has no rename */ + if (rib->mapped_names + && !SCHEME_INTP(rib->mapped_names) + && !scheme_hash_get((Scheme_Hash_Table *)rib->mapped_names, SCHEME_STX_VAL(a))) + rib = NULL; /* no need to check individual renames */ + else + rib = rib->next; /* First rib record has no rename */ } } else rib = NULL; @@ -4952,7 +4985,13 @@ static Scheme_Object *get_module_src_name(Scheme_Object *a, Scheme_Object *orig_ rename = WRAP_POS_FIRST(wraps); if (SCHEME_RIBP(rename)) { - rib = ((Scheme_Lexical_Rib *)rename)->next; + rib = (Scheme_Lexical_Rib *)rename; + if (rib->mapped_names + && !SCHEME_INTP(rib->mapped_names) + && !scheme_hash_get((Scheme_Hash_Table *)rib->mapped_names, SCHEME_STX_VAL(a))) + rib = NULL; /* no need to check individual renames */ + else + rib = rib->next; rename = NULL; } else { rib = NULL;