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:
parent
a665239689
commit
7ff6fd93ef
|
@ -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,6 +2439,8 @@ 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]))) {
|
||||
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)) {
|
||||
|
@ -2444,6 +2454,7 @@ Scheme_Object *scheme_find_local_shadower(Scheme_Object *sym, Scheme_Object *sym
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (uid)
|
||||
break;
|
||||
|
||||
|
@ -2453,6 +2464,8 @@ 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];
|
||||
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;
|
||||
|
@ -2466,6 +2479,7 @@ Scheme_Object *scheme_find_local_shadower(Scheme_Object *sym, Scheme_Object *sym
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (uid)
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue
Block a user