Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 139 CompilationZoneScope zone_scope(DELETE_ON_EXIT); | 139 CompilationZoneScope zone_scope(DELETE_ON_EXIT); |
| 140 | 140 |
| 141 PostponeInterruptsScope postpone; | 141 PostponeInterruptsScope postpone; |
| 142 | 142 |
| 143 ASSERT(!i::Top::global_context().is_null()); | 143 ASSERT(!i::Top::global_context().is_null()); |
| 144 script->set_context_data((*i::Top::global_context())->data()); | 144 script->set_context_data((*i::Top::global_context())->data()); |
| 145 | 145 |
| 146 bool is_json = (validate == Compiler::VALIDATE_JSON); | 146 bool is_json = (validate == Compiler::VALIDATE_JSON); |
| 147 #ifdef ENABLE_DEBUGGER_SUPPORT | 147 #ifdef ENABLE_DEBUGGER_SUPPORT |
| 148 if (is_eval || is_json) { | 148 if (is_eval || is_json) { |
| 149 script->set_compilation_type( | 149 Script::CompilationType compilation_type = is_json |
| 150 is_json ? Smi::FromInt(Script::COMPILATION_TYPE_JSON) : | 150 ? Script::COMPILATION_TYPE_JSON |
| 151 Smi::FromInt(Script::COMPILATION_TYPE_EVAL)); | 151 : Script::COMPILATION_TYPE_EVAL; |
| 152 script->set_compilation_type(Smi::FromInt(compilation_type)); | |
| 152 // For eval scripts add information on the function from which eval was | 153 // For eval scripts add information on the function from which eval was |
| 153 // called. | 154 // called. |
| 154 if (is_eval) { | 155 if (is_eval) { |
| 155 StackTraceFrameIterator it; | 156 StackTraceFrameIterator it; |
| 156 if (!it.done()) { | 157 if (!it.done()) { |
| 157 script->set_eval_from_shared( | 158 script->set_eval_from_shared( |
| 158 JSFunction::cast(it.frame()->function())->shared()); | 159 JSFunction::cast(it.frame()->function())->shared()); |
| 159 int offset = static_cast<int>( | 160 int offset = static_cast<int>( |
| 160 it.frame()->pc() - it.frame()->code()->instruction_start()); | 161 it.frame()->pc() - it.frame()->code()->instruction_start()); |
| 161 script->set_eval_from_instructions_offset(Smi::FromInt(offset)); | 162 script->set_eval_from_instructions_offset(Smi::FromInt(offset)); |
| 162 } | 163 } |
| 163 } | 164 } |
| 164 } | 165 } |
| 165 | 166 |
| 166 // Notify debugger | 167 // Notify debugger |
| 167 Debugger::OnBeforeCompile(script); | 168 Debugger::OnBeforeCompile(script); |
| 168 #endif | 169 #endif |
| 169 | 170 |
| 170 // Only allow non-global compiles for eval. | 171 // Only allow non-global compiles for eval. |
| 171 ASSERT(is_eval || is_global); | 172 ASSERT(is_eval || is_global); |
| 172 | 173 |
| 173 // Build AST. | 174 // Build AST. |
| 175 EagerCompilationInfo info(script, is_eval); | |
| 174 FunctionLiteral* lit = | 176 FunctionLiteral* lit = |
| 175 MakeAST(is_global, script, extension, pre_data, is_json); | 177 MakeAST(is_global, script, extension, pre_data, is_json); |
| 176 | 178 |
| 177 LiveEditFunctionTracker live_edit_tracker(lit); | |
| 178 | |
| 179 // Check for parse errors. | 179 // Check for parse errors. |
| 180 if (lit == NULL) { | 180 if (lit == NULL) { |
| 181 ASSERT(Top::has_pending_exception()); | 181 ASSERT(Top::has_pending_exception()); |
| 182 return Handle<SharedFunctionInfo>::null(); | 182 return Handle<SharedFunctionInfo>::null(); |
| 183 } | 183 } |
| 184 info.set_function(lit); | |
|
Søren Thygesen Gjesse
2010/09/30 08:41:49
Why not pass the function literal to the EagerComp
Kevin Millikin (Google)
2010/09/30 08:47:21
I plan to refactor the parser entry points to take
| |
| 184 | 185 |
| 185 // Measure how long it takes to do the compilation; only take the | 186 // Measure how long it takes to do the compilation; only take the |
| 186 // rest of the function into account to avoid overlap with the | 187 // rest of the function into account to avoid overlap with the |
| 187 // parsing statistics. | 188 // parsing statistics. |
| 188 HistogramTimer* rate = is_eval | 189 HistogramTimer* rate = is_eval |
| 189 ? &Counters::compile_eval | 190 ? &Counters::compile_eval |
| 190 : &Counters::compile; | 191 : &Counters::compile; |
| 191 HistogramTimerScope timer(rate); | 192 HistogramTimerScope timer(rate); |
| 192 | 193 |
| 193 // Compile the code. | 194 // Compile the code. |
| 194 CompilationInfo info(lit, script, is_eval); | 195 LiveEditFunctionTracker live_edit_tracker(lit); |
| 195 Handle<Code> code = MakeCode(context, &info); | 196 Handle<Code> code = MakeCode(context, &info); |
| 196 | 197 |
| 197 // Check for stack-overflow exceptions. | 198 // Check for stack-overflow exceptions. |
| 198 if (code.is_null()) { | 199 if (code.is_null()) { |
| 199 Top::StackOverflow(); | 200 Top::StackOverflow(); |
| 200 return Handle<SharedFunctionInfo>::null(); | 201 return Handle<SharedFunctionInfo>::null(); |
| 201 } | 202 } |
| 202 | 203 |
| 203 if (script->name()->IsString()) { | 204 if (script->name()->IsString()) { |
| 204 PROFILE(CodeCreateEvent( | 205 PROFILE(CodeCreateEvent( |
| (...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 475 } else { | 476 } else { |
| 476 // The bodies of function literals have not yet been visited by | 477 // The bodies of function literals have not yet been visited by |
| 477 // the AST optimizer/analyzer. | 478 // the AST optimizer/analyzer. |
| 478 if (!Rewriter::Optimize(literal)) { | 479 if (!Rewriter::Optimize(literal)) { |
| 479 return Handle<SharedFunctionInfo>::null(); | 480 return Handle<SharedFunctionInfo>::null(); |
| 480 } | 481 } |
| 481 | 482 |
| 482 // Generate code and return it. The way that the compilation mode | 483 // Generate code and return it. The way that the compilation mode |
| 483 // is controlled by the command-line flags is described in | 484 // is controlled by the command-line flags is described in |
| 484 // the static helper function MakeCode. | 485 // the static helper function MakeCode. |
| 485 CompilationInfo info(literal, script, false); | 486 EagerCompilationInfo info(script, false); |
| 487 info.set_function(literal); | |
| 486 | 488 |
| 487 bool is_run_once = literal->try_full_codegen(); | 489 bool is_run_once = literal->try_full_codegen(); |
| 488 bool use_full = FLAG_full_compiler && !literal->contains_loops(); | 490 bool use_full = FLAG_full_compiler && !literal->contains_loops(); |
| 489 if (AlwaysFullCompiler() || (use_full && is_run_once)) { | 491 if (AlwaysFullCompiler() || (use_full && is_run_once)) { |
| 490 code = FullCodeGenerator::MakeCode(&info); | 492 code = FullCodeGenerator::MakeCode(&info); |
| 491 } else { | 493 } else { |
| 492 // We fall back to the classic V8 code generator. | 494 // We fall back to the classic V8 code generator. |
| 493 AssignedVariablesAnalyzer ava(literal); | 495 AssignedVariablesAnalyzer ava(literal); |
| 494 if (!ava.Analyze()) return Handle<SharedFunctionInfo>::null(); | 496 if (!ava.Analyze()) return Handle<SharedFunctionInfo>::null(); |
| 495 code = CodeGenerator::MakeCode(&info); | 497 code = CodeGenerator::MakeCode(&info); |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 581 PROFILE(CodeCreateEvent(Logger::ToNativeByScript(tag, *script), | 583 PROFILE(CodeCreateEvent(Logger::ToNativeByScript(tag, *script), |
| 582 *code, *func_name)); | 584 *code, *func_name)); |
| 583 OPROFILE(CreateNativeCodeRegion(*func_name, | 585 OPROFILE(CreateNativeCodeRegion(*func_name, |
| 584 code->instruction_start(), | 586 code->instruction_start(), |
| 585 code->instruction_size())); | 587 code->instruction_size())); |
| 586 } | 588 } |
| 587 } | 589 } |
| 588 } | 590 } |
| 589 | 591 |
| 590 } } // namespace v8::internal | 592 } } // namespace v8::internal |
| OLD | NEW |