Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 44 #include "runtime-profiler.h" | 44 #include "runtime-profiler.h" |
| 45 #include "scanner-character-streams.h" | 45 #include "scanner-character-streams.h" |
| 46 #include "scopeinfo.h" | 46 #include "scopeinfo.h" |
| 47 #include "scopes.h" | 47 #include "scopes.h" |
| 48 #include "vm-state-inl.h" | 48 #include "vm-state-inl.h" |
| 49 | 49 |
| 50 namespace v8 { | 50 namespace v8 { |
| 51 namespace internal { | 51 namespace internal { |
| 52 | 52 |
| 53 | 53 |
| 54 CompilationInfo::CompilationInfo(Handle<Script> script) | 54 CompilationInfo::CompilationInfo(Handle<Script> script, Zone* zone) |
| 55 : isolate_(script->GetIsolate()), | 55 : isolate_(script->GetIsolate()), |
| 56 flags_(LanguageModeField::encode(CLASSIC_MODE)), | 56 flags_(LanguageModeField::encode(CLASSIC_MODE)), |
| 57 function_(NULL), | 57 function_(NULL), |
| 58 scope_(NULL), | 58 scope_(NULL), |
| 59 global_scope_(NULL), | 59 global_scope_(NULL), |
| 60 script_(script), | 60 script_(script), |
| 61 extension_(NULL), | 61 extension_(NULL), |
| 62 pre_parse_data_(NULL), | 62 pre_parse_data_(NULL), |
| 63 osr_ast_id_(AstNode::kNoNumber) { | 63 osr_ast_id_(AstNode::kNoNumber), |
| 64 zone_(zone) { | |
| 64 Initialize(BASE); | 65 Initialize(BASE); |
| 65 } | 66 } |
| 66 | 67 |
| 67 | 68 |
| 68 CompilationInfo::CompilationInfo(Handle<SharedFunctionInfo> shared_info) | 69 CompilationInfo::CompilationInfo(Handle<SharedFunctionInfo> shared_info, |
| 70 Zone* zone) | |
| 69 : isolate_(shared_info->GetIsolate()), | 71 : isolate_(shared_info->GetIsolate()), |
| 70 flags_(LanguageModeField::encode(CLASSIC_MODE) | | 72 flags_(LanguageModeField::encode(CLASSIC_MODE) | |
| 71 IsLazy::encode(true)), | 73 IsLazy::encode(true)), |
| 72 function_(NULL), | 74 function_(NULL), |
| 73 scope_(NULL), | 75 scope_(NULL), |
| 74 global_scope_(NULL), | 76 global_scope_(NULL), |
| 75 shared_info_(shared_info), | 77 shared_info_(shared_info), |
| 76 script_(Handle<Script>(Script::cast(shared_info->script()))), | 78 script_(Handle<Script>(Script::cast(shared_info->script()))), |
| 77 extension_(NULL), | 79 extension_(NULL), |
| 78 pre_parse_data_(NULL), | 80 pre_parse_data_(NULL), |
| 79 osr_ast_id_(AstNode::kNoNumber) { | 81 osr_ast_id_(AstNode::kNoNumber), |
| 82 zone_(zone) { | |
| 80 Initialize(BASE); | 83 Initialize(BASE); |
| 81 } | 84 } |
| 82 | 85 |
| 83 | 86 |
| 84 CompilationInfo::CompilationInfo(Handle<JSFunction> closure) | 87 CompilationInfo::CompilationInfo(Handle<JSFunction> closure, Zone* zone) |
| 85 : isolate_(closure->GetIsolate()), | 88 : isolate_(closure->GetIsolate()), |
| 86 flags_(LanguageModeField::encode(CLASSIC_MODE) | | 89 flags_(LanguageModeField::encode(CLASSIC_MODE) | |
| 87 IsLazy::encode(true)), | 90 IsLazy::encode(true)), |
| 88 function_(NULL), | 91 function_(NULL), |
| 89 scope_(NULL), | 92 scope_(NULL), |
| 90 global_scope_(NULL), | 93 global_scope_(NULL), |
| 91 closure_(closure), | 94 closure_(closure), |
| 92 shared_info_(Handle<SharedFunctionInfo>(closure->shared())), | 95 shared_info_(Handle<SharedFunctionInfo>(closure->shared())), |
| 93 script_(Handle<Script>(Script::cast(shared_info_->script()))), | 96 script_(Handle<Script>(Script::cast(shared_info_->script()))), |
| 94 extension_(NULL), | 97 extension_(NULL), |
| 95 pre_parse_data_(NULL), | 98 pre_parse_data_(NULL), |
| 96 osr_ast_id_(AstNode::kNoNumber) { | 99 osr_ast_id_(AstNode::kNoNumber), |
| 100 zone_(zone) { | |
| 97 Initialize(BASE); | 101 Initialize(BASE); |
| 98 } | 102 } |
| 99 | 103 |
| 100 | 104 |
| 101 // Disable optimization for the rest of the compilation pipeline. | 105 // Disable optimization for the rest of the compilation pipeline. |
| 102 void CompilationInfo::DisableOptimization() { | 106 void CompilationInfo::DisableOptimization() { |
| 103 bool is_optimizable_closure = | 107 bool is_optimizable_closure = |
| 104 FLAG_optimize_closures && | 108 FLAG_optimize_closures && |
| 105 closure_.is_null() && | 109 closure_.is_null() && |
| 106 !scope_->HasTrivialOuterContext() && | 110 !scope_->HasTrivialOuterContext() && |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 255 } | 259 } |
| 256 | 260 |
| 257 // Recompile the unoptimized version of the code if the current version | 261 // Recompile the unoptimized version of the code if the current version |
| 258 // doesn't have deoptimization support. Alternatively, we may decide to | 262 // doesn't have deoptimization support. Alternatively, we may decide to |
| 259 // run the full code generator to get a baseline for the compile-time | 263 // run the full code generator to get a baseline for the compile-time |
| 260 // performance of the hydrogen-based compiler. | 264 // performance of the hydrogen-based compiler. |
| 261 int64_t start = OS::Ticks(); | 265 int64_t start = OS::Ticks(); |
| 262 bool should_recompile = !info->shared_info()->has_deoptimization_support(); | 266 bool should_recompile = !info->shared_info()->has_deoptimization_support(); |
| 263 if (should_recompile || FLAG_hydrogen_stats) { | 267 if (should_recompile || FLAG_hydrogen_stats) { |
| 264 HPhase phase(HPhase::kFullCodeGen); | 268 HPhase phase(HPhase::kFullCodeGen); |
| 265 CompilationInfo unoptimized(info->shared_info()); | 269 Zone zone(info->isolate()); |
| 270 CompilationInfo unoptimized(info->shared_info(), &zone); | |
| 271 ZoneScope scope(&zone, DELETE_ON_EXIT); | |
| 266 // Note that we use the same AST that we will use for generating the | 272 // Note that we use the same AST that we will use for generating the |
| 267 // optimized code. | 273 // optimized code. |
| 268 unoptimized.SetFunction(info->function()); | 274 unoptimized.SetFunction(info->function()); |
| 269 unoptimized.SetScope(info->scope()); | 275 unoptimized.SetScope(info->scope()); |
| 270 if (should_recompile) unoptimized.EnableDeoptimizationSupport(); | 276 if (should_recompile) unoptimized.EnableDeoptimizationSupport(); |
| 271 bool succeeded = FullCodeGenerator::MakeCode(&unoptimized); | 277 bool succeeded = FullCodeGenerator::MakeCode(&unoptimized); |
| 272 if (should_recompile) { | 278 if (should_recompile) { |
| 273 if (!succeeded) return false; | 279 if (!succeeded) return false; |
| 274 Handle<SharedFunctionInfo> shared = info->shared_info(); | 280 Handle<SharedFunctionInfo> shared = info->shared_info(); |
| 275 shared->EnableDeoptimizationSupport(*unoptimized.code()); | 281 shared->EnableDeoptimizationSupport(*unoptimized.code()); |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 288 ASSERT(info->shared_info()->has_deoptimization_support()); | 294 ASSERT(info->shared_info()->has_deoptimization_support()); |
| 289 | 295 |
| 290 if (FLAG_trace_hydrogen) { | 296 if (FLAG_trace_hydrogen) { |
| 291 PrintF("-----------------------------------------------------------\n"); | 297 PrintF("-----------------------------------------------------------\n"); |
| 292 PrintF("Compiling method %s using hydrogen\n", *name->ToCString()); | 298 PrintF("Compiling method %s using hydrogen\n", *name->ToCString()); |
| 293 HTracer::Instance()->TraceCompilation(info->function()); | 299 HTracer::Instance()->TraceCompilation(info->function()); |
| 294 } | 300 } |
| 295 | 301 |
| 296 Handle<Context> global_context(info->closure()->context()->global_context()); | 302 Handle<Context> global_context(info->closure()->context()->global_context()); |
| 297 TypeFeedbackOracle oracle(code, global_context, info->isolate(), | 303 TypeFeedbackOracle oracle(code, global_context, info->isolate(), |
| 298 info->isolate()->zone()); | 304 info->zone()); |
| 299 HGraphBuilder builder(info, &oracle, info->isolate()->zone()); | 305 HGraphBuilder builder(info, &oracle); |
| 300 HPhase phase(HPhase::kTotal); | 306 HPhase phase(HPhase::kTotal); |
| 301 HGraph* graph = builder.CreateGraph(); | 307 HGraph* graph = builder.CreateGraph(); |
| 302 if (info->isolate()->has_pending_exception()) { | 308 if (info->isolate()->has_pending_exception()) { |
| 303 info->SetCode(Handle<Code>::null()); | 309 info->SetCode(Handle<Code>::null()); |
| 304 return false; | 310 return false; |
| 305 } | 311 } |
| 306 | 312 |
| 307 if (graph != NULL) { | 313 if (graph != NULL) { |
| 308 Handle<Code> optimized_code = graph->Compile(info, graph->zone()); | 314 Handle<Code> optimized_code = graph->Compile(); |
| 309 if (!optimized_code.is_null()) { | 315 if (!optimized_code.is_null()) { |
| 310 info->SetCode(optimized_code); | 316 info->SetCode(optimized_code); |
| 311 FinishOptimization(info->closure(), start); | 317 FinishOptimization(info->closure(), start); |
| 312 return true; | 318 return true; |
| 313 } | 319 } |
| 314 } | 320 } |
| 315 | 321 |
| 316 // Keep using the shared code. | 322 // Keep using the shared code. |
| 317 info->AbortOptimization(); | 323 info->AbortOptimization(); |
| 318 if (!builder.inline_bailout()) { | 324 if (!builder.inline_bailout()) { |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 341 } | 347 } |
| 342 | 348 |
| 343 | 349 |
| 344 #ifdef ENABLE_DEBUGGER_SUPPORT | 350 #ifdef ENABLE_DEBUGGER_SUPPORT |
| 345 bool Compiler::MakeCodeForLiveEdit(CompilationInfo* info) { | 351 bool Compiler::MakeCodeForLiveEdit(CompilationInfo* info) { |
| 346 // Precondition: code has been parsed. Postcondition: the code field in | 352 // Precondition: code has been parsed. Postcondition: the code field in |
| 347 // the compilation info is set if compilation succeeded. | 353 // the compilation info is set if compilation succeeded. |
| 348 bool succeeded = MakeCode(info); | 354 bool succeeded = MakeCode(info); |
| 349 if (!info->shared_info().is_null()) { | 355 if (!info->shared_info().is_null()) { |
| 350 Handle<ScopeInfo> scope_info = ScopeInfo::Create(info->scope(), | 356 Handle<ScopeInfo> scope_info = ScopeInfo::Create(info->scope(), |
| 351 info->isolate()->zone()); | 357 info->zone()); |
| 352 info->shared_info()->set_scope_info(*scope_info); | 358 info->shared_info()->set_scope_info(*scope_info); |
| 353 } | 359 } |
| 354 return succeeded; | 360 return succeeded; |
| 355 } | 361 } |
| 356 #endif | 362 #endif |
| 357 | 363 |
| 358 | 364 |
| 359 static Handle<SharedFunctionInfo> MakeFunctionInfo(CompilationInfo* info) { | 365 static Handle<SharedFunctionInfo> MakeFunctionInfo(CompilationInfo* info) { |
| 360 Isolate* isolate = info->isolate(); | 366 Isolate* isolate = info->isolate(); |
| 361 ZoneScope zone_scope(isolate, DELETE_ON_EXIT); | 367 ZoneScope zone_scope(info->zone(), DELETE_ON_EXIT); |
| 362 PostponeInterruptsScope postpone(isolate); | 368 PostponeInterruptsScope postpone(isolate); |
| 363 | 369 |
| 364 ASSERT(!isolate->global_context().is_null()); | 370 ASSERT(!isolate->global_context().is_null()); |
| 365 Handle<Script> script = info->script(); | 371 Handle<Script> script = info->script(); |
| 366 script->set_context_data((*isolate->global_context())->data()); | 372 script->set_context_data((*isolate->global_context())->data()); |
| 367 | 373 |
| 368 #ifdef ENABLE_DEBUGGER_SUPPORT | 374 #ifdef ENABLE_DEBUGGER_SUPPORT |
| 369 if (info->is_eval()) { | 375 if (info->is_eval()) { |
| 370 Script::CompilationType compilation_type = Script::COMPILATION_TYPE_EVAL; | 376 Script::CompilationType compilation_type = Script::COMPILATION_TYPE_EVAL; |
| 371 script->set_compilation_type(Smi::FromInt(compilation_type)); | 377 script->set_compilation_type(Smi::FromInt(compilation_type)); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 415 return Handle<SharedFunctionInfo>::null(); | 421 return Handle<SharedFunctionInfo>::null(); |
| 416 } | 422 } |
| 417 | 423 |
| 418 // Allocate function. | 424 // Allocate function. |
| 419 ASSERT(!info->code().is_null()); | 425 ASSERT(!info->code().is_null()); |
| 420 Handle<SharedFunctionInfo> result = | 426 Handle<SharedFunctionInfo> result = |
| 421 isolate->factory()->NewSharedFunctionInfo( | 427 isolate->factory()->NewSharedFunctionInfo( |
| 422 lit->name(), | 428 lit->name(), |
| 423 lit->materialized_literal_count(), | 429 lit->materialized_literal_count(), |
| 424 info->code(), | 430 info->code(), |
| 425 ScopeInfo::Create(info->scope(), info->isolate()->zone())); | 431 ScopeInfo::Create(info->scope(), info->zone())); |
| 426 | 432 |
| 427 ASSERT_EQ(RelocInfo::kNoPosition, lit->function_token_position()); | 433 ASSERT_EQ(RelocInfo::kNoPosition, lit->function_token_position()); |
| 428 Compiler::SetFunctionInfo(result, lit, true, script); | 434 Compiler::SetFunctionInfo(result, lit, true, script); |
| 429 | 435 |
| 430 if (script->name()->IsString()) { | 436 if (script->name()->IsString()) { |
| 431 PROFILE(isolate, CodeCreateEvent( | 437 PROFILE(isolate, CodeCreateEvent( |
| 432 info->is_eval() | 438 info->is_eval() |
| 433 ? Logger::EVAL_TAG | 439 ? Logger::EVAL_TAG |
| 434 : Logger::ToNativeByScript(Logger::SCRIPT_TAG, *script), | 440 : Logger::ToNativeByScript(Logger::SCRIPT_TAG, *script), |
| 435 *info->code(), | 441 *info->code(), |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 457 | 463 |
| 458 script->set_compilation_state( | 464 script->set_compilation_state( |
| 459 Smi::FromInt(Script::COMPILATION_STATE_COMPILED)); | 465 Smi::FromInt(Script::COMPILATION_STATE_COMPILED)); |
| 460 | 466 |
| 461 #ifdef ENABLE_DEBUGGER_SUPPORT | 467 #ifdef ENABLE_DEBUGGER_SUPPORT |
| 462 // Notify debugger | 468 // Notify debugger |
| 463 isolate->debugger()->OnAfterCompile( | 469 isolate->debugger()->OnAfterCompile( |
| 464 script, Debugger::NO_AFTER_COMPILE_FLAGS); | 470 script, Debugger::NO_AFTER_COMPILE_FLAGS); |
| 465 #endif | 471 #endif |
| 466 | 472 |
| 467 live_edit_tracker.RecordFunctionInfo(result, lit, isolate->zone()); | 473 live_edit_tracker.RecordFunctionInfo(result, lit, info->zone()); |
| 468 | 474 |
| 469 return result; | 475 return result; |
| 470 } | 476 } |
| 471 | 477 |
| 472 | 478 |
| 473 Handle<SharedFunctionInfo> Compiler::Compile(Handle<String> source, | 479 Handle<SharedFunctionInfo> Compiler::Compile(Handle<String> source, |
| 474 Handle<Object> script_name, | 480 Handle<Object> script_name, |
| 475 int line_offset, | 481 int line_offset, |
| 476 int column_offset, | 482 int column_offset, |
| 477 v8::Extension* extension, | 483 v8::Extension* extension, |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 515 if (!script_name.is_null()) { | 521 if (!script_name.is_null()) { |
| 516 script->set_name(*script_name); | 522 script->set_name(*script_name); |
| 517 script->set_line_offset(Smi::FromInt(line_offset)); | 523 script->set_line_offset(Smi::FromInt(line_offset)); |
| 518 script->set_column_offset(Smi::FromInt(column_offset)); | 524 script->set_column_offset(Smi::FromInt(column_offset)); |
| 519 } | 525 } |
| 520 | 526 |
| 521 script->set_data(script_data.is_null() ? HEAP->undefined_value() | 527 script->set_data(script_data.is_null() ? HEAP->undefined_value() |
| 522 : *script_data); | 528 : *script_data); |
| 523 | 529 |
| 524 // Compile the function and add it to the cache. | 530 // Compile the function and add it to the cache. |
| 525 CompilationInfo info(script); | 531 Zone zone(isolate); |
| 532 CompilationInfo info(script, &zone); | |
| 533 ZoneScope scope(&zone, DELETE_ON_EXIT); | |
|
danno
2012/06/14 14:22:19
Here and elsewhere, shouldn't the ZoneScope be dir
sanjoy
2012/06/15 09:24:31
CompilationInfo doesn't care. I found this order
| |
| 526 info.MarkAsGlobal(); | 534 info.MarkAsGlobal(); |
| 527 info.SetExtension(extension); | 535 info.SetExtension(extension); |
| 528 info.SetPreParseData(pre_data); | 536 info.SetPreParseData(pre_data); |
| 529 if (FLAG_use_strict) { | 537 if (FLAG_use_strict) { |
| 530 info.SetLanguageMode(FLAG_harmony_scoping ? EXTENDED_MODE : STRICT_MODE); | 538 info.SetLanguageMode(FLAG_harmony_scoping ? EXTENDED_MODE : STRICT_MODE); |
| 531 } | 539 } |
| 532 result = MakeFunctionInfo(&info); | 540 result = MakeFunctionInfo(&info); |
| 533 if (extension == NULL && !result.is_null()) { | 541 if (extension == NULL && !result.is_null()) { |
| 534 compilation_cache->PutScript(source, result); | 542 compilation_cache->PutScript(source, result); |
| 535 } | 543 } |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 563 CompilationCache* compilation_cache = isolate->compilation_cache(); | 571 CompilationCache* compilation_cache = isolate->compilation_cache(); |
| 564 result = compilation_cache->LookupEval(source, | 572 result = compilation_cache->LookupEval(source, |
| 565 context, | 573 context, |
| 566 is_global, | 574 is_global, |
| 567 language_mode, | 575 language_mode, |
| 568 scope_position); | 576 scope_position); |
| 569 | 577 |
| 570 if (result.is_null()) { | 578 if (result.is_null()) { |
| 571 // Create a script object describing the script to be compiled. | 579 // Create a script object describing the script to be compiled. |
| 572 Handle<Script> script = isolate->factory()->NewScript(source); | 580 Handle<Script> script = isolate->factory()->NewScript(source); |
| 573 CompilationInfo info(script); | 581 Zone zone(isolate); |
| 582 CompilationInfo info(script, &zone); | |
|
danno
2012/06/14 14:22:19
If the Zone and ZoneScope's lifecycle is tied to t
sanjoy
2012/06/15 09:24:31
Please see my comment on runtime.cc
| |
| 583 ZoneScope scope(&zone, DELETE_ON_EXIT); | |
| 574 info.MarkAsEval(); | 584 info.MarkAsEval(); |
| 575 if (is_global) info.MarkAsGlobal(); | 585 if (is_global) info.MarkAsGlobal(); |
| 576 info.SetLanguageMode(language_mode); | 586 info.SetLanguageMode(language_mode); |
| 577 info.SetCallingContext(context); | 587 info.SetCallingContext(context); |
| 578 result = MakeFunctionInfo(&info); | 588 result = MakeFunctionInfo(&info); |
| 579 if (!result.is_null()) { | 589 if (!result.is_null()) { |
| 580 // Explicitly disable optimization for eval code. We're not yet prepared | 590 // Explicitly disable optimization for eval code. We're not yet prepared |
| 581 // to handle eval-code in the optimizing compiler. | 591 // to handle eval-code in the optimizing compiler. |
| 582 result->DisableOptimization(); | 592 result->DisableOptimization(); |
| 583 | 593 |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 598 } | 608 } |
| 599 } | 609 } |
| 600 | 610 |
| 601 return result; | 611 return result; |
| 602 } | 612 } |
| 603 | 613 |
| 604 | 614 |
| 605 bool Compiler::CompileLazy(CompilationInfo* info) { | 615 bool Compiler::CompileLazy(CompilationInfo* info) { |
| 606 Isolate* isolate = info->isolate(); | 616 Isolate* isolate = info->isolate(); |
| 607 | 617 |
| 608 ZoneScope zone_scope(isolate, DELETE_ON_EXIT); | 618 ZoneScope zone_scope(info->zone(), DELETE_ON_EXIT); |
| 609 | 619 |
| 610 // The VM is in the COMPILER state until exiting this function. | 620 // The VM is in the COMPILER state until exiting this function. |
| 611 VMState state(isolate, COMPILER); | 621 VMState state(isolate, COMPILER); |
| 612 | 622 |
| 613 PostponeInterruptsScope postpone(isolate); | 623 PostponeInterruptsScope postpone(isolate); |
| 614 | 624 |
| 615 Handle<SharedFunctionInfo> shared = info->shared_info(); | 625 Handle<SharedFunctionInfo> shared = info->shared_info(); |
| 616 int compiled_size = shared->end_position() - shared->start_position(); | 626 int compiled_size = shared->end_position() - shared->start_position(); |
| 617 isolate->counters()->total_compile_size()->Increment(compiled_size); | 627 isolate->counters()->total_compile_size()->Increment(compiled_size); |
| 618 | 628 |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 647 if (info->IsOptimizing()) { | 657 if (info->IsOptimizing()) { |
| 648 ASSERT(shared->scope_info() != ScopeInfo::Empty()); | 658 ASSERT(shared->scope_info() != ScopeInfo::Empty()); |
| 649 function->ReplaceCode(*code); | 659 function->ReplaceCode(*code); |
| 650 } else { | 660 } else { |
| 651 // Update the shared function info with the compiled code and the | 661 // Update the shared function info with the compiled code and the |
| 652 // scope info. Please note, that the order of the shared function | 662 // scope info. Please note, that the order of the shared function |
| 653 // info initialization is important since set_scope_info might | 663 // info initialization is important since set_scope_info might |
| 654 // trigger a GC, causing the ASSERT below to be invalid if the code | 664 // trigger a GC, causing the ASSERT below to be invalid if the code |
| 655 // was flushed. By setting the code object last we avoid this. | 665 // was flushed. By setting the code object last we avoid this. |
| 656 Handle<ScopeInfo> scope_info = | 666 Handle<ScopeInfo> scope_info = |
| 657 ScopeInfo::Create(info->scope(), info->isolate()->zone()); | 667 ScopeInfo::Create(info->scope(), info->zone()); |
| 658 shared->set_scope_info(*scope_info); | 668 shared->set_scope_info(*scope_info); |
| 659 shared->set_code(*code); | 669 shared->set_code(*code); |
| 660 if (!function.is_null()) { | 670 if (!function.is_null()) { |
| 661 function->ReplaceCode(*code); | 671 function->ReplaceCode(*code); |
| 662 ASSERT(!function->IsOptimized()); | 672 ASSERT(!function->IsOptimized()); |
| 663 } | 673 } |
| 664 | 674 |
| 665 // Set the expected number of properties for instances. | 675 // Set the expected number of properties for instances. |
| 666 FunctionLiteral* lit = info->function(); | 676 FunctionLiteral* lit = info->function(); |
| 667 int expected = lit->expected_property_count(); | 677 int expected = lit->expected_property_count(); |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 682 shared->set_ast_node_count(lit->ast_node_count()); | 692 shared->set_ast_node_count(lit->ast_node_count()); |
| 683 | 693 |
| 684 if (V8::UseCrankshaft()&& | 694 if (V8::UseCrankshaft()&& |
| 685 !function.is_null() && | 695 !function.is_null() && |
| 686 !shared->optimization_disabled()) { | 696 !shared->optimization_disabled()) { |
| 687 // If we're asked to always optimize, we compile the optimized | 697 // If we're asked to always optimize, we compile the optimized |
| 688 // version of the function right away - unless the debugger is | 698 // version of the function right away - unless the debugger is |
| 689 // active as it makes no sense to compile optimized code then. | 699 // active as it makes no sense to compile optimized code then. |
| 690 if (FLAG_always_opt && | 700 if (FLAG_always_opt && |
| 691 !Isolate::Current()->DebuggerHasBreakPoints()) { | 701 !Isolate::Current()->DebuggerHasBreakPoints()) { |
| 692 CompilationInfo optimized(function); | 702 Zone zone(function->GetIsolate()); |
| 703 CompilationInfo optimized(function, &zone); | |
| 704 ZoneScope scope(&zone, DELETE_ON_EXIT); | |
| 693 optimized.SetOptimizing(AstNode::kNoNumber); | 705 optimized.SetOptimizing(AstNode::kNoNumber); |
| 694 return CompileLazy(&optimized); | 706 return CompileLazy(&optimized); |
| 695 } | 707 } |
| 696 } | 708 } |
| 697 } | 709 } |
| 698 | 710 |
| 699 return true; | 711 return true; |
| 700 } | 712 } |
| 701 } | 713 } |
| 702 | 714 |
| 703 ASSERT(info->code().is_null()); | 715 ASSERT(info->code().is_null()); |
| 704 return false; | 716 return false; |
| 705 } | 717 } |
| 706 | 718 |
| 707 | 719 |
| 708 Handle<SharedFunctionInfo> Compiler::BuildFunctionInfo(FunctionLiteral* literal, | 720 Handle<SharedFunctionInfo> Compiler::BuildFunctionInfo(FunctionLiteral* literal, |
| 709 Handle<Script> script) { | 721 Handle<Script> script) { |
| 710 // Precondition: code has been parsed and scopes have been analyzed. | 722 // Precondition: code has been parsed and scopes have been analyzed. |
| 711 CompilationInfo info(script); | 723 Zone zone(script->GetIsolate()); |
| 724 CompilationInfo info(script, &zone); | |
| 725 ZoneScope scope(&zone, DELETE_ON_EXIT); | |
| 712 info.SetFunction(literal); | 726 info.SetFunction(literal); |
| 713 info.SetScope(literal->scope()); | 727 info.SetScope(literal->scope()); |
| 714 info.SetLanguageMode(literal->scope()->language_mode()); | 728 info.SetLanguageMode(literal->scope()->language_mode()); |
| 715 | 729 |
| 716 LiveEditFunctionTracker live_edit_tracker(info.isolate(), literal); | 730 LiveEditFunctionTracker live_edit_tracker(info.isolate(), literal); |
| 717 // Determine if the function can be lazily compiled. This is necessary to | 731 // Determine if the function can be lazily compiled. This is necessary to |
| 718 // allow some of our builtin JS files to be lazily compiled. These | 732 // allow some of our builtin JS files to be lazily compiled. These |
| 719 // builtins cannot be handled lazily by the parser, since we have to know | 733 // builtins cannot be handled lazily by the parser, since we have to know |
| 720 // if a function uses the special natives syntax, which is something the | 734 // if a function uses the special natives syntax, which is something the |
| 721 // parser records. | 735 // parser records. |
| 722 bool allow_lazy = literal->AllowsLazyCompilation() && | 736 bool allow_lazy = literal->AllowsLazyCompilation() && |
| 723 !LiveEditFunctionTracker::IsActive(info.isolate()); | 737 !LiveEditFunctionTracker::IsActive(info.isolate()); |
| 724 | 738 |
| 725 Handle<ScopeInfo> scope_info(ScopeInfo::Empty()); | 739 Handle<ScopeInfo> scope_info(ScopeInfo::Empty()); |
| 726 | 740 |
| 727 // Generate code | 741 // Generate code |
| 728 if (FLAG_lazy && allow_lazy) { | 742 if (FLAG_lazy && allow_lazy) { |
| 729 Handle<Code> code = info.isolate()->builtins()->LazyCompile(); | 743 Handle<Code> code = info.isolate()->builtins()->LazyCompile(); |
| 730 info.SetCode(code); | 744 info.SetCode(code); |
| 731 } else if ((V8::UseCrankshaft() && MakeCrankshaftCode(&info)) || | 745 } else if ((V8::UseCrankshaft() && MakeCrankshaftCode(&info)) || |
| 732 (!V8::UseCrankshaft() && FullCodeGenerator::MakeCode(&info))) { | 746 (!V8::UseCrankshaft() && FullCodeGenerator::MakeCode(&info))) { |
| 733 ASSERT(!info.code().is_null()); | 747 ASSERT(!info.code().is_null()); |
| 734 scope_info = ScopeInfo::Create(info.scope(), info.isolate()->zone()); | 748 scope_info = ScopeInfo::Create(info.scope(), info.zone()); |
| 735 } else { | 749 } else { |
| 736 return Handle<SharedFunctionInfo>::null(); | 750 return Handle<SharedFunctionInfo>::null(); |
| 737 } | 751 } |
| 738 | 752 |
| 739 // Create a shared function info object. | 753 // Create a shared function info object. |
| 740 Handle<SharedFunctionInfo> result = | 754 Handle<SharedFunctionInfo> result = |
| 741 FACTORY->NewSharedFunctionInfo(literal->name(), | 755 FACTORY->NewSharedFunctionInfo(literal->name(), |
| 742 literal->materialized_literal_count(), | 756 literal->materialized_literal_count(), |
| 743 info.code(), | 757 info.code(), |
| 744 scope_info); | 758 scope_info); |
| 745 SetFunctionInfo(result, literal, false, script); | 759 SetFunctionInfo(result, literal, false, script); |
| 746 RecordFunctionCompilation(Logger::FUNCTION_TAG, &info, result); | 760 RecordFunctionCompilation(Logger::FUNCTION_TAG, &info, result); |
| 747 result->set_allows_lazy_compilation(allow_lazy); | 761 result->set_allows_lazy_compilation(allow_lazy); |
| 748 | 762 |
| 749 // Set the expected number of properties for instances and return | 763 // Set the expected number of properties for instances and return |
| 750 // the resulting function. | 764 // the resulting function. |
| 751 SetExpectedNofPropertiesFromEstimate(result, | 765 SetExpectedNofPropertiesFromEstimate(result, |
| 752 literal->expected_property_count()); | 766 literal->expected_property_count()); |
| 753 live_edit_tracker.RecordFunctionInfo(result, literal, info.isolate()->zone()); | 767 live_edit_tracker.RecordFunctionInfo(result, literal, info.zone()); |
| 754 return result; | 768 return result; |
| 755 } | 769 } |
| 756 | 770 |
| 757 | 771 |
| 758 // Sets the function info on a function. | 772 // Sets the function info on a function. |
| 759 // The start_position points to the first '(' character after the function name | 773 // The start_position points to the first '(' character after the function name |
| 760 // in the full script source. When counting characters in the script source the | 774 // in the full script source. When counting characters in the script source the |
| 761 // the first character is number 0 (not 1). | 775 // the first character is number 0 (not 1). |
| 762 void Compiler::SetFunctionInfo(Handle<SharedFunctionInfo> function_info, | 776 void Compiler::SetFunctionInfo(Handle<SharedFunctionInfo> function_info, |
| 763 FunctionLiteral* lit, | 777 FunctionLiteral* lit, |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 820 } | 834 } |
| 821 } | 835 } |
| 822 | 836 |
| 823 GDBJIT(AddCode(Handle<String>(shared->DebugName()), | 837 GDBJIT(AddCode(Handle<String>(shared->DebugName()), |
| 824 Handle<Script>(info->script()), | 838 Handle<Script>(info->script()), |
| 825 Handle<Code>(info->code()), | 839 Handle<Code>(info->code()), |
| 826 info)); | 840 info)); |
| 827 } | 841 } |
| 828 | 842 |
| 829 } } // namespace v8::internal | 843 } } // namespace v8::internal |
| OLD | NEW |