static void execute_file(const char* fn, List* args) { executor = new Executor(); GC::add_root(executor); Frame* frame; { String* s = read_file(fn); Lexer* l = new Lexer(fn, s); Parser* p = new Parser(l); p->parse(); AST* ast = p->get_ast(); #if 0 ast->debug_print(); std::cout << '\n'; #endif dec_ref(s); dec_ref(l); dec_ref(p); Code* code = new Code(); code->compile(ast, false); #if 0 code->debug_print(); std::cout << '\n'; #endif dec_ref(ast); BuiltIn* std = new BuiltIn(); Std2* std2 = new Std2(); Resolver* resolver = new Resolver(); String* lib_dir = new String(LIB_DIR); Scope* scope = new Scope(0); scope->set_local("builtin", *std); scope->set_local("std2", *std2); scope->set_local("resolver", *resolver); scope->set_local("lib_dir", *lib_dir); scope->set_local("args", args ? (ObjP)*args : 0); frame = new Frame(scope, 0, code); dec_ref(code); dec_ref(lib_dir); dec_ref(args); dec_ref(std); } executor->set_frame(frame); dec_ref(frame); do { if (executor->get_frame()) executor->execute(); get_selector()->select(); } while (!get_selector()->empty() || executor->get_frame()); dec_ref(executor); GC::del_root(executor); executor = 0; }