static Handle<Code> MakeCode(FunctionLiteral* literal, Handle<Script> script, Handle<Context> context, bool is_eval) { ASSERT(literal != NULL); // Rewrite the AST by introducing .result assignments where needed. if (!Rewriter::Process(literal) || !AnalyzeVariableUsage(literal)) { // Signal a stack overflow by returning a null handle. The stack // overflow exception will be thrown by the caller. return Handle<Code>::null(); } { // Compute top scope and allocate variables. For lazy compilation // the top scope only contains the single lazily compiled function, // so this doesn't re-allocate variables repeatedly. HistogramTimerScope timer(&Counters::variable_allocation); Scope* top = literal->scope(); while (top->outer_scope() != NULL) top = top->outer_scope(); top->AllocateVariables(context); } #ifdef DEBUG if (Bootstrapper::IsActive() ? FLAG_print_builtin_scopes : FLAG_print_scopes) { literal->scope()->Print(); } #endif // Optimize the AST. if (!Rewriter::Optimize(literal)) { // Signal a stack overflow by returning a null handle. The stack // overflow exception will be thrown by the caller. return Handle<Code>::null(); } if (FLAG_multipass) { CfgGlobals scope(literal); Cfg* cfg = Cfg::Build(); #ifdef DEBUG if (FLAG_print_cfg && cfg != NULL) { SmartPointer<char> name = literal->name()->ToCString(); PrintF("Function \"%s\":\n", *name); cfg->Print(); PrintF("\n"); } #endif if (cfg != NULL) { return cfg->Compile(script); } } // Generate code and return it. Handle<Code> result = CodeGenerator::MakeCode(literal, script, is_eval); return result; }