From 695039626ce5d3608f3d49bebcb1e262113c0754 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Sat, 7 May 2011 21:43:09 -0600 Subject: [PATCH] fixes for non-JIT build --- src/racket/src/compenv.c | 18 +++++++++-- src/racket/src/compile.c | 11 ++++++- src/racket/src/env.c | 26 +++++---------- src/racket/src/eval.c | 3 -- src/racket/src/jitprep.c | 68 +++++++++++++++++++++------------------- src/racket/src/schpriv.h | 3 ++ 6 files changed, 72 insertions(+), 57 deletions(-) diff --git a/src/racket/src/compenv.c b/src/racket/src/compenv.c index ebc5e50b1a..2892800f8b 100644 --- a/src/racket/src/compenv.c +++ b/src/racket/src/compenv.c @@ -36,8 +36,6 @@ 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]); -THREAD_LOCAL_DECL(static int intdef_counter); -THREAD_LOCAL_DECL(static int builtin_ref_counter); THREAD_LOCAL_DECL(static int env_uid_counter); #define ARBITRARY_USE 0x1 @@ -87,6 +85,22 @@ void scheme_init_compenv() #endif } +void scheme_init_compenv_places(void) +{ + REGISTER_SO(toplevels_ht); + REGISTER_SO(locals_ht[0]); + REGISTER_SO(locals_ht[1]); + + { + Scheme_Hash_Table *ht; + toplevels_ht = scheme_make_hash_table_equal(); + ht = scheme_make_hash_table(SCHEME_hash_ptr); + locals_ht[0] = ht; + ht = scheme_make_hash_table(SCHEME_hash_ptr); + locals_ht[1] = ht; + } +} + /*========================================================================*/ /* compilation info management */ /*========================================================================*/ diff --git a/src/racket/src/compile.c b/src/racket/src/compile.c index 504cf03abe..efcaee5c68 100644 --- a/src/racket/src/compile.c +++ b/src/racket/src/compile.c @@ -62,6 +62,8 @@ ROSYM static Scheme_Object *quote_symbol; ROSYM static Scheme_Object *letrec_syntaxes_symbol; ROSYM static Scheme_Object *values_symbol; +THREAD_LOCAL_DECL(static Scheme_Object *quick_stx); + /* locals */ static Scheme_Object *lambda_syntax(Scheme_Object *form, Scheme_Comp_Env *env, Scheme_Compile_Info *rec, int drec); static Scheme_Object *lambda_expand(Scheme_Object *form, Scheme_Comp_Env *env, Scheme_Expand_Info *erec, int drec); @@ -131,7 +133,7 @@ static void register_traversers(void); /* initialization */ /**********************************************************************/ -void scheme_init_syntax (Scheme_Env *env) +void scheme_init_compile (Scheme_Env *env) { #ifdef MZ_PRECISE_GC register_traversers(); @@ -299,6 +301,11 @@ void scheme_init_syntax (Scheme_Env *env) scheme_init_marshal(env); } +void scheme_init_compile_places() +{ + REGISTER_SO(quick_stx); +} + Scheme_Object * scheme_make_compiled_syntax(Scheme_Syntax *proc, Scheme_Syntax_Expander *eproc) @@ -1449,9 +1456,11 @@ Scheme_Object *scheme_unclose_case_lambda(Scheme_Object *expr, int mode) if (mode == 2) { /* sfs */ return (Scheme_Object *)cl2; +#ifdef MZ_USE_JIT } else if (mode == 1) { /* JIT */ return scheme_case_lambda_jit((Scheme_Object *)cl2); +#endif } else return (Scheme_Object *)cl2; } diff --git a/src/racket/src/env.c b/src/racket/src/env.c index a6de531eaf..d086d1c4c1 100644 --- a/src/racket/src/env.c +++ b/src/racket/src/env.c @@ -53,6 +53,9 @@ READ_ONLY static Scheme_Env *unsafe_env; READ_ONLY static Scheme_Env *flfxnum_env; READ_ONLY static Scheme_Env *futures_env; +THREAD_LOCAL_DECL(static int builtin_ref_counter); +THREAD_LOCAL_DECL(static int intdef_counter); + /* local functions */ static void make_kernel_env(void); @@ -217,22 +220,6 @@ Scheme_Env *scheme_basic_env() return env; } -static void init_toplevel_local_offsets_hashtable_caches() -{ - REGISTER_SO(toplevels_ht); - REGISTER_SO(locals_ht[0]); - REGISTER_SO(locals_ht[1]); - - { - Scheme_Hash_Table *ht; - toplevels_ht = scheme_make_hash_table_equal(); - ht = scheme_make_hash_table(SCHEME_hash_ptr); - locals_ht[0] = ht; - ht = scheme_make_hash_table(SCHEME_hash_ptr); - locals_ht[1] = ht; - } -} - /* READ-ONLY GLOBAL structures ONE-TIME initialization */ Scheme_Env *scheme_engine_instance_init() { Scheme_Env *env; @@ -414,7 +401,7 @@ static Scheme_Env *place_instance_init(void *stack_base, int initial_main_os_thr scheme_init_thread_lwc(); - init_toplevel_local_offsets_hashtable_caches(); + scheme_init_compenv_places(); #ifdef TIME_STARTUP_PROCESS printf("pre-process @ %" PRIdPTR "\n", scheme_get_process_milliseconds()); @@ -450,6 +437,7 @@ static Scheme_Env *place_instance_init(void *stack_base, int initial_main_os_thr scheme_init_string_places(); scheme_init_logger(); scheme_init_eval_places(); + scheme_init_compile_places(); scheme_init_regexp_places(); scheme_init_stx_places(initial_main_os_thread); scheme_init_sema_places(); @@ -482,7 +470,7 @@ static Scheme_Env *place_instance_init(void *stack_base, int initial_main_os_thr scheme_init_expand_observe(env); scheme_init_place(env); /* END PRIMITIVE MODULES */ -#if defined(MZ_USE_PLACES) +#if defined(MZ_USE_PLACES) && defined(MZ_USE_JIT) scheme_jit_fill_threadlocal_table(); #endif scheme_init_futures_per_place(); @@ -578,7 +566,7 @@ static void make_kernel_env(void) MZTIMEIT(vector, scheme_init_vector(env)); MZTIMEIT(char, scheme_init_char(env)); MZTIMEIT(bool, scheme_init_bool(env)); - MZTIMEIT(syntax, scheme_init_syntax(env)); + MZTIMEIT(syntax, scheme_init_compile(env)); MZTIMEIT(eval, scheme_init_eval(env)); MZTIMEIT(error, scheme_init_error(env)); MZTIMEIT(struct, scheme_init_struct(env)); diff --git a/src/racket/src/eval.c b/src/racket/src/eval.c index d7eae908bc..de3737ba7f 100644 --- a/src/racket/src/eval.c +++ b/src/racket/src/eval.c @@ -168,7 +168,6 @@ THREAD_LOCAL_DECL(volatile int scheme_fuel_counter); THREAD_LOCAL_DECL(uintptr_t scheme_stack_boundary); THREAD_LOCAL_DECL(uintptr_t volatile scheme_jit_stack_boundary); #endif -THREAD_LOCAL_DECL(static Scheme_Object *quick_stx); THREAD_LOCAL_DECL(int scheme_continuation_application_count); THREAD_LOCAL_DECL(static int generate_lifts_count); THREAD_LOCAL_DECL(int scheme_overflow_count); @@ -348,8 +347,6 @@ scheme_init_eval (Scheme_Env *env) void scheme_init_eval_places() { - REGISTER_SO(quick_stx); - #ifdef MZ_PRECISE_GC scheme_prefix_finalize = (Scheme_Prefix *)0x1; /* 0x1 acts as a sentenel */ GC_set_post_propagate_hook(mark_pruned_prefixes); diff --git a/src/racket/src/jitprep.c b/src/racket/src/jitprep.c index 80773cefcb..594e6ca729 100644 --- a/src/racket/src/jitprep.c +++ b/src/racket/src/jitprep.c @@ -35,6 +35,8 @@ #ifdef MZ_USE_JIT +static Scheme_Object *do_define_syntaxes_clone(Scheme_Object *expr, int jit); + static Scheme_Object *jit_application(Scheme_Object *o) { Scheme_Object *orig, *naya = NULL; @@ -476,44 +478,14 @@ static Scheme_Object *begin0_jit(Scheme_Object *data) return (Scheme_Object *)seq2; } -static Scheme_Object *do_define_syntaxes_jit(Scheme_Object *expr, int jit) -{ - Resolve_Prefix *rp, *orig_rp; - Scheme_Object *naya, *rhs; - - rhs = SCHEME_VEC_ELS(expr)[0]; - if (jit) - naya = scheme_jit_expr(rhs); - else - naya = rhs; - - orig_rp = (Resolve_Prefix *)SCHEME_VEC_ELS(expr)[1]; - rp = scheme_prefix_eval_clone(orig_rp); - - if (SAME_OBJ(naya, rhs) - && SAME_OBJ(orig_rp, rp)) - return expr; - else { - expr = scheme_clone_vector(expr, 0, 1); - SCHEME_VEC_ELS(expr)[0] = naya; - SCHEME_VEC_ELS(expr)[1] = (Scheme_Object *)rp; - return expr; - } -} - static Scheme_Object *define_syntaxes_jit(Scheme_Object *expr) { - return do_define_syntaxes_jit(expr, 1); + return do_define_syntaxes_clone(expr, 1); } static Scheme_Object *define_for_syntaxes_jit(Scheme_Object *expr) { - return do_define_syntaxes_jit(expr, 1); -} - -Scheme_Object *scheme_syntaxes_eval_clone(Scheme_Object *expr) -{ - return do_define_syntaxes_jit(expr, 0); + return do_define_syntaxes_clone(expr, 1); } /*========================================================================*/ @@ -642,3 +614,35 @@ Scheme_Object *scheme_jit_expr(Scheme_Object *expr) } #endif + +static Scheme_Object *do_define_syntaxes_clone(Scheme_Object *expr, int jit) +{ + Resolve_Prefix *rp, *orig_rp; + Scheme_Object *naya, *rhs; + + rhs = SCHEME_VEC_ELS(expr)[0]; +#ifdef MZ_USE_JIT + if (jit) + naya = scheme_jit_expr(rhs); + else +#endif + naya = rhs; + + orig_rp = (Resolve_Prefix *)SCHEME_VEC_ELS(expr)[1]; + rp = scheme_prefix_eval_clone(orig_rp); + + if (SAME_OBJ(naya, rhs) + && SAME_OBJ(orig_rp, rp)) + return expr; + else { + expr = scheme_clone_vector(expr, 0, 1); + SCHEME_VEC_ELS(expr)[0] = naya; + SCHEME_VEC_ELS(expr)[1] = (Scheme_Object *)rp; + return expr; + } +} + +Scheme_Object *scheme_syntaxes_eval_clone(Scheme_Object *expr) +{ + return do_define_syntaxes_clone(expr, 0); +} diff --git a/src/racket/src/schpriv.h b/src/racket/src/schpriv.h index 8028c349b6..af46590175 100644 --- a/src/racket/src/schpriv.h +++ b/src/racket/src/schpriv.h @@ -226,6 +226,7 @@ void scheme_init_promise(Scheme_Env *env); void scheme_init_struct(Scheme_Env *env); void scheme_init_reduced_proc_struct(Scheme_Env *env); void scheme_init_fun(Scheme_Env *env); +void scheme_init_compile(Scheme_Env *env); void scheme_init_symbol(Scheme_Env *env); void scheme_init_char(Scheme_Env *env); void scheme_init_bool(Scheme_Env *env); @@ -267,6 +268,8 @@ void scheme_init_print_buffers_places(void); void scheme_init_string_places(void); void scheme_init_thread_places(void); void scheme_init_eval_places(void); +void scheme_init_compile_places(void); +void scheme_init_compenv_places(void); void scheme_init_port_places(void); void scheme_init_regexp_places(void); void scheme_init_stx_places(int initial_main_os_thread);