summaryrefslogtreecommitdiffstats
path: root/linker.c
diff options
context:
space:
mode:
authorNicolas Williams <nico@cryptonector.com>2015-06-26 23:40:37 -0500
committerNicolas Williams <nico@cryptonector.com>2015-06-26 23:40:37 -0500
commitaaf305868cb0c3b7b206dc42753704d9add2004e (patch)
tree642d83cb09eb3f5ae28a873b2ba4ec4d5ca17acf /linker.c
parent8cc31f0f49e71be5a961906b5fc5f357a42fb6a7 (diff)
Restore import into caller's namespace
Diffstat (limited to 'linker.c')
-rw-r--r--linker.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/linker.c b/linker.c
index b83f00e8..d1c39640 100644
--- a/linker.c
+++ b/linker.c
@@ -198,6 +198,7 @@ static int process_dependencies(jq_state *jq, jv jq_origin, jv lib_origin, block
jv deps = block_take_imports(src_block);
block bk = *src_block;
int nerrors = 0;
+ const char *as_str = NULL;
jv_array_foreach(deps, i, dep) {
int is_data = jv_get_kind(jv_object_get(jv_copy(dep), jv_string("is_data"))) == JV_KIND_TRUE;
@@ -208,7 +209,9 @@ static int process_dependencies(jq_state *jq, jv jq_origin, jv lib_origin, block
jv_free(v);
jv relpath = validate_relpath(jv_object_get(jv_copy(dep), jv_string("relpath")));
jv as = jv_object_get(jv_copy(dep), jv_string("as"));
- assert(jv_is_valid(as) && jv_get_kind(as) == JV_KIND_STRING);
+ assert(!jv_is_valid(as) || jv_get_kind(as) == JV_KIND_STRING);
+ if (jv_get_kind(as) == JV_KIND_STRING)
+ as_str = jv_string_value(as);
jv search = default_search(jq, jv_object_get(dep, jv_string("search")));
// dep is now freed; do not reuse
@@ -233,14 +236,14 @@ static int process_dependencies(jq_state *jq, jv jq_origin, jv lib_origin, block
if (state_idx < lib_state->ct) { // Found
jv_free(resolved);
// Bind the library to the program
- bk = block_bind_library(lib_state->defs[state_idx], bk, OP_IS_CALL_PSEUDO, jv_string_value(as));
+ bk = block_bind_library(lib_state->defs[state_idx], bk, OP_IS_CALL_PSEUDO, as_str);
} else { // Not found. Add it to the table before binding.
block dep_def_block = gen_noop();
- nerrors += load_library(jq, resolved, is_data, raw, jv_string_value(as), &dep_def_block, lib_state);
+ nerrors += load_library(jq, resolved, is_data, raw, as_str, &dep_def_block, lib_state);
// resolved has been freed
if (nerrors == 0) {
// Bind the library to the program
- bk = block_bind_library(dep_def_block, bk, OP_IS_CALL_PSEUDO, jv_string_value(as));
+ bk = block_bind_library(dep_def_block, bk, OP_IS_CALL_PSEUDO, as_str);
}
}
jv_free(as);