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,6 +8797,25 @@ static Scheme_Object *write_syntax(Scheme_Object *obj)
protect_after = scheme_syntax_protect_afters[c];
l = rest = (Scheme_Object *)SCHEME_IPTR_VAL(obj);
if (protect_after == -2) {
/* -2 => protect first element of vector */
if (SCHEME_VECTORP(l)) {
l = scheme_protect_quote(SCHEME_VEC_ELS(rest)[0]);
if (!SAME_OBJ(l, SCHEME_VEC_ELS(rest)[0])) {
Scheme_Object *vec;
long i, len;
len = SCHEME_VEC_SIZE(rest);
vec = scheme_make_vector(len, NULL);
SCHEME_VEC_ELS(vec)[0] = l;
for (i = 1; i < len; i++) {
SCHEME_VEC_ELS(vec)[i] = SCHEME_VEC_ELS(rest)[i];
}
rest = vec;
}
} else {
scheme_signal_error("expected a vector for syntax");
}
} else {
for (c = 0; SCHEME_PAIRP(l) && (c < protect_after); c++) {
l = SCHEME_CDR(l);
}
@ -8829,6 +8848,7 @@ static Scheme_Object *write_syntax(Scheme_Object *obj)
rest = first;
}
}
}
return cons(idx, rest);
}

View File

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