Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(291)

Side by Side Diff: src/compiler.cc

Issue 10534139: One Zone per CompilationInfo. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Rename CompilationInfoZone to ZoneWithCompilationInfo Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/compiler.h ('k') | src/debug.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
254 } 258 }
255 259
256 // Recompile the unoptimized version of the code if the current version 260 // Recompile the unoptimized version of the code if the current version
257 // doesn't have deoptimization support. Alternatively, we may decide to 261 // doesn't have deoptimization support. Alternatively, we may decide to
258 // run the full code generator to get a baseline for the compile-time 262 // run the full code generator to get a baseline for the compile-time
259 // performance of the hydrogen-based compiler. 263 // performance of the hydrogen-based compiler.
260 int64_t start = OS::Ticks(); 264 int64_t start = OS::Ticks();
261 bool should_recompile = !info->shared_info()->has_deoptimization_support(); 265 bool should_recompile = !info->shared_info()->has_deoptimization_support();
262 if (should_recompile || FLAG_hydrogen_stats) { 266 if (should_recompile || FLAG_hydrogen_stats) {
263 HPhase phase(HPhase::kFullCodeGen); 267 HPhase phase(HPhase::kFullCodeGen);
264 CompilationInfo unoptimized(info->shared_info()); 268 CompilationInfoWithZone unoptimized(info->shared_info());
265 // Note that we use the same AST that we will use for generating the 269 // Note that we use the same AST that we will use for generating the
266 // optimized code. 270 // optimized code.
267 unoptimized.SetFunction(info->function()); 271 unoptimized.SetFunction(info->function());
268 unoptimized.SetScope(info->scope()); 272 unoptimized.SetScope(info->scope());
269 if (should_recompile) unoptimized.EnableDeoptimizationSupport(); 273 if (should_recompile) unoptimized.EnableDeoptimizationSupport();
270 bool succeeded = FullCodeGenerator::MakeCode(&unoptimized); 274 bool succeeded = FullCodeGenerator::MakeCode(&unoptimized);
271 if (should_recompile) { 275 if (should_recompile) {
272 if (!succeeded) return false; 276 if (!succeeded) return false;
273 Handle<SharedFunctionInfo> shared = info->shared_info(); 277 Handle<SharedFunctionInfo> shared = info->shared_info();
274 shared->EnableDeoptimizationSupport(*unoptimized.code()); 278 shared->EnableDeoptimizationSupport(*unoptimized.code());
(...skipping 12 matching lines...) Expand all
287 ASSERT(info->shared_info()->has_deoptimization_support()); 291 ASSERT(info->shared_info()->has_deoptimization_support());
288 292
289 if (FLAG_trace_hydrogen) { 293 if (FLAG_trace_hydrogen) {
290 PrintF("-----------------------------------------------------------\n"); 294 PrintF("-----------------------------------------------------------\n");
291 PrintF("Compiling method %s using hydrogen\n", *name->ToCString()); 295 PrintF("Compiling method %s using hydrogen\n", *name->ToCString());
292 HTracer::Instance()->TraceCompilation(info->function()); 296 HTracer::Instance()->TraceCompilation(info->function());
293 } 297 }
294 298
295 Handle<Context> global_context(info->closure()->context()->global_context()); 299 Handle<Context> global_context(info->closure()->context()->global_context());
296 TypeFeedbackOracle oracle(code, global_context, info->isolate(), 300 TypeFeedbackOracle oracle(code, global_context, info->isolate(),
297 info->isolate()->zone()); 301 info->zone());
298 HGraphBuilder builder(info, &oracle, info->isolate()->zone()); 302 HGraphBuilder builder(info, &oracle);
299 HPhase phase(HPhase::kTotal); 303 HPhase phase(HPhase::kTotal);
300 HGraph* graph = builder.CreateGraph(); 304 HGraph* graph = builder.CreateGraph();
301 if (info->isolate()->has_pending_exception()) { 305 if (info->isolate()->has_pending_exception()) {
302 info->SetCode(Handle<Code>::null()); 306 info->SetCode(Handle<Code>::null());
303 return false; 307 return false;
304 } 308 }
305 309
306 if (graph != NULL) { 310 if (graph != NULL) {
307 Handle<Code> optimized_code = graph->Compile(info, graph->zone()); 311 Handle<Code> optimized_code = graph->Compile();
308 if (!optimized_code.is_null()) { 312 if (!optimized_code.is_null()) {
309 info->SetCode(optimized_code); 313 info->SetCode(optimized_code);
310 FinishOptimization(info->closure(), start); 314 FinishOptimization(info->closure(), start);
311 return true; 315 return true;
312 } 316 }
313 } 317 }
314 318
315 // Keep using the shared code. 319 // Keep using the shared code.
316 info->AbortOptimization(); 320 info->AbortOptimization();
317 if (!builder.inline_bailout()) { 321 if (!builder.inline_bailout()) {
(...skipping 22 matching lines...) Expand all
340 } 344 }
341 345
342 346
343 #ifdef ENABLE_DEBUGGER_SUPPORT 347 #ifdef ENABLE_DEBUGGER_SUPPORT
344 bool Compiler::MakeCodeForLiveEdit(CompilationInfo* info) { 348 bool Compiler::MakeCodeForLiveEdit(CompilationInfo* info) {
345 // Precondition: code has been parsed. Postcondition: the code field in 349 // Precondition: code has been parsed. Postcondition: the code field in
346 // the compilation info is set if compilation succeeded. 350 // the compilation info is set if compilation succeeded.
347 bool succeeded = MakeCode(info); 351 bool succeeded = MakeCode(info);
348 if (!info->shared_info().is_null()) { 352 if (!info->shared_info().is_null()) {
349 Handle<ScopeInfo> scope_info = ScopeInfo::Create(info->scope(), 353 Handle<ScopeInfo> scope_info = ScopeInfo::Create(info->scope(),
350 info->isolate()->zone()); 354 info->zone());
351 info->shared_info()->set_scope_info(*scope_info); 355 info->shared_info()->set_scope_info(*scope_info);
352 } 356 }
353 return succeeded; 357 return succeeded;
354 } 358 }
355 #endif 359 #endif
356 360
357 361
358 static Handle<SharedFunctionInfo> MakeFunctionInfo(CompilationInfo* info) { 362 static Handle<SharedFunctionInfo> MakeFunctionInfo(CompilationInfo* info) {
359 Isolate* isolate = info->isolate(); 363 Isolate* isolate = info->isolate();
360 ZoneScope zone_scope(isolate, DELETE_ON_EXIT); 364 ZoneScope zone_scope(info->zone(), DELETE_ON_EXIT);
361 PostponeInterruptsScope postpone(isolate); 365 PostponeInterruptsScope postpone(isolate);
362 366
363 ASSERT(!isolate->global_context().is_null()); 367 ASSERT(!isolate->global_context().is_null());
364 Handle<Script> script = info->script(); 368 Handle<Script> script = info->script();
365 script->set_context_data((*isolate->global_context())->data()); 369 script->set_context_data((*isolate->global_context())->data());
366 370
367 #ifdef ENABLE_DEBUGGER_SUPPORT 371 #ifdef ENABLE_DEBUGGER_SUPPORT
368 if (info->is_eval()) { 372 if (info->is_eval()) {
369 Script::CompilationType compilation_type = Script::COMPILATION_TYPE_EVAL; 373 Script::CompilationType compilation_type = Script::COMPILATION_TYPE_EVAL;
370 script->set_compilation_type(Smi::FromInt(compilation_type)); 374 script->set_compilation_type(Smi::FromInt(compilation_type));
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 return Handle<SharedFunctionInfo>::null(); 418 return Handle<SharedFunctionInfo>::null();
415 } 419 }
416 420
417 // Allocate function. 421 // Allocate function.
418 ASSERT(!info->code().is_null()); 422 ASSERT(!info->code().is_null());
419 Handle<SharedFunctionInfo> result = 423 Handle<SharedFunctionInfo> result =
420 isolate->factory()->NewSharedFunctionInfo( 424 isolate->factory()->NewSharedFunctionInfo(
421 lit->name(), 425 lit->name(),
422 lit->materialized_literal_count(), 426 lit->materialized_literal_count(),
423 info->code(), 427 info->code(),
424 ScopeInfo::Create(info->scope(), info->isolate()->zone())); 428 ScopeInfo::Create(info->scope(), info->zone()));
425 429
426 ASSERT_EQ(RelocInfo::kNoPosition, lit->function_token_position()); 430 ASSERT_EQ(RelocInfo::kNoPosition, lit->function_token_position());
427 Compiler::SetFunctionInfo(result, lit, true, script); 431 Compiler::SetFunctionInfo(result, lit, true, script);
428 432
429 if (script->name()->IsString()) { 433 if (script->name()->IsString()) {
430 PROFILE(isolate, CodeCreateEvent( 434 PROFILE(isolate, CodeCreateEvent(
431 info->is_eval() 435 info->is_eval()
432 ? Logger::EVAL_TAG 436 ? Logger::EVAL_TAG
433 : Logger::ToNativeByScript(Logger::SCRIPT_TAG, *script), 437 : Logger::ToNativeByScript(Logger::SCRIPT_TAG, *script),
434 *info->code(), 438 *info->code(),
(...skipping 21 matching lines...) Expand all
456 460
457 script->set_compilation_state( 461 script->set_compilation_state(
458 Smi::FromInt(Script::COMPILATION_STATE_COMPILED)); 462 Smi::FromInt(Script::COMPILATION_STATE_COMPILED));
459 463
460 #ifdef ENABLE_DEBUGGER_SUPPORT 464 #ifdef ENABLE_DEBUGGER_SUPPORT
461 // Notify debugger 465 // Notify debugger
462 isolate->debugger()->OnAfterCompile( 466 isolate->debugger()->OnAfterCompile(
463 script, Debugger::NO_AFTER_COMPILE_FLAGS); 467 script, Debugger::NO_AFTER_COMPILE_FLAGS);
464 #endif 468 #endif
465 469
466 live_edit_tracker.RecordFunctionInfo(result, lit, isolate->zone()); 470 live_edit_tracker.RecordFunctionInfo(result, lit, info->zone());
467 471
468 return result; 472 return result;
469 } 473 }
470 474
471 475
472 Handle<SharedFunctionInfo> Compiler::Compile(Handle<String> source, 476 Handle<SharedFunctionInfo> Compiler::Compile(Handle<String> source,
473 Handle<Object> script_name, 477 Handle<Object> script_name,
474 int line_offset, 478 int line_offset,
475 int column_offset, 479 int column_offset,
476 v8::Extension* extension, 480 v8::Extension* extension,
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
514 if (!script_name.is_null()) { 518 if (!script_name.is_null()) {
515 script->set_name(*script_name); 519 script->set_name(*script_name);
516 script->set_line_offset(Smi::FromInt(line_offset)); 520 script->set_line_offset(Smi::FromInt(line_offset));
517 script->set_column_offset(Smi::FromInt(column_offset)); 521 script->set_column_offset(Smi::FromInt(column_offset));
518 } 522 }
519 523
520 script->set_data(script_data.is_null() ? HEAP->undefined_value() 524 script->set_data(script_data.is_null() ? HEAP->undefined_value()
521 : *script_data); 525 : *script_data);
522 526
523 // Compile the function and add it to the cache. 527 // Compile the function and add it to the cache.
524 CompilationInfo info(script); 528 CompilationInfoWithZone info(script);
525 info.MarkAsGlobal(); 529 info.MarkAsGlobal();
526 info.SetExtension(extension); 530 info.SetExtension(extension);
527 info.SetPreParseData(pre_data); 531 info.SetPreParseData(pre_data);
528 if (FLAG_use_strict) { 532 if (FLAG_use_strict) {
529 info.SetLanguageMode(FLAG_harmony_scoping ? EXTENDED_MODE : STRICT_MODE); 533 info.SetLanguageMode(FLAG_harmony_scoping ? EXTENDED_MODE : STRICT_MODE);
530 } 534 }
531 result = MakeFunctionInfo(&info); 535 result = MakeFunctionInfo(&info);
532 if (extension == NULL && !result.is_null()) { 536 if (extension == NULL && !result.is_null()) {
533 compilation_cache->PutScript(source, result); 537 compilation_cache->PutScript(source, result);
534 } 538 }
(...skipping 27 matching lines...) Expand all
562 CompilationCache* compilation_cache = isolate->compilation_cache(); 566 CompilationCache* compilation_cache = isolate->compilation_cache();
563 result = compilation_cache->LookupEval(source, 567 result = compilation_cache->LookupEval(source,
564 context, 568 context,
565 is_global, 569 is_global,
566 language_mode, 570 language_mode,
567 scope_position); 571 scope_position);
568 572
569 if (result.is_null()) { 573 if (result.is_null()) {
570 // Create a script object describing the script to be compiled. 574 // Create a script object describing the script to be compiled.
571 Handle<Script> script = isolate->factory()->NewScript(source); 575 Handle<Script> script = isolate->factory()->NewScript(source);
572 CompilationInfo info(script); 576 CompilationInfoWithZone info(script);
573 info.MarkAsEval(); 577 info.MarkAsEval();
574 if (is_global) info.MarkAsGlobal(); 578 if (is_global) info.MarkAsGlobal();
575 info.SetLanguageMode(language_mode); 579 info.SetLanguageMode(language_mode);
576 info.SetCallingContext(context); 580 info.SetCallingContext(context);
577 result = MakeFunctionInfo(&info); 581 result = MakeFunctionInfo(&info);
578 if (!result.is_null()) { 582 if (!result.is_null()) {
579 // Explicitly disable optimization for eval code. We're not yet prepared 583 // Explicitly disable optimization for eval code. We're not yet prepared
580 // to handle eval-code in the optimizing compiler. 584 // to handle eval-code in the optimizing compiler.
581 result->DisableOptimization(); 585 result->DisableOptimization();
582 586
(...skipping 14 matching lines...) Expand all
597 } 601 }
598 } 602 }
599 603
600 return result; 604 return result;
601 } 605 }
602 606
603 607
604 bool Compiler::CompileLazy(CompilationInfo* info) { 608 bool Compiler::CompileLazy(CompilationInfo* info) {
605 Isolate* isolate = info->isolate(); 609 Isolate* isolate = info->isolate();
606 610
607 ZoneScope zone_scope(isolate, DELETE_ON_EXIT); 611 ZoneScope zone_scope(info->zone(), DELETE_ON_EXIT);
608 612
609 // The VM is in the COMPILER state until exiting this function. 613 // The VM is in the COMPILER state until exiting this function.
610 VMState state(isolate, COMPILER); 614 VMState state(isolate, COMPILER);
611 615
612 PostponeInterruptsScope postpone(isolate); 616 PostponeInterruptsScope postpone(isolate);
613 617
614 Handle<SharedFunctionInfo> shared = info->shared_info(); 618 Handle<SharedFunctionInfo> shared = info->shared_info();
615 int compiled_size = shared->end_position() - shared->start_position(); 619 int compiled_size = shared->end_position() - shared->start_position();
616 isolate->counters()->total_compile_size()->Increment(compiled_size); 620 isolate->counters()->total_compile_size()->Increment(compiled_size);
617 621
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
685 SharedFunctionInfo::AddToOptimizedCodeMap( 689 SharedFunctionInfo::AddToOptimizedCodeMap(
686 shared, global_context, code, literals); 690 shared, global_context, code, literals);
687 } 691 }
688 } else { 692 } else {
689 // Update the shared function info with the compiled code and the 693 // Update the shared function info with the compiled code and the
690 // scope info. Please note, that the order of the shared function 694 // scope info. Please note, that the order of the shared function
691 // info initialization is important since set_scope_info might 695 // info initialization is important since set_scope_info might
692 // trigger a GC, causing the ASSERT below to be invalid if the code 696 // trigger a GC, causing the ASSERT below to be invalid if the code
693 // was flushed. By setting the code object last we avoid this. 697 // was flushed. By setting the code object last we avoid this.
694 Handle<ScopeInfo> scope_info = 698 Handle<ScopeInfo> scope_info =
695 ScopeInfo::Create(info->scope(), info->isolate()->zone()); 699 ScopeInfo::Create(info->scope(), info->zone());
696 shared->set_scope_info(*scope_info); 700 shared->set_scope_info(*scope_info);
697 shared->set_code(*code); 701 shared->set_code(*code);
698 if (!function.is_null()) { 702 if (!function.is_null()) {
699 function->ReplaceCode(*code); 703 function->ReplaceCode(*code);
700 ASSERT(!function->IsOptimized()); 704 ASSERT(!function->IsOptimized());
701 } 705 }
702 706
703 // Set the expected number of properties for instances. 707 // Set the expected number of properties for instances.
704 FunctionLiteral* lit = info->function(); 708 FunctionLiteral* lit = info->function();
705 int expected = lit->expected_property_count(); 709 int expected = lit->expected_property_count();
(...skipping 14 matching lines...) Expand all
720 shared->set_ast_node_count(lit->ast_node_count()); 724 shared->set_ast_node_count(lit->ast_node_count());
721 725
722 if (V8::UseCrankshaft()&& 726 if (V8::UseCrankshaft()&&
723 !function.is_null() && 727 !function.is_null() &&
724 !shared->optimization_disabled()) { 728 !shared->optimization_disabled()) {
725 // If we're asked to always optimize, we compile the optimized 729 // If we're asked to always optimize, we compile the optimized
726 // version of the function right away - unless the debugger is 730 // version of the function right away - unless the debugger is
727 // active as it makes no sense to compile optimized code then. 731 // active as it makes no sense to compile optimized code then.
728 if (FLAG_always_opt && 732 if (FLAG_always_opt &&
729 !Isolate::Current()->DebuggerHasBreakPoints()) { 733 !Isolate::Current()->DebuggerHasBreakPoints()) {
730 CompilationInfo optimized(function); 734 CompilationInfoWithZone optimized(function);
731 optimized.SetOptimizing(AstNode::kNoNumber); 735 optimized.SetOptimizing(AstNode::kNoNumber);
732 return CompileLazy(&optimized); 736 return CompileLazy(&optimized);
733 } 737 }
734 } 738 }
735 } 739 }
736 740
737 return true; 741 return true;
738 } 742 }
739 } 743 }
740 744
741 ASSERT(info->code().is_null()); 745 ASSERT(info->code().is_null());
742 return false; 746 return false;
743 } 747 }
744 748
745 749
746 Handle<SharedFunctionInfo> Compiler::BuildFunctionInfo(FunctionLiteral* literal, 750 Handle<SharedFunctionInfo> Compiler::BuildFunctionInfo(FunctionLiteral* literal,
747 Handle<Script> script) { 751 Handle<Script> script) {
748 // Precondition: code has been parsed and scopes have been analyzed. 752 // Precondition: code has been parsed and scopes have been analyzed.
749 CompilationInfo info(script); 753 CompilationInfoWithZone info(script);
750 info.SetFunction(literal); 754 info.SetFunction(literal);
751 info.SetScope(literal->scope()); 755 info.SetScope(literal->scope());
752 info.SetLanguageMode(literal->scope()->language_mode()); 756 info.SetLanguageMode(literal->scope()->language_mode());
753 757
754 LiveEditFunctionTracker live_edit_tracker(info.isolate(), literal); 758 LiveEditFunctionTracker live_edit_tracker(info.isolate(), literal);
755 // Determine if the function can be lazily compiled. This is necessary to 759 // Determine if the function can be lazily compiled. This is necessary to
756 // allow some of our builtin JS files to be lazily compiled. These 760 // allow some of our builtin JS files to be lazily compiled. These
757 // builtins cannot be handled lazily by the parser, since we have to know 761 // builtins cannot be handled lazily by the parser, since we have to know
758 // if a function uses the special natives syntax, which is something the 762 // if a function uses the special natives syntax, which is something the
759 // parser records. 763 // parser records.
760 // If the debugger requests compilation for break points, we cannot be 764 // If the debugger requests compilation for break points, we cannot be
761 // aggressive about lazy compilation, because it might trigger compilation 765 // aggressive about lazy compilation, because it might trigger compilation
762 // of functions without an outer context when setting a breakpoint through 766 // of functions without an outer context when setting a breakpoint through
763 // Runtime::FindSharedFunctionInfoInScript. 767 // Runtime::FindSharedFunctionInfoInScript.
764 bool allow_lazy_without_ctx = literal->AllowsLazyCompilationWithoutContext(); 768 bool allow_lazy_without_ctx = literal->AllowsLazyCompilationWithoutContext();
765 bool allow_lazy = literal->AllowsLazyCompilation() && 769 bool allow_lazy = literal->AllowsLazyCompilation() &&
766 !LiveEditFunctionTracker::IsActive(info.isolate()) && 770 !LiveEditFunctionTracker::IsActive(info.isolate()) &&
767 (!info.isolate()->DebuggerHasBreakPoints() || allow_lazy_without_ctx); 771 (!info.isolate()->DebuggerHasBreakPoints() || allow_lazy_without_ctx);
768 772
769 Handle<ScopeInfo> scope_info(ScopeInfo::Empty()); 773 Handle<ScopeInfo> scope_info(ScopeInfo::Empty());
770 774
771 // Generate code 775 // Generate code
772 if (FLAG_lazy && allow_lazy) { 776 if (FLAG_lazy && allow_lazy) {
773 Handle<Code> code = info.isolate()->builtins()->LazyCompile(); 777 Handle<Code> code = info.isolate()->builtins()->LazyCompile();
774 info.SetCode(code); 778 info.SetCode(code);
775 } else if ((V8::UseCrankshaft() && MakeCrankshaftCode(&info)) || 779 } else if ((V8::UseCrankshaft() && MakeCrankshaftCode(&info)) ||
776 (!V8::UseCrankshaft() && FullCodeGenerator::MakeCode(&info))) { 780 (!V8::UseCrankshaft() && FullCodeGenerator::MakeCode(&info))) {
777 ASSERT(!info.code().is_null()); 781 ASSERT(!info.code().is_null());
778 scope_info = ScopeInfo::Create(info.scope(), info.isolate()->zone()); 782 scope_info = ScopeInfo::Create(info.scope(), info.zone());
779 } else { 783 } else {
780 return Handle<SharedFunctionInfo>::null(); 784 return Handle<SharedFunctionInfo>::null();
781 } 785 }
782 786
783 // Create a shared function info object. 787 // Create a shared function info object.
784 Handle<SharedFunctionInfo> result = 788 Handle<SharedFunctionInfo> result =
785 FACTORY->NewSharedFunctionInfo(literal->name(), 789 FACTORY->NewSharedFunctionInfo(literal->name(),
786 literal->materialized_literal_count(), 790 literal->materialized_literal_count(),
787 info.code(), 791 info.code(),
788 scope_info); 792 scope_info);
789 SetFunctionInfo(result, literal, false, script); 793 SetFunctionInfo(result, literal, false, script);
790 RecordFunctionCompilation(Logger::FUNCTION_TAG, &info, result); 794 RecordFunctionCompilation(Logger::FUNCTION_TAG, &info, result);
791 result->set_allows_lazy_compilation(allow_lazy); 795 result->set_allows_lazy_compilation(allow_lazy);
792 result->set_allows_lazy_compilation_without_context(allow_lazy_without_ctx); 796 result->set_allows_lazy_compilation_without_context(allow_lazy_without_ctx);
793 797
794 // Set the expected number of properties for instances and return 798 // Set the expected number of properties for instances and return
795 // the resulting function. 799 // the resulting function.
796 SetExpectedNofPropertiesFromEstimate(result, 800 SetExpectedNofPropertiesFromEstimate(result,
797 literal->expected_property_count()); 801 literal->expected_property_count());
798 live_edit_tracker.RecordFunctionInfo(result, literal, info.isolate()->zone()); 802 live_edit_tracker.RecordFunctionInfo(result, literal, info.zone());
799 return result; 803 return result;
800 } 804 }
801 805
802 806
803 // Sets the function info on a function. 807 // Sets the function info on a function.
804 // The start_position points to the first '(' character after the function name 808 // The start_position points to the first '(' character after the function name
805 // in the full script source. When counting characters in the script source the 809 // in the full script source. When counting characters in the script source the
806 // the first character is number 0 (not 1). 810 // the first character is number 0 (not 1).
807 void Compiler::SetFunctionInfo(Handle<SharedFunctionInfo> function_info, 811 void Compiler::SetFunctionInfo(Handle<SharedFunctionInfo> function_info,
808 FunctionLiteral* lit, 812 FunctionLiteral* lit,
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
867 } 871 }
868 } 872 }
869 873
870 GDBJIT(AddCode(Handle<String>(shared->DebugName()), 874 GDBJIT(AddCode(Handle<String>(shared->DebugName()),
871 Handle<Script>(info->script()), 875 Handle<Script>(info->script()),
872 Handle<Code>(info->code()), 876 Handle<Code>(info->code()),
873 info)); 877 info));
874 } 878 }
875 879
876 } } // namespace v8::internal 880 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/compiler.h ('k') | src/debug.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698