summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJo-Philipp Wich <jo@mein.io>2022-07-20 14:52:19 +0200
committerJo-Philipp Wich <jo@mein.io>2022-07-30 00:41:56 +0200
commit50cf5723f9d41a5a65a6f5d38f8dfff4ff9422a5 (patch)
tree44211f7efe3e6f35f10b0949ac844a1aa31a683f
parentc441f65c19e62eefaa8af37ae74ae47c4d4eaa4e (diff)
program: add function to globally lookup exported name
Add a helper function to query the global index of a named export within a specific source which is a prerequisite for compiling import statements. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
-rw-r--r--include/ucode/program.h1
-rw-r--r--program.c21
2 files changed, 22 insertions, 0 deletions
diff --git a/include/ucode/program.h b/include/ucode/program.h
index e540807..4fb4a9b 100644
--- a/include/ucode/program.h
+++ b/include/ucode/program.h
@@ -53,6 +53,7 @@ uc_source_t *uc_program_function_source(uc_function_t *);
size_t uc_program_function_srcpos(uc_function_t *, size_t);
void uc_program_function_free(uc_function_t *);
+ssize_t uc_program_export_lookup(uc_program_t *, uc_source_t *, uc_value_t *);
uc_value_t *uc_program_get_constant(uc_program_t *, size_t);
ssize_t uc_program_add_constant(uc_program_t *, uc_value_t *);
diff --git a/program.c b/program.c
index 4321409..f08e0cd 100644
--- a/program.c
+++ b/program.c
@@ -846,3 +846,24 @@ uc_program_entry(uc_program_t *program)
return (uc_function_t *)program->functions.prev;
}
+
+ssize_t
+uc_program_export_lookup(uc_program_t *program, uc_source_t *source, uc_value_t *name)
+{
+ size_t i, off;
+ ssize_t slot;
+
+ for (i = 0, off = 0; i < program->sources.count; i++) {
+ if (program->sources.entries[i] != source) {
+ off += program->sources.entries[i]->exports.count;
+ continue;
+ }
+
+ slot = uc_source_export_lookup(source, name);
+
+ if (slot > -1)
+ return off + slot;
+ }
+
+ return -1;
+}