restore incorrectly removed code

But fix its interaction with places and GC, allocating the symbol
on startup instead of per-place.
This commit is contained in:
Matthew Flatt 2012-12-21 16:06:41 -07:00
parent a665239689
commit 7ff6fd93ef
3 changed files with 37 additions and 20 deletions

View File

@ -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 *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 *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: */ /* If locked, these are probably sharable: */
THREAD_LOCAL_DECL(static Scheme_Hash_Table *toplevels_ht); THREAD_LOCAL_DECL(static Scheme_Hash_Table *toplevels_ht);
THREAD_LOCAL_DECL(static Scheme_Hash_Table *locals_ht[2]); 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 */ /* 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_Object *scheme_find_local_shadower(Scheme_Object *sym, Scheme_Object *sym_marks, Scheme_Comp_Env *env)
{ {
Scheme_Comp_Env *frame; 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 /* Walk backward through the frames, looking for a renaming binding
with the same marks as the given identifier, sym. Skip over with the same marks as the given identifier, sym. Skip over
@ -2431,6 +2439,8 @@ Scheme_Object *scheme_find_local_shadower(Scheme_Object *sym, Scheme_Object *sym
for (i = frame->num_bindings; i--; ) { for (i = frame->num_bindings; i--; ) {
if (frame->values[i]) { if (frame->values[i]) {
if (SAME_OBJ(SCHEME_STX_VAL(sym), SCHEME_STX_VAL(frame->values[i]))) { if (SAME_OBJ(SCHEME_STX_VAL(sym), SCHEME_STX_VAL(frame->values[i]))) {
prop = scheme_stx_property(frame->values[i], unshadowable_symbol, NULL);
if (SCHEME_FALSEP(prop)) {
esym = frame->values[i]; esym = frame->values[i];
env_marks = scheme_stx_extract_marks(esym); env_marks = scheme_stx_extract_marks(esym);
if (scheme_equal(env_marks, sym_marks)) { if (scheme_equal(env_marks, sym_marks)) {
@ -2444,6 +2454,7 @@ Scheme_Object *scheme_find_local_shadower(Scheme_Object *sym, Scheme_Object *sym
} }
} }
} }
}
if (uid) if (uid)
break; break;
@ -2453,6 +2464,8 @@ Scheme_Object *scheme_find_local_shadower(Scheme_Object *sym, Scheme_Object *sym
if (SAME_OBJ(SCHEME_STX_VAL(sym), if (SAME_OBJ(SCHEME_STX_VAL(sym),
SCHEME_STX_VAL(COMPILE_DATA(frame)->const_names[i]))) { SCHEME_STX_VAL(COMPILE_DATA(frame)->const_names[i]))) {
esym = COMPILE_DATA(frame)->const_names[i]; esym = COMPILE_DATA(frame)->const_names[i];
prop = scheme_stx_property(esym, unshadowable_symbol, NULL);
if (SCHEME_FALSEP(prop)) {
env_marks = scheme_stx_extract_marks(esym); env_marks = scheme_stx_extract_marks(esym);
if (scheme_equal(env_marks, sym_marks)) { /* This used to have 1 || --- why? */ if (scheme_equal(env_marks, sym_marks)) { /* This used to have 1 || --- why? */
sym = esym; sym = esym;
@ -2466,6 +2479,7 @@ Scheme_Object *scheme_find_local_shadower(Scheme_Object *sym, Scheme_Object *sym
} }
} }
} }
}
if (uid) if (uid)
break; break;
} }

View File

@ -282,6 +282,8 @@ Scheme_Env *scheme_engine_instance_init()
scheme_init_logging_once(); scheme_init_logging_once();
scheme_init_compenv_symbol();
#if defined(MZ_PLACES_WAITPID) #if defined(MZ_PLACES_WAITPID)
scheme_places_start_child_signal_handler(); scheme_places_start_child_signal_handler();
#endif #endif

View File

@ -307,6 +307,7 @@ void scheme_init_paramz(Scheme_Env *env);
void scheme_init_parameterization(); void scheme_init_parameterization();
void scheme_init_getenv(void); void scheme_init_getenv(void);
void scheme_init_inspector(void); void scheme_init_inspector(void);
void scheme_init_compenv_symbol(void);
#ifndef DONT_USE_FOREIGN #ifndef DONT_USE_FOREIGN
void scheme_init_foreign_globals(); void scheme_init_foreign_globals();