From a6f8f00f553b67aff7a9ea779efc258ae78bc947 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 1 Aug 2013 05:54:46 -0600 Subject: [PATCH] fix cross-phase-persistent attribute of primitive modules --- .../tests/racket/place-cross-phase.rkt | 17 +++++++++++++++++ racket/src/racket/include/mzwin.def | 1 + racket/src/racket/include/mzwin3m.def | 1 + racket/src/racket/include/racket.exp | 1 + racket/src/racket/include/racket3m.exp | 1 + racket/src/racket/src/module.c | 7 ++++++- racket/src/racket/src/schemef.h | 1 + racket/src/racket/src/schemex.h | 1 + racket/src/racket/src/schemex.inc | 1 + racket/src/racket/src/schemexm.h | 1 + 10 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 pkgs/racket-pkgs/racket-test/tests/racket/place-cross-phase.rkt diff --git a/pkgs/racket-pkgs/racket-test/tests/racket/place-cross-phase.rkt b/pkgs/racket-pkgs/racket-test/tests/racket/place-cross-phase.rkt new file mode 100644 index 0000000000..7bb5c29439 --- /dev/null +++ b/pkgs/racket-pkgs/racket-test/tests/racket/place-cross-phase.rkt @@ -0,0 +1,17 @@ +#lang racket/base +(require racket/place) + +(define (go) + (place ch + (printf "running\n") + (parameterize ([current-namespace (make-base-namespace)]) + (eval '(module with-contract-#%app-app racket/kernel + (#%require '#%network) + (#%declare #:cross-phase-persistent)))) + (printf "done\n"))) + +(module+ main + (printf "creating place\n") + (define p (go)) + (printf "waiting\n") + (place-wait p)) diff --git a/racket/src/racket/include/mzwin.def b/racket/src/racket/include/mzwin.def index ec6329dd83..80d4c17640 100644 --- a/racket/src/racket/include/mzwin.def +++ b/racket/src/racket/include/mzwin.def @@ -528,6 +528,7 @@ EXPORTS scheme_save_initial_module_set scheme_primitive_module scheme_finish_primitive_module + scheme_set_primitive_module_phaseless scheme_protect_primitive_provide scheme_make_modidx scheme_apply_for_syntax_in_env diff --git a/racket/src/racket/include/mzwin3m.def b/racket/src/racket/include/mzwin3m.def index 54e07a2563..02f9effe9a 100644 --- a/racket/src/racket/include/mzwin3m.def +++ b/racket/src/racket/include/mzwin3m.def @@ -543,6 +543,7 @@ EXPORTS scheme_save_initial_module_set scheme_primitive_module scheme_finish_primitive_module + scheme_set_primitive_module_phaseless scheme_protect_primitive_provide scheme_make_modidx scheme_apply_for_syntax_in_env diff --git a/racket/src/racket/include/racket.exp b/racket/src/racket/include/racket.exp index f623663913..473d226ff2 100644 --- a/racket/src/racket/include/racket.exp +++ b/racket/src/racket/include/racket.exp @@ -545,6 +545,7 @@ scheme_install_macro scheme_save_initial_module_set scheme_primitive_module scheme_finish_primitive_module +scheme_set_primitive_module_phaseless scheme_protect_primitive_provide scheme_make_modidx scheme_apply_for_syntax_in_env diff --git a/racket/src/racket/include/racket3m.exp b/racket/src/racket/include/racket3m.exp index 74417004cd..37fa934422 100644 --- a/racket/src/racket/include/racket3m.exp +++ b/racket/src/racket/include/racket3m.exp @@ -551,6 +551,7 @@ scheme_install_macro scheme_save_initial_module_set scheme_primitive_module scheme_finish_primitive_module +scheme_set_primitive_module_phaseless scheme_protect_primitive_provide scheme_make_modidx scheme_apply_for_syntax_in_env diff --git a/racket/src/racket/src/module.c b/racket/src/racket/src/module.c index e7ff977392..2cfc4d099d 100644 --- a/racket/src/racket/src/module.c +++ b/racket/src/racket/src/module.c @@ -5862,7 +5862,7 @@ Scheme_Env *scheme_primitive_module(Scheme_Object *name, Scheme_Env *for_env) m = MALLOC_ONE_TAGGED(Scheme_Module); m->so.type = scheme_module_type; m->predefined = scheme_starting_up; - m->phaseless = (scheme_starting_up ? scheme_true : NULL); + m->phaseless = scheme_true; env = scheme_new_module_env(for_env, m, 0); @@ -5923,6 +5923,11 @@ Scheme_Env *scheme_primitive_module(Scheme_Object *name, Scheme_Env *for_env) return env; } +void scheme_set_primitive_module_phaseless(Scheme_Env *env, int phaseless) +{ + env->module->phaseless = (phaseless ? scheme_true : NULL); +} + void scheme_finish_primitive_module(Scheme_Env *env) { Scheme_Module *m = env->module; diff --git a/racket/src/racket/src/schemef.h b/racket/src/racket/src/schemef.h index 1b589dda36..793f41bca4 100644 --- a/racket/src/racket/src/schemef.h +++ b/racket/src/racket/src/schemef.h @@ -1029,6 +1029,7 @@ MZ_EXTERN void scheme_install_macro(Scheme_Bucket *b, Scheme_Object *v); MZ_EXTERN void scheme_save_initial_module_set(Scheme_Env *env); MZ_EXTERN Scheme_Env *scheme_primitive_module(Scheme_Object *name, Scheme_Env *for_env); MZ_EXTERN void scheme_finish_primitive_module(Scheme_Env *env); +MZ_EXTERN void scheme_set_primitive_module_phaseless(Scheme_Env *env, int phaseless); MZ_EXTERN void scheme_protect_primitive_provide(Scheme_Env *env, Scheme_Object *name); MZ_EXTERN Scheme_Object *scheme_make_modidx(Scheme_Object *path, diff --git a/racket/src/racket/src/schemex.h b/racket/src/racket/src/schemex.h index b08bf3f77d..33131998fa 100644 --- a/racket/src/racket/src/schemex.h +++ b/racket/src/racket/src/schemex.h @@ -844,6 +844,7 @@ void (*scheme_install_macro)(Scheme_Bucket *b, Scheme_Object *v); void (*scheme_save_initial_module_set)(Scheme_Env *env); Scheme_Env *(*scheme_primitive_module)(Scheme_Object *name, Scheme_Env *for_env); void (*scheme_finish_primitive_module)(Scheme_Env *env); +void (*scheme_set_primitive_module_phaseless)(Scheme_Env *env, int phaseless); void (*scheme_protect_primitive_provide)(Scheme_Env *env, Scheme_Object *name); Scheme_Object *(*scheme_make_modidx)(Scheme_Object *path, Scheme_Object *base, diff --git a/racket/src/racket/src/schemex.inc b/racket/src/racket/src/schemex.inc index 9705412080..eb385d4d90 100644 --- a/racket/src/racket/src/schemex.inc +++ b/racket/src/racket/src/schemex.inc @@ -614,6 +614,7 @@ scheme_extension_table->scheme_save_initial_module_set = scheme_save_initial_module_set; scheme_extension_table->scheme_primitive_module = scheme_primitive_module; scheme_extension_table->scheme_finish_primitive_module = scheme_finish_primitive_module; + scheme_extension_table->scheme_set_primitive_module_phaseless = scheme_set_primitive_module_phaseless; scheme_extension_table->scheme_protect_primitive_provide = scheme_protect_primitive_provide; scheme_extension_table->scheme_make_modidx = scheme_make_modidx; scheme_extension_table->scheme_apply_for_syntax_in_env = scheme_apply_for_syntax_in_env; diff --git a/racket/src/racket/src/schemexm.h b/racket/src/racket/src/schemexm.h index 2ff2a2fe4f..f7594b374d 100644 --- a/racket/src/racket/src/schemexm.h +++ b/racket/src/racket/src/schemexm.h @@ -614,6 +614,7 @@ #define scheme_save_initial_module_set (scheme_extension_table->scheme_save_initial_module_set) #define scheme_primitive_module (scheme_extension_table->scheme_primitive_module) #define scheme_finish_primitive_module (scheme_extension_table->scheme_finish_primitive_module) +#define scheme_set_primitive_module_phaseless (scheme_extension_table->scheme_set_primitive_module_phaseless) #define scheme_protect_primitive_provide (scheme_extension_table->scheme_protect_primitive_provide) #define scheme_make_modidx (scheme_extension_table->scheme_make_modidx) #define scheme_apply_for_syntax_in_env (scheme_extension_table->scheme_apply_for_syntax_in_env)