diff --git a/src/racket/src/compenv.c b/src/racket/src/compenv.c index 057d1a649f..9d6cff2ce3 100644 --- a/src/racket/src/compenv.c +++ b/src/racket/src/compenv.c @@ -31,6 +31,8 @@ READ_ONLY static Scheme_Object *scheme_local[MAX_CONST_LOCAL_POS][MAX_CONST_LOCAL_TYPES][MAX_CONST_LOCAL_FLAG_VAL + 1]; READ_ONLY static Scheme_Object *toplevels[MAX_CONST_TOPLEVEL_DEPTH][MAX_CONST_TOPLEVEL_POS][SCHEME_TOPLEVEL_FLAGS_MASK + 1]; +READ_ONLY static Scheme_Object *unshadowable_symbol; + /* If locked, these are probably sharable: */ THREAD_LOCAL_DECL(static Scheme_Hash_Table *toplevels_ht); THREAD_LOCAL_DECL(static Scheme_Hash_Table *locals_ht[2]); @@ -99,6 +101,12 @@ void scheme_init_compenv_places(void) } } +void scheme_init_compenv_symbol(void) +{ + REGISTER_SO(unshadowable_symbol); + unshadowable_symbol = scheme_intern_symbol("unshadowable"); +} + /*========================================================================*/ /* compilation info management */ /*========================================================================*/ @@ -2419,7 +2427,7 @@ Scheme_Object *scheme_namespace_lookup_value(Scheme_Object *sym, Scheme_Env *gen Scheme_Object *scheme_find_local_shadower(Scheme_Object *sym, Scheme_Object *sym_marks, Scheme_Comp_Env *env) { Scheme_Comp_Env *frame; - Scheme_Object *esym, *uid = NULL, *env_marks; + Scheme_Object *esym, *uid = NULL, *env_marks, *prop; /* Walk backward through the frames, looking for a renaming binding with the same marks as the given identifier, sym. Skip over @@ -2431,16 +2439,19 @@ Scheme_Object *scheme_find_local_shadower(Scheme_Object *sym, Scheme_Object *sym for (i = frame->num_bindings; i--; ) { if (frame->values[i]) { if (SAME_OBJ(SCHEME_STX_VAL(sym), SCHEME_STX_VAL(frame->values[i]))) { - esym = frame->values[i]; - env_marks = scheme_stx_extract_marks(esym); - if (scheme_equal(env_marks, sym_marks)) { - sym = esym; - if (frame->uids) - uid = frame->uids[i]; - else - uid = frame->uid; - break; - } + prop = scheme_stx_property(frame->values[i], unshadowable_symbol, NULL); + if (SCHEME_FALSEP(prop)) { + esym = frame->values[i]; + env_marks = scheme_stx_extract_marks(esym); + if (scheme_equal(env_marks, sym_marks)) { + sym = esym; + if (frame->uids) + uid = frame->uids[i]; + else + uid = frame->uid; + break; + } + } } } } @@ -2453,15 +2464,18 @@ Scheme_Object *scheme_find_local_shadower(Scheme_Object *sym, Scheme_Object *sym if (SAME_OBJ(SCHEME_STX_VAL(sym), SCHEME_STX_VAL(COMPILE_DATA(frame)->const_names[i]))) { esym = COMPILE_DATA(frame)->const_names[i]; - env_marks = scheme_stx_extract_marks(esym); - if (scheme_equal(env_marks, sym_marks)) { /* This used to have 1 || --- why? */ - sym = esym; - if (COMPILE_DATA(frame)->const_uids) - uid = COMPILE_DATA(frame)->const_uids[i]; - else - uid = frame->uid; - break; - } + prop = scheme_stx_property(esym, unshadowable_symbol, NULL); + if (SCHEME_FALSEP(prop)) { + env_marks = scheme_stx_extract_marks(esym); + if (scheme_equal(env_marks, sym_marks)) { /* This used to have 1 || --- why? */ + sym = esym; + if (COMPILE_DATA(frame)->const_uids) + uid = COMPILE_DATA(frame)->const_uids[i]; + else + uid = frame->uid; + break; + } + } } } } diff --git a/src/racket/src/env.c b/src/racket/src/env.c index dd4b12a6c5..77e1340878 100644 --- a/src/racket/src/env.c +++ b/src/racket/src/env.c @@ -282,6 +282,8 @@ Scheme_Env *scheme_engine_instance_init() scheme_init_logging_once(); + scheme_init_compenv_symbol(); + #if defined(MZ_PLACES_WAITPID) scheme_places_start_child_signal_handler(); #endif diff --git a/src/racket/src/schpriv.h b/src/racket/src/schpriv.h index 999a15904c..5488719165 100644 --- a/src/racket/src/schpriv.h +++ b/src/racket/src/schpriv.h @@ -307,6 +307,7 @@ void scheme_init_paramz(Scheme_Env *env); void scheme_init_parameterization(); void scheme_init_getenv(void); void scheme_init_inspector(void); +void scheme_init_compenv_symbol(void); #ifndef DONT_USE_FOREIGN void scheme_init_foreign_globals();