bool genfun_method_bodies(compile_t* c, reachable_type_t* t) { switch(t->underlying) { case TK_PRIMITIVE: case TK_STRUCT: case TK_CLASS: case TK_ACTOR: break; default: return true; } 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) { if(m->intrinsic) continue; switch(ast_id(m->r_fun)) { case TK_NEW: if(t->underlying == TK_ACTOR) { if(!genfun_newbe(c, t, m)) return false; } else { if(!genfun_new(c, t, m)) return false; } break; case TK_BE: if(!genfun_be(c, t, m)) return false; break; case TK_FUN: if(!genfun_fun(c, t, m)) return false; break; default: assert(0); return false; } } } return true; }
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; }