alternate approach to handling renamed forward refs

This commit is contained in:
Alex Shinn 2017-04-10 22:36:53 +09:00
parent 40d322ca5f
commit 8feb1e761e
2 changed files with 11 additions and 11 deletions

10
eval.c
View file

@ -58,6 +58,7 @@ sexp sexp_warn_undefs_op (sexp ctx, sexp self, sexp_sint_t n, sexp from, sexp to
if (sexp_envp(from)) from = sexp_env_bindings(from);
for (x=from; sexp_pairp(x) && x!=to; x=sexp_env_next_cell(x))
if (sexp_cdr(x) == SEXP_UNDEF && sexp_car(x) != ignore
&& !sexp_synclop(sexp_car(x))
&& sexp_not(sexp_memq(ctx, sexp_car(x), ignore)))
sexp_warn(ctx, "reference to undefined variable: ", sexp_car(x));
return SEXP_VOID;
@ -150,15 +151,6 @@ sexp sexp_env_cell_define (sexp ctx, sexp env, sexp key,
if (sexp_car(ls) == key) {
sexp_cdr(ls) = value;
return ls;
} else if (sexp_cdr(ls) == SEXP_UNDEF &&
sexp_synclop(sexp_car(ls)) &&
!sexp_synclop(key) &&
sexp_identifier_eq(ctx, env, key, sexp_synclo_env(sexp_car(ls)), sexp_synclo_expr(sexp_car(ls)))) {
/* handle an undefined renamed reference that would have */
/* resolved to this binding, renamed to what we define here */
sexp_car(ls) = key;
sexp_cdr(ls) = value;
return ls;
}
sexp_gc_preserve2(ctx, cell, ls);
sexp_env_push(ctx, env, cell, key, value);

8
vm.c
View file

@ -1326,8 +1326,16 @@ sexp sexp_apply (sexp ctx, sexp proc, sexp args) {
break;
case SEXP_OP_GLOBAL_REF:
_ALIGN_IP();
if (sexp_cdr(_WORD0) == SEXP_UNDEF) {
/* handle renamed forward references by doing a final delayed */
/* lookup before throwing an undefined variable error */
if (sexp_synclop(sexp_car(_WORD0))) {
tmp1 = sexp_env_cell(ctx, sexp_synclo_env(sexp_car(_WORD0)), sexp_synclo_expr(sexp_car(_WORD0)), 0);
if (tmp1 != NULL) _WORD0 = tmp1;
}
if (sexp_cdr(_WORD0) == SEXP_UNDEF)
sexp_raise("undefined variable", sexp_list1(ctx, sexp_car(_WORD0)));
}
/* ... FALLTHROUGH ... */
case SEXP_OP_GLOBAL_KNOWN_REF:
_ALIGN_IP();