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];
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user