bool genfun_methods(compile_t* c, gentype_t* g) { reachable_type_t* t = reach_type(c->reachable, g->type_name); size_t i = HASHMAP_BEGIN; reachable_method_name_t* n; while((n = reachable_method_names_next(&t->methods, &i)) != NULL) { size_t j = HASHMAP_BEGIN; reachable_method_t* m; LLVMValueRef fun; while((m = reachable_methods_next(&n->r_methods, &j)) != NULL) { switch(ast_id(m->r_fun)) { case TK_NEW: if(g->underlying == TK_ACTOR) fun = genfun_newbe(c, g, n->name, m->typeargs); else fun = genfun_new(c, g, n->name, m->typeargs); break; case TK_BE: fun = genfun_be(c, g, n->name, m->typeargs); break; case TK_FUN: fun = genfun_fun(c, g, n->name, m->typeargs); break; default: fun = NULL; break; } if(fun == NULL) return false; } } if(!genfun_allocator(c, g)) return false; return true; }
bool genfun_method_sigs(compile_t* c, reachable_type_t* t) { size_t i = HASHMAP_BEGIN; reachable_method_name_t* n; while((n = reachable_method_names_next(&t->methods, &i)) != NULL) { size_t j = HASHMAP_BEGIN; reachable_method_t* m; while((m = reachable_methods_next(&n->r_methods, &j)) != NULL) make_prototype(c, t, m); } if(!genfun_allocator(c, t)) return false; return true; }