diff options
author | Jo-Philipp Wich <jo@mein.io> | 2022-07-20 09:38:16 +0200 |
---|---|---|
committer | Jo-Philipp Wich <jo@mein.io> | 2022-07-30 00:41:56 +0200 |
commit | 862e49de33bd07daea129d553968579019c79b59 (patch) | |
tree | 1c0b1410ae47606cf5710c3b0c83898b74fa898b | |
parent | 78dfb08f7569904394249758b2d7a563366b60ff (diff) |
compiler: resolve predeclared upvalues
Do not require a parent function compiler reference to lookup an already
declared (potentially unresolved) upvalue in the current scope. Instead,
search the named upvalues in the current function scope in case there is
no parent compiler reference.
This is required for the upcoming module support which will use unresolved
upvalues to realize import/export functionality.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
-rw-r--r-- | compiler.c | 14 |
1 files changed, 13 insertions, 1 deletions
@@ -790,10 +790,22 @@ uc_compiler_add_upval(uc_compiler_t *compiler, size_t idx, bool local, uc_value_ static ssize_t uc_compiler_resolve_upval(uc_compiler_t *compiler, uc_value_t *name, bool *constant) { + uc_upvals_t *upvals = &compiler->upvals; + uc_upval_t *uv; ssize_t idx; + size_t i; + + if (!compiler->parent) { + for (i = 0, uv = upvals->entries; i < upvals->count; i++, uv = upvals->entries + i) { + if (ucv_is_equal(uv->name, name) && uv->local == false) { + *constant = uv->constant; + + return i; + } + } - if (!compiler->parent) return -1; + } idx = uc_compiler_resolve_local(compiler->parent, name, constant); |