fix load handlers to match docs on parameters

Problems exposed by setting `read-accept-lang' to #f.
This commit is contained in:
Matthew Flatt 2012-05-29 13:56:56 -06:00
parent a95739821b
commit 74844152bc
5 changed files with 38 additions and 37 deletions

View File

@ -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)

View File

@ -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

View File

@ -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));

View File

@ -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));

View File

@ -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;
}