static bool reachable_actors(compile_t* c, ast_t* program) { errors_t* errors = c->opt->check.errors; if(c->opt->verbosity >= VERBOSITY_INFO) fprintf(stderr, " Library reachability\n"); // Look for C-API actors in every package. bool found = false; ast_t* package = ast_child(program); while(package != NULL) { ast_t* module = ast_child(package); while(module != NULL) { ast_t* entity = ast_child(module); while(entity != NULL) { if(ast_id(entity) == TK_ACTOR) { ast_t* c_api = ast_childidx(entity, 5); if(ast_id(c_api) == TK_AT) { // We have an actor marked as C-API. if(!reachable_methods(c, entity)) return false; found = true; } } entity = ast_sibling(entity); } module = ast_sibling(module); } package = ast_sibling(package); } if(!found) { errorf(errors, NULL, "no C-API actors found in package '%s'", c->filename); return false; } if(c->opt->verbosity >= VERBOSITY_INFO) fprintf(stderr, " Selector painting\n"); paint(&c->reach->types); plugin_visit_reach(c->reach, c->opt, true); return true; }
static bool reachable_actors(compile_t* c, ast_t* program) { // Look for C-API actors in every package. bool found = false; ast_t* package = ast_child(program); while(package != NULL) { ast_t* module = ast_child(package); while(module != NULL) { ast_t* entity = ast_child(module); while(entity != NULL) { if(ast_id(entity) == TK_ACTOR) { ast_t* c_api = ast_childidx(entity, 5); if(ast_id(c_api) == TK_AT) { // We have an actor marked as C-API. if(!reachable_methods(c, entity)) return false; found = true; } } entity = ast_sibling(entity); } module = ast_sibling(module); } package = ast_sibling(package); } if(!found) { errorf(NULL, "no C-API actors found in package '%s'", c->filename); return false; } paint(c->reachable); return true; }