From 8feb1e761e28949174e71dc39e5f5775907ac545 Mon Sep 17 00:00:00 2001 From: Alex Shinn Date: Mon, 10 Apr 2017 22:36:53 +0900 Subject: [PATCH] alternate approach to handling renamed forward refs --- eval.c | 10 +--------- vm.c | 12 ++++++++++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/eval.c b/eval.c index f6160827..4fd78faa 100644 --- a/eval.c +++ b/eval.c @@ -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); diff --git a/vm.c b/vm.c index a16af9b4..960d7809 100644 --- a/vm.c +++ b/vm.c @@ -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) - sexp_raise("undefined variable", sexp_list1(ctx, sexp_car(_WORD0))); + 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();