Index: src/codegen.cc |
=================================================================== |
--- src/codegen.cc (revision 3062) |
+++ src/codegen.cc (working copy) |
@@ -125,18 +125,7 @@ |
} |
-// Generate the code. Takes a function literal, generates code for it, assemble |
-// all the pieces into a Code object. This function is only to be called by |
-// the compiler.cc code. |
-Handle<Code> CodeGenerator::MakeCode(FunctionLiteral* flit, |
- Handle<Script> script, |
- bool is_eval) { |
-#ifdef ENABLE_DISASSEMBLER |
- bool print_code = Bootstrapper::IsActive() |
- ? FLAG_print_builtin_code |
- : FLAG_print_code; |
-#endif |
- |
+void CodeGenerator::MakeCodePrologue(FunctionLiteral* fun) { |
#ifdef DEBUG |
bool print_source = false; |
bool print_ast = false; |
@@ -157,78 +146,93 @@ |
if (FLAG_trace_codegen || print_source || print_ast) { |
PrintF("*** Generate code for %s function: ", ftype); |
- flit->name()->ShortPrint(); |
+ fun->name()->ShortPrint(); |
PrintF(" ***\n"); |
} |
if (print_source) { |
- PrintF("--- Source from AST ---\n%s\n", PrettyPrinter().PrintProgram(flit)); |
+ PrintF("--- Source from AST ---\n%s\n", PrettyPrinter().PrintProgram(fun)); |
} |
if (print_ast) { |
- PrintF("--- AST ---\n%s\n", AstPrinter().PrintProgram(flit)); |
+ PrintF("--- AST ---\n%s\n", AstPrinter().PrintProgram(fun)); |
} |
if (print_json_ast) { |
JsonAstBuilder builder; |
- PrintF("%s", builder.BuildProgram(flit)); |
+ PrintF("%s", builder.BuildProgram(fun)); |
} |
#endif // DEBUG |
+} |
- // Generate code. |
- const int initial_buffer_size = 4 * KB; |
- CodeGenerator cgen(initial_buffer_size, script, is_eval); |
- CodeGeneratorScope scope(&cgen); |
- cgen.GenCode(flit); |
- if (cgen.HasStackOverflow()) { |
- ASSERT(!Top::has_pending_exception()); |
- return Handle<Code>::null(); |
- } |
- // Allocate and install the code. Time the rest of this function as |
- // code creation. |
- HistogramTimerScope timer(&Counters::code_creation); |
+Handle<Code> CodeGenerator::MakeCodeEpilogue(FunctionLiteral* fun, |
+ MacroAssembler* masm, |
+ Code::Flags flags, |
+ Handle<Script> script) { |
+ // Allocate and install the code. |
CodeDesc desc; |
- cgen.masm()->GetCode(&desc); |
- ZoneScopeInfo sinfo(flit->scope()); |
- InLoopFlag in_loop = (cgen.loop_nesting() != 0) ? IN_LOOP : NOT_IN_LOOP; |
- Code::Flags flags = Code::ComputeFlags(Code::FUNCTION, in_loop); |
- Handle<Code> code = Factory::NewCode(desc, |
- &sinfo, |
- flags, |
- cgen.masm()->CodeObject()); |
+ masm->GetCode(&desc); |
+ ZoneScopeInfo sinfo(fun->scope()); |
+ Handle<Code> code = |
+ Factory::NewCode(desc, &sinfo, flags, masm->CodeObject()); |
// Add unresolved entries in the code to the fixup list. |
- Bootstrapper::AddFixup(*code, cgen.masm()); |
+ Bootstrapper::AddFixup(*code, masm); |
#ifdef ENABLE_DISASSEMBLER |
+ bool print_code = Bootstrapper::IsActive() |
+ ? FLAG_print_builtin_code |
+ : FLAG_print_code; |
if (print_code) { |
// Print the source code if available. |
if (!script->IsUndefined() && !script->source()->IsUndefined()) { |
PrintF("--- Raw source ---\n"); |
StringInputBuffer stream(String::cast(script->source())); |
- stream.Seek(flit->start_position()); |
- // flit->end_position() points to the last character in the stream. We |
+ stream.Seek(fun->start_position()); |
+ // fun->end_position() points to the last character in the stream. We |
// need to compensate by adding one to calculate the length. |
- int source_len = flit->end_position() - flit->start_position() + 1; |
+ int source_len = fun->end_position() - fun->start_position() + 1; |
for (int i = 0; i < source_len; i++) { |
if (stream.has_more()) PrintF("%c", stream.GetNext()); |
} |
PrintF("\n\n"); |
} |
PrintF("--- Code ---\n"); |
- code->Disassemble(*flit->name()->ToCString()); |
+ code->Disassemble(*fun->name()->ToCString()); |
} |
#endif // ENABLE_DISASSEMBLER |
if (!code.is_null()) { |
Counters::total_compiled_code_size.Increment(code->instruction_size()); |
} |
- |
return code; |
} |
+// Generate the code. Takes a function literal, generates code for it, assemble |
+// all the pieces into a Code object. This function is only to be called by |
+// the compiler.cc code. |
+Handle<Code> CodeGenerator::MakeCode(FunctionLiteral* fun, |
+ Handle<Script> script, |
+ bool is_eval) { |
+ MakeCodePrologue(fun); |
+ // Generate code. |
+ const int kInitialBufferSize = 4 * KB; |
+ CodeGenerator cgen(kInitialBufferSize, script, is_eval); |
+ CodeGeneratorScope scope(&cgen); |
+ cgen.GenCode(fun); |
+ if (cgen.HasStackOverflow()) { |
+ ASSERT(!Top::has_pending_exception()); |
+ return Handle<Code>::null(); |
+ } |
+ |
+ InLoopFlag in_loop = (cgen.loop_nesting() != 0) ? IN_LOOP : NOT_IN_LOOP; |
+ Code::Flags flags = Code::ComputeFlags(Code::FUNCTION, in_loop); |
+ return MakeCodeEpilogue(fun, cgen.masm(), flags, script); |
+} |
+ |
+ |
#ifdef ENABLE_LOGGING_AND_PROFILING |
bool CodeGenerator::ShouldGenerateLog(Expression* type) { |