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 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 370 bool Compiler::CompileLazy(CompilationInfo* info) { | 370 bool Compiler::CompileLazy(CompilationInfo* info) { |
| 371 CompilationZoneScope zone_scope(DELETE_ON_EXIT); | 371 CompilationZoneScope zone_scope(DELETE_ON_EXIT); |
| 372 | 372 |
| 373 // The VM is in the COMPILER state until exiting this function. | 373 // The VM is in the COMPILER state until exiting this function. |
| 374 VMState state(COMPILER); | 374 VMState state(COMPILER); |
| 375 | 375 |
| 376 PostponeInterruptsScope postpone; | 376 PostponeInterruptsScope postpone; |
| 377 | 377 |
| 378 // Compute name, source code and script data. | 378 // Compute name, source code and script data. |
| 379 Handle<SharedFunctionInfo> shared = info->shared_info(); | 379 Handle<SharedFunctionInfo> shared = info->shared_info(); |
| 380 Handle<String> name(String::cast(shared->name())); | 380 int compiled_size = shared->end_position() - shared->start_position(); |
| 381 | 381 Counters::total_compile_size.Increment(compiled_size); |
| 382 int start_position = shared->start_position(); | |
| 383 int end_position = shared->end_position(); | |
| 384 bool is_expression = shared->is_expression(); | |
| 385 Counters::total_compile_size.Increment(end_position - start_position); | |
| 386 | 382 |
| 387 // Generate the AST for the lazily compiled function. The AST may be | 383 // Generate the AST for the lazily compiled function. The AST may be |
| 388 // NULL in case of parser stack overflow. | 384 // NULL in case of parser stack overflow. |
| 389 FunctionLiteral* lit = MakeLazyAST(info->script(), | 385 FunctionLiteral* lit = MakeLazyAST(shared); |
| 390 name, | |
| 391 start_position, | |
| 392 end_position, | |
| 393 is_expression); | |
| 394 | 386 |
| 395 // Check for parse errors. | 387 // Check for parse errors. |
| 396 if (lit == NULL) { | 388 if (lit == NULL) { |
| 397 ASSERT(Top::has_pending_exception()); | 389 ASSERT(Top::has_pending_exception()); |
| 398 return false; | 390 return false; |
| 399 } | 391 } |
| 400 info->set_function(lit); | 392 info->set_function(lit); |
| 401 | 393 |
| 402 // Measure how long it takes to do the lazy compilation; only take | 394 // Measure how long it takes to do the lazy compilation; only take |
| 403 // the rest of the function into account to avoid overlap with the | 395 // the rest of the function into account to avoid overlap with the |
| 404 // lazy parsing statistics. | 396 // lazy parsing statistics. |
| 405 HistogramTimerScope timer(&Counters::compile_lazy); | 397 HistogramTimerScope timer(&Counters::compile_lazy); |
| 406 | 398 |
| 407 // Compile the code. | 399 // Compile the code. |
| 408 Handle<Code> code = MakeCode(Handle<Context>::null(), info); | 400 Handle<Code> code = MakeCode(Handle<Context>::null(), info); |
| 409 | 401 |
| 410 // Check for stack-overflow exception. | 402 // Check for stack-overflow exception. |
| 411 if (code.is_null()) { | 403 if (code.is_null()) { |
| 412 Top::StackOverflow(); | 404 Top::StackOverflow(); |
| 413 return false; | 405 return false; |
| 414 } | 406 } |
| 415 | 407 |
| 416 RecordFunctionCompilation(Logger::LAZY_COMPILE_TAG, | 408 RecordFunctionCompilation(Logger::LAZY_COMPILE_TAG, |
| 417 name, | 409 Handle<String>(String::cast(shared->name())), |
|
Lasse Reichstein
2010/09/30 09:11:41
Not your code, but how do we know that shared->nam
Kevin Millikin (Chromium)
2010/09/30 09:39:48
I actually think name should *be* a string so that
| |
| 418 Handle<String>(shared->inferred_name()), | 410 Handle<String>(shared->inferred_name()), |
| 419 start_position, | 411 shared->start_position(), |
| 420 info->script(), | 412 info->script(), |
| 421 code); | 413 code); |
| 422 | 414 |
| 423 // Update the shared function info with the compiled code and the scope info. | 415 // Update the shared function info with the compiled code and the scope info. |
| 424 // Please note, that the order of the sharedfunction initialization is | 416 // Please note, that the order of the sharedfunction initialization is |
| 425 // important since SerializedScopeInfo::Create might trigger a GC, causing | 417 // important since SerializedScopeInfo::Create might trigger a GC, causing |
| 426 // the ASSERT below to be invalid if the code was flushed. By setting the code | 418 // the ASSERT below to be invalid if the code was flushed. By setting the code |
| 427 // object last we avoid this. | 419 // object last we avoid this. |
| 428 Handle<SerializedScopeInfo> scope_info = | 420 Handle<SerializedScopeInfo> scope_info = |
| 429 SerializedScopeInfo::Create(info->scope()); | 421 SerializedScopeInfo::Create(info->scope()); |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 583 PROFILE(CodeCreateEvent(Logger::ToNativeByScript(tag, *script), | 575 PROFILE(CodeCreateEvent(Logger::ToNativeByScript(tag, *script), |
| 584 *code, *func_name)); | 576 *code, *func_name)); |
| 585 OPROFILE(CreateNativeCodeRegion(*func_name, | 577 OPROFILE(CreateNativeCodeRegion(*func_name, |
| 586 code->instruction_start(), | 578 code->instruction_start(), |
| 587 code->instruction_size())); | 579 code->instruction_size())); |
| 588 } | 580 } |
| 589 } | 581 } |
| 590 } | 582 } |
| 591 | 583 |
| 592 } } // namespace v8::internal | 584 } } // namespace v8::internal |
| OLD | NEW |