From d9cc602520d2d6d4a2b07d58913ce070c88187f6 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 3 May 2007 06:59:10 +0000 Subject: [PATCH] fix 3m GC interaction with mred -z svn: r6124 --- src/mred/mred.cxx | 40 ++++++++++++++++++++++----------------- src/mzscheme/src/salloc.c | 2 ++ 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/mred/mred.cxx b/src/mred/mred.cxx index 0c892513ef..1e4dca91d8 100644 --- a/src/mred/mred.cxx +++ b/src/mred/mred.cxx @@ -1055,7 +1055,12 @@ int mred_in_restricted_context() Scheme_Object *v; if (!scheme_current_thread) return 1; - v = scheme_extract_one_cc_mark(NULL, mred_het_key); + + if (mred_het_key) + v = scheme_extract_one_cc_mark(NULL, mred_het_key); + else + v = NULL; + if (v && SCHEME_BOX_VAL(v)) return 1; #endif @@ -1230,12 +1235,8 @@ static Scheme_Object *MrEdDoNextEvent(MrEdContext *c, wxDispatch_Check_Fun alt, #ifdef NEED_HET_PARAM /* see wxHiEventTrampoline for info on mred_het_key: */ - { - Scheme_Object *v; - v = scheme_extract_one_cc_mark(NULL, mred_het_key); - if (v && SCHEME_BOX_VAL(v)) - restricted = 1; - } + if (mred_in_restricted_context()) + restricted = 1; #endif if (alt) { @@ -1346,12 +1347,8 @@ int MrEdEventReady(MrEdContext *c) #ifdef NEED_HET_PARAM /* see wxHiEventTrampoline for info on mred_het_key: */ - { - Scheme_Object *v; - v = scheme_extract_one_cc_mark(NULL, mred_het_key); - if (v && SCHEME_BOX_VAL(v)) - restricted = 1; - } + if (mred_in_restricted_context()) + restricted = 1; #endif return (c->nested_avail @@ -2044,6 +2041,14 @@ static void MrEdQueueWindowCallback(wxWindow *wx_window, Scheme_Closed_Prim *scp Q_Callback *cb; Scheme_Object *p; + if (!scheme_current_thread) { + /* Scheme hasn't started yet, so call directly. + We might get here for an update to the stdio + window, for example. */ + scp(data, 0, NULL); + return; + } + #ifdef wx_mac c = MrEdGetContext(wx_window->GetRootFrame()); #else @@ -3286,10 +3291,6 @@ wxFrame *MrEdApp::OnInit(void) mred_eventspace_param = scheme_new_param(); mred_event_dispatch_param = scheme_new_param(); mred_ps_setup_param = scheme_new_param(); -#ifdef NEED_HET_PARAM - wxREGGLOB(mred_het_key); - mred_het_key = scheme_make_symbol("het"); /* uninterned */ -#endif wxInitSnips(); /* and snip classes */ @@ -3314,6 +3315,11 @@ wxFrame *MrEdApp::OnInit(void) 1, 0); #endif +#ifdef NEED_HET_PARAM + wxREGGLOB(mred_het_key); + mred_het_key = scheme_make_symbol("het"); /* uninterned */ +#endif + #ifdef MZ_PRECISE_GC mmc = (MrEdContext *)GC_malloc_one_tagged(sizeof(MrEdContext)); #else diff --git a/src/mzscheme/src/salloc.c b/src/mzscheme/src/salloc.c index 60537ffa78..0f349d750e 100644 --- a/src/mzscheme/src/salloc.c +++ b/src/mzscheme/src/salloc.c @@ -67,6 +67,8 @@ void scheme_set_stack_base(void *base, int no_auto_statics) scheme_pair_type, scheme_weak_box_type, scheme_ephemeron_type, scheme_rt_weak_array, scheme_cust_box_type); + /* We want to be able to allocate symbols early. */ + scheme_register_traversers(); #endif #if defined(MZ_PRECISE_GC) || defined(USE_SENORA_GC) GC_set_stack_base(base);