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 *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,16 +2439,19 @@ 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]))) {
|
||||||
esym = frame->values[i];
|
prop = scheme_stx_property(frame->values[i], unshadowable_symbol, NULL);
|
||||||
env_marks = scheme_stx_extract_marks(esym);
|
if (SCHEME_FALSEP(prop)) {
|
||||||
if (scheme_equal(env_marks, sym_marks)) {
|
esym = frame->values[i];
|
||||||
sym = esym;
|
env_marks = scheme_stx_extract_marks(esym);
|
||||||
if (frame->uids)
|
if (scheme_equal(env_marks, sym_marks)) {
|
||||||
uid = frame->uids[i];
|
sym = esym;
|
||||||
else
|
if (frame->uids)
|
||||||
uid = frame->uid;
|
uid = frame->uids[i];
|
||||||
break;
|
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),
|
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];
|
||||||
env_marks = scheme_stx_extract_marks(esym);
|
prop = scheme_stx_property(esym, unshadowable_symbol, NULL);
|
||||||
if (scheme_equal(env_marks, sym_marks)) { /* This used to have 1 || --- why? */
|
if (SCHEME_FALSEP(prop)) {
|
||||||
sym = esym;
|
env_marks = scheme_stx_extract_marks(esym);
|
||||||
if (COMPILE_DATA(frame)->const_uids)
|
if (scheme_equal(env_marks, sym_marks)) { /* This used to have 1 || --- why? */
|
||||||
uid = COMPILE_DATA(frame)->const_uids[i];
|
sym = esym;
|
||||||
else
|
if (COMPILE_DATA(frame)->const_uids)
|
||||||
uid = frame->uid;
|
uid = COMPILE_DATA(frame)->const_uids[i];
|
||||||
break;
|
else
|
||||||
}
|
uid = frame->uid;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue
Block a user