diff options
author | David Tolnay <dtolnay@gmail.com> | 2015-08-11 23:26:51 -0700 |
---|---|---|
committer | David Tolnay <dtolnay@gmail.com> | 2015-08-13 21:42:35 -0700 |
commit | 5479d7f2dc39c138fc8f5606c4538b4c3fbb6bc3 (patch) | |
tree | eb937422955284f3f2307e4f36a5d83946adcc36 /compile.c | |
parent | a5b2c55a708159334997529dd5480653adbede1e (diff) |
Fix assert fail on non-object import metadata (fix #900)
Diffstat (limited to 'compile.c')
-rw-r--r-- | compile.c | 19 |
1 files changed, 11 insertions, 8 deletions
@@ -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) { |