Aria

A low-level systems programming language
git clone git://git.m21c.me/Aria.git
Log | Files | Refs | LICENSE

commit e9f9cb141592a17b88dc8d4273070dc7c267049d
parent d1492be55b71589353369899c04fbe1661ae9e29
Author: m21c  <ho*******@gmail.com>
Date:   Thu, 15 Jul 2021 15:52:07 +0200

changed getfuncenv() to deferfuncenv()

Diffstat:
Maria.c | 54++++++++++++++++++++++++++++--------------------------
1 file changed, 28 insertions(+), 26 deletions(-)

diff --git a/aria.c b/aria.c @@ -1501,16 +1501,37 @@ popenv(Source *source) { return env; } -Env * -getfuncenv(Source *source) { - Env *env; +void +deferfuncenv(Source *source, int keydeclinfunc) +{ + Env *env, *funcenv = NULL; for (env = source->currenv; env; env = env->below) { - if (env->kind == SFUNCTION) - return env; + if (env->kind == SFUNCTION) { + funcenv = env; + break; + } } - return NULL; + if (funcenv) { + if (!funcenv->pending) { + funcenv->pending = true; + if (!source->pendingenvhead) { + source->pendingenvtail = funcenv; + source->pendingenvhead = funcenv; + } else { + source->pendingenvtail->pendingnext = funcenv; + funcenv->pendingprev = source->pendingenvtail; + source->pendingenvtail = funcenv; + } + } + } else { + error( + &source->tok.loc, + "'%s' undeclared", + getstring(idents, keydeclinfunc) + ); + } } @@ -2070,26 +2091,7 @@ atom(Source *source, int flags) { lhs->kind = ADECLREF; lhs->type = lhs->u.declref->type; } else { - Env *funcenv = getfuncenv(source); - if (funcenv) { - if (!funcenv->pending) { - funcenv->pending = true; - if (!source->pendingenvhead) { - source->pendingenvtail = funcenv; - source->pendingenvhead = funcenv; - } else { - source->pendingenvtail->pendingnext = funcenv; - funcenv->pendingprev = source->pendingenvtail; - source->pendingenvtail = funcenv; - } - } - } else { - error( - getloc(source), - "'%s' undeclared", - getstring(idents, source->tok.u.key) - ); - } + deferfuncenv(source, source->tok.u.key); lhs->u.key = source->tok.u.key; } gettok(source, true);