fix protection of expression for definitions; fixes #hasheq constants and the nbsp Help Desk bug, in particular
svn: r5243
This commit is contained in:
parent
9984b48d88
commit
01e3bf7140
File diff suppressed because it is too large
Load Diff
|
@ -8797,36 +8797,56 @@ static Scheme_Object *write_syntax(Scheme_Object *obj)
|
|||
protect_after = scheme_syntax_protect_afters[c];
|
||||
|
||||
l = rest = (Scheme_Object *)SCHEME_IPTR_VAL(obj);
|
||||
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;
|
||||
|
||||
while (rest != l) {
|
||||
Scheme_Object *p;
|
||||
|
||||
p = scheme_make_pair(SCHEME_CAR(rest), scheme_null);
|
||||
if (last)
|
||||
SCHEME_CDR(last) = p;
|
||||
else
|
||||
first = p;
|
||||
last = p;
|
||||
|
||||
rest = SCHEME_CDR(rest);
|
||||
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);
|
||||
}
|
||||
if (!SCHEME_NULLP(l) && (c == protect_after)) {
|
||||
Scheme_Object *new_l;
|
||||
|
||||
if (last)
|
||||
SCHEME_CDR(last) = new_l;
|
||||
else
|
||||
first = new_l;
|
||||
new_l = scheme_protect_quote(l);
|
||||
|
||||
rest = first;
|
||||
if (new_l != l) {
|
||||
Scheme_Object *first = NULL, *last = NULL;
|
||||
|
||||
while (rest != l) {
|
||||
Scheme_Object *p;
|
||||
|
||||
p = scheme_make_pair(SCHEME_CAR(rest), scheme_null);
|
||||
if (last)
|
||||
SCHEME_CDR(last) = p;
|
||||
else
|
||||
first = p;
|
||||
last = p;
|
||||
|
||||
rest = SCHEME_CDR(rest);
|
||||
}
|
||||
|
||||
if (last)
|
||||
SCHEME_CDR(last) = new_l;
|
||||
else
|
||||
first = new_l;
|
||||
|
||||
rest = first;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue
Block a user