| 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 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 287 ASSERT(FLAG_always_opt || code->optimizable()); | 287 ASSERT(FLAG_always_opt || code->optimizable()); |
| 288 ASSERT(info->shared_info()->has_deoptimization_support()); | 288 ASSERT(info->shared_info()->has_deoptimization_support()); |
| 289 | 289 |
| 290 if (FLAG_trace_hydrogen) { | 290 if (FLAG_trace_hydrogen) { |
| 291 PrintF("-----------------------------------------------------------\n"); | 291 PrintF("-----------------------------------------------------------\n"); |
| 292 PrintF("Compiling method %s using hydrogen\n", *name->ToCString()); | 292 PrintF("Compiling method %s using hydrogen\n", *name->ToCString()); |
| 293 HTracer::Instance()->TraceCompilation(info->function()); | 293 HTracer::Instance()->TraceCompilation(info->function()); |
| 294 } | 294 } |
| 295 | 295 |
| 296 Handle<Context> global_context(info->closure()->context()->global_context()); | 296 Handle<Context> global_context(info->closure()->context()->global_context()); |
| 297 TypeFeedbackOracle oracle(code, global_context, info->isolate()); | 297 TypeFeedbackOracle oracle(code, global_context, info->isolate(), |
| 298 HGraphBuilder builder(info, &oracle); | 298 info->isolate()->zone()); |
| 299 HGraphBuilder builder(info, &oracle, info->isolate()->zone()); |
| 299 HPhase phase(HPhase::kTotal); | 300 HPhase phase(HPhase::kTotal); |
| 300 HGraph* graph = builder.CreateGraph(); | 301 HGraph* graph = builder.CreateGraph(); |
| 301 if (info->isolate()->has_pending_exception()) { | 302 if (info->isolate()->has_pending_exception()) { |
| 302 info->SetCode(Handle<Code>::null()); | 303 info->SetCode(Handle<Code>::null()); |
| 303 return false; | 304 return false; |
| 304 } | 305 } |
| 305 | 306 |
| 306 if (graph != NULL) { | 307 if (graph != NULL) { |
| 307 Handle<Code> optimized_code = graph->Compile(info, graph->zone()); | 308 Handle<Code> optimized_code = graph->Compile(info, graph->zone()); |
| 308 if (!optimized_code.is_null()) { | 309 if (!optimized_code.is_null()) { |
| (...skipping 30 matching lines...) Expand all Loading... |
| 339 return Rewriter::Rewrite(info) && Scope::Analyze(info) && GenerateCode(info); | 340 return Rewriter::Rewrite(info) && Scope::Analyze(info) && GenerateCode(info); |
| 340 } | 341 } |
| 341 | 342 |
| 342 | 343 |
| 343 #ifdef ENABLE_DEBUGGER_SUPPORT | 344 #ifdef ENABLE_DEBUGGER_SUPPORT |
| 344 bool Compiler::MakeCodeForLiveEdit(CompilationInfo* info) { | 345 bool Compiler::MakeCodeForLiveEdit(CompilationInfo* info) { |
| 345 // Precondition: code has been parsed. Postcondition: the code field in | 346 // Precondition: code has been parsed. Postcondition: the code field in |
| 346 // the compilation info is set if compilation succeeded. | 347 // the compilation info is set if compilation succeeded. |
| 347 bool succeeded = MakeCode(info); | 348 bool succeeded = MakeCode(info); |
| 348 if (!info->shared_info().is_null()) { | 349 if (!info->shared_info().is_null()) { |
| 349 Handle<ScopeInfo> scope_info = ScopeInfo::Create(info->scope()); | 350 Handle<ScopeInfo> scope_info = ScopeInfo::Create(info->scope(), |
| 351 info->isolate()->zone()); |
| 350 info->shared_info()->set_scope_info(*scope_info); | 352 info->shared_info()->set_scope_info(*scope_info); |
| 351 } | 353 } |
| 352 return succeeded; | 354 return succeeded; |
| 353 } | 355 } |
| 354 #endif | 356 #endif |
| 355 | 357 |
| 356 | 358 |
| 357 static Handle<SharedFunctionInfo> MakeFunctionInfo(CompilationInfo* info) { | 359 static Handle<SharedFunctionInfo> MakeFunctionInfo(CompilationInfo* info) { |
| 358 Isolate* isolate = info->isolate(); | 360 Isolate* isolate = info->isolate(); |
| 359 ZoneScope zone_scope(isolate, DELETE_ON_EXIT); | 361 ZoneScope zone_scope(isolate, DELETE_ON_EXIT); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 413 return Handle<SharedFunctionInfo>::null(); | 415 return Handle<SharedFunctionInfo>::null(); |
| 414 } | 416 } |
| 415 | 417 |
| 416 // Allocate function. | 418 // Allocate function. |
| 417 ASSERT(!info->code().is_null()); | 419 ASSERT(!info->code().is_null()); |
| 418 Handle<SharedFunctionInfo> result = | 420 Handle<SharedFunctionInfo> result = |
| 419 isolate->factory()->NewSharedFunctionInfo( | 421 isolate->factory()->NewSharedFunctionInfo( |
| 420 lit->name(), | 422 lit->name(), |
| 421 lit->materialized_literal_count(), | 423 lit->materialized_literal_count(), |
| 422 info->code(), | 424 info->code(), |
| 423 ScopeInfo::Create(info->scope())); | 425 ScopeInfo::Create(info->scope(), info->isolate()->zone())); |
| 424 | 426 |
| 425 ASSERT_EQ(RelocInfo::kNoPosition, lit->function_token_position()); | 427 ASSERT_EQ(RelocInfo::kNoPosition, lit->function_token_position()); |
| 426 Compiler::SetFunctionInfo(result, lit, true, script); | 428 Compiler::SetFunctionInfo(result, lit, true, script); |
| 427 | 429 |
| 428 if (script->name()->IsString()) { | 430 if (script->name()->IsString()) { |
| 429 PROFILE(isolate, CodeCreateEvent( | 431 PROFILE(isolate, CodeCreateEvent( |
| 430 info->is_eval() | 432 info->is_eval() |
| 431 ? Logger::EVAL_TAG | 433 ? Logger::EVAL_TAG |
| 432 : Logger::ToNativeByScript(Logger::SCRIPT_TAG, *script), | 434 : Logger::ToNativeByScript(Logger::SCRIPT_TAG, *script), |
| 433 *info->code(), | 435 *info->code(), |
| (...skipping 21 matching lines...) Expand all Loading... |
| 455 | 457 |
| 456 script->set_compilation_state( | 458 script->set_compilation_state( |
| 457 Smi::FromInt(Script::COMPILATION_STATE_COMPILED)); | 459 Smi::FromInt(Script::COMPILATION_STATE_COMPILED)); |
| 458 | 460 |
| 459 #ifdef ENABLE_DEBUGGER_SUPPORT | 461 #ifdef ENABLE_DEBUGGER_SUPPORT |
| 460 // Notify debugger | 462 // Notify debugger |
| 461 isolate->debugger()->OnAfterCompile( | 463 isolate->debugger()->OnAfterCompile( |
| 462 script, Debugger::NO_AFTER_COMPILE_FLAGS); | 464 script, Debugger::NO_AFTER_COMPILE_FLAGS); |
| 463 #endif | 465 #endif |
| 464 | 466 |
| 465 live_edit_tracker.RecordFunctionInfo(result, lit); | 467 live_edit_tracker.RecordFunctionInfo(result, lit, isolate->zone()); |
| 466 | 468 |
| 467 return result; | 469 return result; |
| 468 } | 470 } |
| 469 | 471 |
| 470 | 472 |
| 471 Handle<SharedFunctionInfo> Compiler::Compile(Handle<String> source, | 473 Handle<SharedFunctionInfo> Compiler::Compile(Handle<String> source, |
| 472 Handle<Object> script_name, | 474 Handle<Object> script_name, |
| 473 int line_offset, | 475 int line_offset, |
| 474 int column_offset, | 476 int column_offset, |
| 475 v8::Extension* extension, | 477 v8::Extension* extension, |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 644 | 646 |
| 645 if (info->IsOptimizing()) { | 647 if (info->IsOptimizing()) { |
| 646 ASSERT(shared->scope_info() != ScopeInfo::Empty()); | 648 ASSERT(shared->scope_info() != ScopeInfo::Empty()); |
| 647 function->ReplaceCode(*code); | 649 function->ReplaceCode(*code); |
| 648 } else { | 650 } else { |
| 649 // Update the shared function info with the compiled code and the | 651 // Update the shared function info with the compiled code and the |
| 650 // scope info. Please note, that the order of the shared function | 652 // scope info. Please note, that the order of the shared function |
| 651 // info initialization is important since set_scope_info might | 653 // info initialization is important since set_scope_info might |
| 652 // trigger a GC, causing the ASSERT below to be invalid if the code | 654 // trigger a GC, causing the ASSERT below to be invalid if the code |
| 653 // was flushed. By setting the code object last we avoid this. | 655 // was flushed. By setting the code object last we avoid this. |
| 654 Handle<ScopeInfo> scope_info = ScopeInfo::Create(info->scope()); | 656 Handle<ScopeInfo> scope_info = |
| 657 ScopeInfo::Create(info->scope(), info->isolate()->zone()); |
| 655 shared->set_scope_info(*scope_info); | 658 shared->set_scope_info(*scope_info); |
| 656 shared->set_code(*code); | 659 shared->set_code(*code); |
| 657 if (!function.is_null()) { | 660 if (!function.is_null()) { |
| 658 function->ReplaceCode(*code); | 661 function->ReplaceCode(*code); |
| 659 ASSERT(!function->IsOptimized()); | 662 ASSERT(!function->IsOptimized()); |
| 660 } | 663 } |
| 661 | 664 |
| 662 // Set the expected number of properties for instances. | 665 // Set the expected number of properties for instances. |
| 663 FunctionLiteral* lit = info->function(); | 666 FunctionLiteral* lit = info->function(); |
| 664 int expected = lit->expected_property_count(); | 667 int expected = lit->expected_property_count(); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 721 | 724 |
| 722 Handle<ScopeInfo> scope_info(ScopeInfo::Empty()); | 725 Handle<ScopeInfo> scope_info(ScopeInfo::Empty()); |
| 723 | 726 |
| 724 // Generate code | 727 // Generate code |
| 725 if (FLAG_lazy && allow_lazy) { | 728 if (FLAG_lazy && allow_lazy) { |
| 726 Handle<Code> code = info.isolate()->builtins()->LazyCompile(); | 729 Handle<Code> code = info.isolate()->builtins()->LazyCompile(); |
| 727 info.SetCode(code); | 730 info.SetCode(code); |
| 728 } else if ((V8::UseCrankshaft() && MakeCrankshaftCode(&info)) || | 731 } else if ((V8::UseCrankshaft() && MakeCrankshaftCode(&info)) || |
| 729 (!V8::UseCrankshaft() && FullCodeGenerator::MakeCode(&info))) { | 732 (!V8::UseCrankshaft() && FullCodeGenerator::MakeCode(&info))) { |
| 730 ASSERT(!info.code().is_null()); | 733 ASSERT(!info.code().is_null()); |
| 731 scope_info = ScopeInfo::Create(info.scope()); | 734 scope_info = ScopeInfo::Create(info.scope(), info.isolate()->zone()); |
| 732 } else { | 735 } else { |
| 733 return Handle<SharedFunctionInfo>::null(); | 736 return Handle<SharedFunctionInfo>::null(); |
| 734 } | 737 } |
| 735 | 738 |
| 736 // Create a shared function info object. | 739 // Create a shared function info object. |
| 737 Handle<SharedFunctionInfo> result = | 740 Handle<SharedFunctionInfo> result = |
| 738 FACTORY->NewSharedFunctionInfo(literal->name(), | 741 FACTORY->NewSharedFunctionInfo(literal->name(), |
| 739 literal->materialized_literal_count(), | 742 literal->materialized_literal_count(), |
| 740 info.code(), | 743 info.code(), |
| 741 scope_info); | 744 scope_info); |
| 742 SetFunctionInfo(result, literal, false, script); | 745 SetFunctionInfo(result, literal, false, script); |
| 743 RecordFunctionCompilation(Logger::FUNCTION_TAG, &info, result); | 746 RecordFunctionCompilation(Logger::FUNCTION_TAG, &info, result); |
| 744 result->set_allows_lazy_compilation(allow_lazy); | 747 result->set_allows_lazy_compilation(allow_lazy); |
| 745 | 748 |
| 746 // Set the expected number of properties for instances and return | 749 // Set the expected number of properties for instances and return |
| 747 // the resulting function. | 750 // the resulting function. |
| 748 SetExpectedNofPropertiesFromEstimate(result, | 751 SetExpectedNofPropertiesFromEstimate(result, |
| 749 literal->expected_property_count()); | 752 literal->expected_property_count()); |
| 750 live_edit_tracker.RecordFunctionInfo(result, literal); | 753 live_edit_tracker.RecordFunctionInfo(result, literal, info.isolate()->zone()); |
| 751 return result; | 754 return result; |
| 752 } | 755 } |
| 753 | 756 |
| 754 | 757 |
| 755 // Sets the function info on a function. | 758 // Sets the function info on a function. |
| 756 // The start_position points to the first '(' character after the function name | 759 // The start_position points to the first '(' character after the function name |
| 757 // in the full script source. When counting characters in the script source the | 760 // in the full script source. When counting characters in the script source the |
| 758 // the first character is number 0 (not 1). | 761 // the first character is number 0 (not 1). |
| 759 void Compiler::SetFunctionInfo(Handle<SharedFunctionInfo> function_info, | 762 void Compiler::SetFunctionInfo(Handle<SharedFunctionInfo> function_info, |
| 760 FunctionLiteral* lit, | 763 FunctionLiteral* lit, |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 817 } | 820 } |
| 818 } | 821 } |
| 819 | 822 |
| 820 GDBJIT(AddCode(Handle<String>(shared->DebugName()), | 823 GDBJIT(AddCode(Handle<String>(shared->DebugName()), |
| 821 Handle<Script>(info->script()), | 824 Handle<Script>(info->script()), |
| 822 Handle<Code>(info->code()), | 825 Handle<Code>(info->code()), |
| 823 info)); | 826 info)); |
| 824 } | 827 } |
| 825 | 828 |
| 826 } } // namespace v8::internal | 829 } } // namespace v8::internal |
| OLD | NEW |