fix protection of expression for definitions; fixes #hasheq constants and the nbsp Help Desk bug, in particular

svn: r5243
This commit is contained in:
Matthew Flatt 2007-01-07 13:13:21 +00:00
parent 9984b48d88
commit 01e3bf7140
3 changed files with 2072 additions and 2057 deletions

File diff suppressed because it is too large Load Diff

View File

@ -8797,36 +8797,56 @@ static Scheme_Object *write_syntax(Scheme_Object *obj)
protect_after = scheme_syntax_protect_afters[c]; protect_after = scheme_syntax_protect_afters[c];
l = rest = (Scheme_Object *)SCHEME_IPTR_VAL(obj); l = rest = (Scheme_Object *)SCHEME_IPTR_VAL(obj);
for (c = 0; SCHEME_PAIRP(l) && (c < protect_after); c++) { if (protect_after == -2) {
l = SCHEME_CDR(l); /* -2 => protect first element of vector */
} if (SCHEME_VECTORP(l)) {
if (!SCHEME_NULLP(l) && (c == protect_after)) { l = scheme_protect_quote(SCHEME_VEC_ELS(rest)[0]);
Scheme_Object *new_l; if (!SAME_OBJ(l, SCHEME_VEC_ELS(rest)[0])) {
Scheme_Object *vec;
new_l = scheme_protect_quote(l); long i, len;
len = SCHEME_VEC_SIZE(rest);
if (new_l != l) { vec = scheme_make_vector(len, NULL);
Scheme_Object *first = NULL, *last = NULL; SCHEME_VEC_ELS(vec)[0] = l;
for (i = 1; i < len; i++) {
while (rest != l) { SCHEME_VEC_ELS(vec)[i] = SCHEME_VEC_ELS(rest)[i];
Scheme_Object *p; }
rest = vec;
p = scheme_make_pair(SCHEME_CAR(rest), scheme_null);
if (last)
SCHEME_CDR(last) = p;
else
first = p;
last = p;
rest = SCHEME_CDR(rest);
} }
} else {
scheme_signal_error("expected a vector for syntax");
}
} else {
for (c = 0; SCHEME_PAIRP(l) && (c < protect_after); c++) {
l = SCHEME_CDR(l);
}
if (!SCHEME_NULLP(l) && (c == protect_after)) {
Scheme_Object *new_l;
new_l = scheme_protect_quote(l);
if (new_l != l) {
Scheme_Object *first = NULL, *last = NULL;
if (last) while (rest != l) {
SCHEME_CDR(last) = new_l; Scheme_Object *p;
else
first = new_l; p = scheme_make_pair(SCHEME_CAR(rest), scheme_null);
if (last)
SCHEME_CDR(last) = p;
else
first = p;
last = p;
rest = SCHEME_CDR(rest);
}
rest = first; if (last)
SCHEME_CDR(last) = new_l;
else
first = new_l;
rest = first;
}
} }
} }

View File

@ -262,7 +262,7 @@ scheme_init_syntax (Scheme_Env *env)
define_values_optimize, define_values_optimize,
define_values_resolve, define_values_validate, define_values_resolve, define_values_validate,
define_values_execute, define_values_jit, define_values_execute, define_values_jit,
NULL, NULL, 1); NULL, NULL, -2);
scheme_register_syntax(SET_EXPD, scheme_register_syntax(SET_EXPD,
set_optimize, set_optimize,
set_resolve, set_validate, set_resolve, set_validate,
@ -277,12 +277,12 @@ scheme_init_syntax (Scheme_Env *env)
define_syntaxes_optimize, define_syntaxes_optimize,
define_syntaxes_resolve, define_syntaxes_validate, define_syntaxes_resolve, define_syntaxes_validate,
define_syntaxes_execute, define_syntaxes_jit, define_syntaxes_execute, define_syntaxes_jit,
NULL, NULL, 4); NULL, NULL, -2);
scheme_register_syntax(DEFINE_FOR_SYNTAX_EXPD, scheme_register_syntax(DEFINE_FOR_SYNTAX_EXPD,
define_for_syntaxes_optimize, define_for_syntaxes_optimize,
define_for_syntaxes_resolve, define_for_syntaxes_validate, define_for_syntaxes_resolve, define_for_syntaxes_validate,
define_for_syntaxes_execute, define_for_syntaxes_jit, define_for_syntaxes_execute, define_for_syntaxes_jit,
NULL, NULL, 4); NULL, NULL, -2);
scheme_register_syntax(CASE_LAMBDA_EXPD, scheme_register_syntax(CASE_LAMBDA_EXPD,
case_lambda_optimize, case_lambda_optimize,
case_lambda_resolve, case_lambda_validate, case_lambda_resolve, case_lambda_validate,