From 74844152bca4d472cd6c415e9aa6e9c1b5bd41ff Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Tue, 29 May 2012 13:56:56 -0600 Subject: [PATCH] fix load handlers to match docs on parameters Problems exposed by setting `read-accept-lang' to #f. --- collects/mred/private/snipfile.rkt | 40 +++++++++++++---------- collects/scribblings/reference/eval.scrbl | 2 +- src/racket/src/mzmark_portfun.inc | 2 -- src/racket/src/mzmarksrc.c | 1 - src/racket/src/portfun.c | 30 ++++++++--------- 5 files changed, 38 insertions(+), 37 deletions(-) diff --git a/collects/mred/private/snipfile.rkt b/collects/mred/private/snipfile.rkt index 127ccc293c..11903906df 100644 --- a/collects/mred/private/snipfile.rkt +++ b/collects/mred/private/snipfile.rkt @@ -249,27 +249,31 @@ (lambda () (void)) (lambda () (parameterize ([read-accept-compiled #t] + [read-accept-reader #t] + [read-accept-lang #t] [read-on-demand-source (and (load-on-demand-enabled) (path->complete-path filename))]) (if expected-module - (jump-to-submodule - in-port - expected-module - (lambda (check-second?) - (with-module-reading-parameterization - (lambda () - (let* ([first (read-syntax src in-port)] - [module-ized-exp (check-module-form first expected-module filename)] - [second (if check-second? - (read in-port) - eof)]) - (unless (eof-object? second) - (raise-syntax-error - 'text-editor-load-handler - (format "expected only a `module' declaration for `~s', but found an extra expression" - expected-module) - second)) - (eval module-ized-exp)))))) + (with-module-reading-parameterization + (lambda () + (jump-to-submodule + in-port + expected-module + (lambda (check-second?) + (with-module-reading-parameterization + (lambda () + (let* ([first (read-syntax src in-port)] + [module-ized-exp (check-module-form first expected-module filename)] + [second (if check-second? + (read in-port) + eof)]) + (unless (eof-object? second) + (raise-syntax-error + 'text-editor-load-handler + (format "expected only a `module' declaration for `~s', but found an extra expression" + expected-module) + second)) + (eval module-ized-exp)))))))) (let loop ([last-time-values (list (void))]) (let ([exp (read-syntax src in-port)]) (if (eof-object? exp) diff --git a/collects/scribblings/reference/eval.scrbl b/collects/scribblings/reference/eval.scrbl index 89aaac93b2..4cebd1edc5 100644 --- a/collects/scribblings/reference/eval.scrbl +++ b/collects/scribblings/reference/eval.scrbl @@ -114,7 +114,7 @@ port, unless the path has a @racket[".zo"] suffix. It also @racket[parameterize]s each read to set @racket[read-accept-compiled], @racket[read-accept-reader], and @racket[read-accept-lang] to @racket[#t]. In addition, if @racket[load-on-demand-enabled] is -@racket[#t], then @racket[read-on-demand-source] is effectively set to +@racket[#t], then @racket[read-on-demand-source] is set to the @tech{cleanse}d, absolute form of @racket[path] during the @racket[read-syntax] call. After reading a single form, the form is passed to the current @tech{evaluation handler}, wrapping the diff --git a/src/racket/src/mzmark_portfun.inc b/src/racket/src/mzmark_portfun.inc index 562fd6aa55..a6b415ea86 100644 --- a/src/racket/src/mzmark_portfun.inc +++ b/src/racket/src/mzmark_portfun.inc @@ -13,7 +13,6 @@ static int mark_load_handler_data_MARK(void *p, struct NewGC *gc) { gcMARK2(d->p, gc); gcMARK2(d->stxsrc, gc); gcMARK2(d->expected_module, gc); - gcMARK2(d->delay_load_info, gc); return gcBYTES_TO_WORDS(sizeof(LoadHandlerData)); @@ -27,7 +26,6 @@ static int mark_load_handler_data_FIXUP(void *p, struct NewGC *gc) { gcFIXUP2(d->p, gc); gcFIXUP2(d->stxsrc, gc); gcFIXUP2(d->expected_module, gc); - gcFIXUP2(d->delay_load_info, gc); return gcBYTES_TO_WORDS(sizeof(LoadHandlerData)); diff --git a/src/racket/src/mzmarksrc.c b/src/racket/src/mzmarksrc.c index 608c1c0270..bf645f96f9 100644 --- a/src/racket/src/mzmarksrc.c +++ b/src/racket/src/mzmarksrc.c @@ -1559,7 +1559,6 @@ mark_load_handler_data { gcMARK2(d->p, gc); gcMARK2(d->stxsrc, gc); gcMARK2(d->expected_module, gc); - gcMARK2(d->delay_load_info, gc); size: gcBYTES_TO_WORDS(sizeof(LoadHandlerData)); diff --git a/src/racket/src/portfun.c b/src/racket/src/portfun.c index 324e1c79ba..d87bcf323c 100644 --- a/src/racket/src/portfun.c +++ b/src/racket/src/portfun.c @@ -4266,7 +4266,6 @@ typedef struct { Scheme_Thread *p; Scheme_Object *stxsrc; Scheme_Object *expected_module; - Scheme_Object *delay_load_info; } LoadHandlerData; static void post_load_handler(void *data) @@ -4428,8 +4427,8 @@ static Scheme_Object *do_load_handler(void *data) } } - while ((obj = scheme_internal_read(port, lhd->stxsrc, 1, 0, 0, 0, -1, NULL, - NULL, NULL, lhd->delay_load_info)) + while ((obj = scheme_internal_read(port, lhd->stxsrc, -1, 0, 0, 0, -1, NULL, + NULL, NULL, NULL)) && !SCHEME_EOFP(obj)) { save_array = NULL; got_one = 1; @@ -4516,7 +4515,7 @@ static Scheme_Object *do_load_handler(void *data) /* Check no more expressions: */ if (!skip_no_more_check) { - d = scheme_internal_read(port, lhd->stxsrc, 1, 0, 0, 0, -1, NULL, NULL, NULL, NULL); + d = scheme_internal_read(port, lhd->stxsrc, -1, 0, 0, 0, -1, NULL, NULL, NULL, NULL); if (!SCHEME_EOFP(d)) { Scheme_Input_Port *ip; ip = scheme_input_port_record(port); @@ -4664,6 +4663,15 @@ static Scheme_Object *default_load(int argc, Scheme_Object *argv[]) config = scheme_extend_config(config, MZCONFIG_CAN_READ_LANG, scheme_true); config = scheme_extend_config(config, MZCONFIG_READ_DECIMAL_INEXACT, scheme_true); config = scheme_extend_config(config, MZCONFIG_READTABLE, scheme_false); + } else { + config = scheme_extend_config(config, MZCONFIG_CAN_READ_COMPILED, scheme_true); + config = scheme_extend_config(config, MZCONFIG_CAN_READ_READER, scheme_true); + config = scheme_extend_config(config, MZCONFIG_CAN_READ_LANG, scheme_true); + } + + if (use_delay_load) { + v = scheme_path_to_complete_path(argv[0], NULL); + config = scheme_extend_config(config, MZCONFIG_DELAY_LOAD_INFO, v); } lhd = MALLOC_ONE_RT(LoadHandlerData); @@ -4676,22 +4684,14 @@ static Scheme_Object *default_load(int argc, Scheme_Object *argv[]) name = scheme_input_port_record(port)->name; lhd->stxsrc = name; lhd->expected_module = expected_module; - if (use_delay_load) { - v = scheme_path_to_complete_path(argv[0], NULL); - lhd->delay_load_info = v; - } - if (SCHEME_TRUEP(expected_module)) { - scheme_push_continuation_frame(&cframe); - scheme_set_cont_mark(scheme_parameterization_key, (Scheme_Object *)config); - } + scheme_push_continuation_frame(&cframe); + scheme_set_cont_mark(scheme_parameterization_key, (Scheme_Object *)config); v = scheme_dynamic_wind(NULL, do_load_handler, post_load_handler, NULL, (void *)lhd); - if (SCHEME_TRUEP(expected_module)) { - scheme_pop_continuation_frame(&cframe); - } + scheme_pop_continuation_frame(&cframe); return v; }