bool genexe(compile_t* c, ast_t* program) { // The first package is the main package. It has to have a Main actor. const char* main_actor = stringtab("Main"); const char* env_class = stringtab("Env"); ast_t* package = ast_child(program); ast_t* main_def = ast_get(package, main_actor, NULL); if(main_def == NULL) { errorf(NULL, "no Main actor found in package '%s'", c->filename); return false; } // Generate the Main actor and the Env class. ast_t* main_ast = type_builtin(c->opt, main_def, main_actor); ast_t* env_ast = type_builtin(c->opt, main_def, env_class); genprim_reachable_init(c, program); reach(c->reachable, main_ast, stringtab("create"), NULL); reach(c->reachable, env_ast, stringtab("_create"), NULL); paint(c->reachable); gentype_t main_g; gentype_t env_g; bool ok = gentype(c, main_ast, &main_g) && gentype(c, env_ast, &env_g); if(ok) gen_main(c, &main_g, &env_g); ast_free_unattached(main_ast); ast_free_unattached(env_ast); if(!ok) return false; if(!genopt(c)) return false; const char* file_o = genobj(c); if(file_o == NULL) return false; if(c->opt->limit < PASS_ALL) return true; if(!link_exe(c, program, file_o)) return false; #ifdef PLATFORM_IS_WINDOWS _unlink(file_o); #else unlink(file_o); #endif return true; }
int main(int argc, char **argv) { progname = argv[0]; buf_init(module, INIT_MODS, 1, struct _module, "modules"); buf_init(dep, INIT_MODS, 1, int, "dependencies"); stack_size = STACK_SIZE; get_options(argc, argv); if (nfiles == 0 && !dump) panic("no input files"); if (stdlib && libdir == NULL) panic("no libdir specified"); if (rtlibdir == NULL) rtlibdir = libdir; make_prim("INTERP"); make_prim("DLTRAP"); #define bind(x) def_global(find_symbol(#x), ABS, x, X_SYM) bind(GC_BASE); bind(GC_REPEAT); bind(GC_BLOCK); bind(GC_MAP); bind(GC_FLEX); bind(GC_END); bind(E_CAST); bind(E_ASSIGN); bind(E_CASE); bind(E_WITH); bind(E_ASSERT); bind(E_RETURN); bind(E_BOUND); bind(E_NULL); bind(E_DIV); bind(E_FDIV); bind(E_STACK); bind(E_GLOB); /* First pass -- check for dependencies */ scan_files(); /* Compute needed modules */ buf_grow(module); module[nmodules].m_dep = ndeps; trace_imports(); if (status != 0) return status; /* Second pass -- link the modules that are needed */ if (!dump) { init_linker(outname, interp); load_needed(); gen_main(); if (rtlibdir != NULL) save_string("LIBDIR", rtlibdir); end_linking(); } if (dump || custom) { printf("/* Primitive table -- generated by oblink */\n\n"); printf("#include \"obx.h\"\n\n"); dump_prims(stdout); } return status; }
/** Generates the GUI class * */ void PyGuiWriter::generate(const vector<symbol::Argument *> &args) { indent() << "class GUI:\n"; indent_inc(); gen_init(args); gen_update(); gen_delete(); gen_destroy(); gen_save_methods(); gen_menu_callbacks(); gen_main(); gen_create_methods(); }
bool genexe(compile_t* c, ast_t* program) { errors_t* errors = c->opt->check.errors; // The first package is the main package. It has to have a Main actor. const char* main_actor = c->str_Main; const char* env_class = c->str_Env; ast_t* package = ast_child(program); ast_t* main_def = ast_get(package, main_actor, NULL); if(main_def == NULL) { errorf(errors, NULL, "no Main actor found in package '%s'", c->filename); return false; } // Generate the Main actor and the Env class. ast_t* main_ast = type_builtin(c->opt, main_def, main_actor); ast_t* env_ast = type_builtin(c->opt, main_def, env_class); if(lookup(c->opt, main_ast, main_ast, c->str_create) == NULL) return false; if(c->opt->verbosity >= VERBOSITY_INFO) fprintf(stderr, " Reachability\n"); reach(c->reach, main_ast, c->str_create, NULL, c->opt); reach(c->reach, env_ast, c->str__create, NULL, c->opt); if(c->opt->limit == PASS_REACH) return true; if(c->opt->verbosity >= VERBOSITY_INFO) fprintf(stderr, " Selector painting\n"); paint(&c->reach->types); if(c->opt->limit == PASS_PAINT) return true; if(!gentypes(c)) return false; if(c->opt->verbosity >= VERBOSITY_ALL) reach_dump(c->reach); reach_type_t* t_main = reach_type(c->reach, main_ast); reach_type_t* t_env = reach_type(c->reach, env_ast); if((t_main == NULL) || (t_env == NULL)) return false; gen_main(c, t_main, t_env); if(!genopt(c, true)) return false; if(c->opt->runtimebc) { if(!codegen_merge_runtime_bitcode(c)) return false; // Rerun the optimiser without the Pony-specific optimisation passes. // Inlining runtime functions can screw up these passes so we can't // run the optimiser only once after merging. if(!genopt(c, false)) return false; } const char* file_o = genobj(c); if(file_o == NULL) return false; if(c->opt->limit < PASS_ALL) return true; if(!link_exe(c, program, file_o)) return false; #ifdef PLATFORM_IS_WINDOWS _unlink(file_o); #else unlink(file_o); #endif return true; }
bool genexe(compile_t* c, ast_t* program) { errors_t* errors = c->opt->check.errors; // The first package is the main package. It has to have a Main actor. const char* main_actor = c->str_Main; const char* env_class = c->str_Env; ast_t* package = ast_child(program); ast_t* main_def = ast_get(package, main_actor, NULL); if(main_def == NULL) { errorf(errors, NULL, "no Main actor found in package '%s'", c->filename); return false; } // Generate the Main actor and the Env class. ast_t* main_ast = type_builtin(c->opt, main_def, main_actor); ast_t* env_ast = type_builtin(c->opt, main_def, env_class); if(lookup(NULL, main_ast, main_ast, c->str_create) == NULL) return false; if(c->opt->verbosity >= VERBOSITY_INFO) fprintf(stderr, " Reachability\n"); reach(c->reach, main_ast, c->str_create, NULL, c->opt); reach(c->reach, env_ast, c->str__create, NULL, c->opt); if(c->opt->limit == PASS_REACH) return true; if(c->opt->verbosity >= VERBOSITY_INFO) fprintf(stderr, " Selector painting\n"); paint(&c->reach->types); if(c->opt->limit == PASS_PAINT) return true; if(!gentypes(c)) return false; if(c->opt->verbosity >= VERBOSITY_ALL) reach_dump(c->reach); reach_type_t* t_main = reach_type(c->reach, main_ast); reach_type_t* t_env = reach_type(c->reach, env_ast); if((t_main == NULL) || (t_env == NULL)) return false; gen_main(c, t_main, t_env); if(!genopt(c)) return false; const char* file_o = genobj(c); if(file_o == NULL) return false; if(c->opt->limit < PASS_ALL) return true; if(!link_exe(c, program, file_o)) return false; #ifdef PLATFORM_IS_WINDOWS _unlink(file_o); #else unlink(file_o); #endif return true; }