commit e9f9cb141592a17b88dc8d4273070dc7c267049d
parent d1492be55b71589353369899c04fbe1661ae9e29
Author: m21c <ho*******@gmail.com>
Date: Thu, 15 Jul 2021 15:52:07 +0200
changed getfuncenv() to deferfuncenv()
Diffstat:
| M | aria.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);