summaryrefslogtreecommitdiffstats
path: root/compile.c
diff options
context:
space:
mode:
authorDavid Tolnay <dtolnay@gmail.com>2015-08-11 23:26:51 -0700
committerDavid Tolnay <dtolnay@gmail.com>2015-08-13 21:42:35 -0700
commit5479d7f2dc39c138fc8f5606c4538b4c3fbb6bc3 (patch)
treeeb937422955284f3f2307e4f36a5d83946adcc36 /compile.c
parenta5b2c55a708159334997529dd5480653adbede1e (diff)
Fix assert fail on non-object import metadata (fix #900)
Diffstat (limited to 'compile.c')
-rw-r--r--compile.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/compile.c b/compile.c
index 6988d27c..05f070cd 100644
--- a/compile.c
+++ b/compile.c
@@ -495,23 +495,26 @@ jv block_module_meta(block b) {
return jv_null();
}
-block gen_import(const char* name, block metadata, const char* as, int is_data) {
- assert(metadata.first == NULL || block_is_const(metadata));
+block gen_import(const char* name, const char* as, int is_data) {
inst* i = inst_new(DEPS);
- jv meta;
- if (block_is_const(metadata))
- meta = block_const(metadata);
- else
- meta = jv_object();
+ jv meta = jv_object();
if (as != NULL)
meta = jv_object_set(meta, jv_string("as"), jv_string(as));
meta = jv_object_set(meta, jv_string("is_data"), is_data ? jv_true() : jv_false());
meta = jv_object_set(meta, jv_string("relpath"), jv_string(name));
i->imm.constant = meta;
- block_free(metadata);
return inst_block(i);
}
+block gen_import_meta(block import, block metadata) {
+ assert(block_is_single(import) && import.first->op == DEPS);
+ assert(block_is_const(metadata) && block_const_kind(metadata) == JV_KIND_OBJECT);
+ inst *i = import.first;
+ i->imm.constant = jv_object_merge(block_const(metadata), i->imm.constant);
+ block_free(metadata);
+ return import;
+}
+
block gen_function(const char* name, block formals, block body) {
inst* i = inst_new(CLOSURE_CREATE);
for (inst* i = formals.last; i; i = i->prev) {