value_t assembler_flush(assembler_t *assm) { // Copy the bytecode into a blob object. blob_t code_blob; short_buffer_flush(&assm->code, &code_blob); TRY_DEF(bytecode, new_heap_blob_with_data(assm->runtime, &code_blob)); // Invert the constant pool map into an array. value_t value_pool_map = assm->value_pool; size_t value_pool_size = get_id_hash_map_size(value_pool_map); TRY_DEF(value_pool, new_heap_array(assm->runtime, value_pool_size)); id_hash_map_iter_t iter; id_hash_map_iter_init(&iter, value_pool_map); size_t entries_seen = 0; while (id_hash_map_iter_advance(&iter)) { value_t key; value_t value; id_hash_map_iter_get_current(&iter, &key, &value); size_t index = get_integer_value(value); // Check that the entry hasn't been set already. CHECK_PHYLUM(tpNull, get_array_at(value_pool, index)); set_array_at(value_pool, index, key); entries_seen++; } CHECK_EQ("wrong number of entries", entries_seen, value_pool_size); return new_heap_code_block(assm->runtime, bytecode, value_pool, assm->high_water_mark); }
// Checks whether a fragment entry for the given stage and path already exists // and if not creates it. static value_t binding_context_ensure_fragment_entry(binding_context_t *context, value_t stage, value_t path, value_t fragment, bool *created) { CHECK_PHYLUM(tpStageOffset, stage); CHECK_FAMILY(ofPath, path); CHECK_FAMILY_OPT(ofUnboundModuleFragment, fragment); value_t path_map = context->fragment_entry_map; runtime_t *runtime = get_ambience_runtime(context->ambience); if (!has_id_hash_map_at(path_map, path)) { TRY_DEF(stage_map, new_heap_id_hash_map(runtime, 16)); TRY(set_id_hash_map_at(runtime, path_map, path, stage_map)); } value_t stage_map = get_id_hash_map_at(path_map, path); if (!has_id_hash_map_at(stage_map, stage)) { TRY_DEF(imports, new_heap_array_buffer(runtime, 4)); TRY_DEF(ident, new_heap_identifier(runtime, stage, path)); TRY_DEF(entry, new_heap_triple(runtime, fragment, imports, ident)); TRY(set_id_hash_map_at(runtime, stage_map, stage, entry)); *created = true; } return get_id_hash_map_at(stage_map, stage); }
value_t derived_object_validate(value_t value) { value_t anchor = get_derived_object_anchor(value); CHECK_PHYLUM(tpDerivedObjectAnchor, anchor); genus_descriptor_t *desc = get_genus_descriptor(get_derived_object_anchor_genus(anchor)); return (desc->validate)(value); }