Index: src/compiler.cc |
=================================================================== |
--- src/compiler.cc (revision 3788) |
+++ src/compiler.cc (working copy) |
@@ -43,15 +43,11 @@ |
namespace internal { |
-static Handle<Code> MakeCode(FunctionLiteral* literal, |
- Handle<Script> script, |
- Handle<Context> context, |
- bool is_eval, |
- CompilationInfo* info) { |
- ASSERT(literal != NULL); |
- |
+static Handle<Code> MakeCode(Handle<Context> context, CompilationInfo* info) { |
+ FunctionLiteral* function = info->function(); |
+ ASSERT(function != NULL); |
// Rewrite the AST by introducing .result assignments where needed. |
- if (!Rewriter::Process(literal) || !AnalyzeVariableUsage(literal)) { |
+ if (!Rewriter::Process(function) || !AnalyzeVariableUsage(function)) { |
// Signal a stack overflow by returning a null handle. The stack |
// overflow exception will be thrown by the caller. |
return Handle<Code>::null(); |
@@ -62,7 +58,7 @@ |
// 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(); |
+ Scope* top = info->scope(); |
while (top->outer_scope() != NULL) top = top->outer_scope(); |
top->AllocateVariables(context); |
} |
@@ -71,12 +67,12 @@ |
if (Bootstrapper::IsActive() ? |
FLAG_print_builtin_scopes : |
FLAG_print_scopes) { |
- literal->scope()->Print(); |
+ info->scope()->Print(); |
} |
#endif |
// Optimize the AST. |
- if (!Rewriter::Optimize(literal)) { |
+ if (!Rewriter::Optimize(function)) { |
// Signal a stack overflow by returning a null handle. The stack |
// overflow exception will be thrown by the caller. |
return Handle<Code>::null(); |
@@ -98,25 +94,25 @@ |
Handle<SharedFunctionInfo> shared = info->shared_info(); |
bool is_run_once = (shared.is_null()) |
- ? literal->scope()->is_global_scope() |
+ ? info->scope()->is_global_scope() |
: (shared->is_toplevel() || shared->try_full_codegen()); |
if (FLAG_always_full_compiler || (FLAG_full_compiler && is_run_once)) { |
FullCodeGenSyntaxChecker checker; |
- checker.Check(literal); |
+ checker.Check(function); |
if (checker.has_supported_syntax()) { |
- return FullCodeGenerator::MakeCode(literal, script, is_eval); |
+ return FullCodeGenerator::MakeCode(info); |
} |
} else if (FLAG_always_fast_compiler || |
(FLAG_fast_compiler && !is_run_once)) { |
FastCodeGenSyntaxChecker checker; |
- checker.Check(literal, info); |
+ checker.Check(info); |
if (checker.has_supported_syntax()) { |
- return FastCodeGenerator::MakeCode(literal, script, is_eval, info); |
+ return FastCodeGenerator::MakeCode(info); |
} |
} |
- return CodeGenerator::MakeCode(literal, script, is_eval, info); |
+ return CodeGenerator::MakeCode(info); |
} |
@@ -180,10 +176,8 @@ |
HistogramTimerScope timer(rate); |
// Compile the code. |
- CompilationInfo info(Handle<SharedFunctionInfo>::null(), |
- Handle<Object>::null(), // No receiver. |
- 0); // Not nested in a loop. |
- Handle<Code> code = MakeCode(lit, script, context, is_eval, &info); |
+ CompilationInfo info(lit, script, is_eval); |
+ Handle<Code> code = MakeCode(context, &info); |
// Check for stack-overflow exceptions. |
if (code.is_null()) { |
@@ -355,7 +349,6 @@ |
// Compute name, source code and script data. |
Handle<SharedFunctionInfo> shared = info->shared_info(); |
Handle<String> name(String::cast(shared->name())); |
- Handle<Script> script(Script::cast(shared->script())); |
int start_position = shared->start_position(); |
int end_position = shared->end_position(); |
@@ -364,7 +357,8 @@ |
// Generate the AST for the lazily compiled function. The AST may be |
// NULL in case of parser stack overflow. |
- FunctionLiteral* lit = MakeLazyAST(script, name, |
+ FunctionLiteral* lit = MakeLazyAST(info->script(), |
+ name, |
start_position, |
end_position, |
is_expression); |
@@ -374,6 +368,7 @@ |
ASSERT(Top::has_pending_exception()); |
return false; |
} |
+ info->set_function(lit); |
// Measure how long it takes to do the lazy compilation; only take |
// the rest of the function into account to avoid overlap with the |
@@ -381,11 +376,7 @@ |
HistogramTimerScope timer(&Counters::compile_lazy); |
// Compile the code. |
- Handle<Code> code = MakeCode(lit, |
- script, |
- Handle<Context>::null(), |
- false, |
- info); |
+ Handle<Code> code = MakeCode(Handle<Context>::null(), info); |
// Check for stack-overflow exception. |
if (code.is_null()) { |
@@ -400,6 +391,7 @@ |
if (Logger::is_logging() || OProfileAgent::is_enabled()) { |
Handle<String> func_name(name->length() > 0 ? |
*name : shared->inferred_name()); |
+ Handle<Script> script = info->script(); |
if (script->name()->IsString()) { |
int line_num = GetScriptLineNumber(script, start_position) + 1; |
LOG(CodeCreateEvent(Logger::LAZY_COMPILE_TAG, *code, *func_name, |
@@ -466,9 +458,7 @@ |
// Generate code and return it. The way that the compilation mode |
// is controlled by the command-line flags is described in |
// the static helper function MakeCode. |
- CompilationInfo info(Handle<SharedFunctionInfo>::null(), |
- Handle<Object>::null(), // No receiver. |
- 0); // Not nested in a loop. |
+ CompilationInfo info(literal, script, false); |
CHECK(!FLAG_always_full_compiler || !FLAG_always_fast_compiler); |
bool is_run_once = literal->try_full_codegen(); |
@@ -477,9 +467,7 @@ |
FullCodeGenSyntaxChecker checker; |
checker.Check(literal); |
if (checker.has_supported_syntax()) { |
- code = FullCodeGenerator::MakeCode(literal, |
- script, |
- false); // Not eval. |
+ code = FullCodeGenerator::MakeCode(&info); |
is_compiled = true; |
} |
} else if (FLAG_always_fast_compiler || |
@@ -487,19 +475,16 @@ |
// Since we are not lazily compiling we do not have a receiver to |
// specialize for. |
FastCodeGenSyntaxChecker checker; |
- checker.Check(literal, &info); |
+ checker.Check(&info); |
if (checker.has_supported_syntax()) { |
- code = FastCodeGenerator::MakeCode(literal, script, false, &info); |
+ code = FastCodeGenerator::MakeCode(&info); |
is_compiled = true; |
} |
} |
if (!is_compiled) { |
// We fall back to the classic V8 code generator. |
- code = CodeGenerator::MakeCode(literal, |
- script, |
- false, // Not eval. |
- &info); |
+ code = CodeGenerator::MakeCode(&info); |
} |
// Check for stack-overflow exception. |