OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_COMPILER_H_ | 5 #ifndef V8_COMPILER_H_ |
6 #define V8_COMPILER_H_ | 6 #define V8_COMPILER_H_ |
7 | 7 |
8 #include "src/allocation.h" | 8 #include "src/allocation.h" |
9 #include "src/ast.h" | 9 #include "src/ast.h" |
10 #include "src/zone.h" | 10 #include "src/zone.h" |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
75 bool is_eval() const { return IsEval::decode(flags_); } | 75 bool is_eval() const { return IsEval::decode(flags_); } |
76 bool is_global() const { return IsGlobal::decode(flags_); } | 76 bool is_global() const { return IsGlobal::decode(flags_); } |
77 StrictMode strict_mode() const { return StrictModeField::decode(flags_); } | 77 StrictMode strict_mode() const { return StrictModeField::decode(flags_); } |
78 FunctionLiteral* function() const { return function_; } | 78 FunctionLiteral* function() const { return function_; } |
79 Scope* scope() const { return scope_; } | 79 Scope* scope() const { return scope_; } |
80 Scope* global_scope() const { return global_scope_; } | 80 Scope* global_scope() const { return global_scope_; } |
81 Handle<Code> code() const { return code_; } | 81 Handle<Code> code() const { return code_; } |
82 Handle<JSFunction> closure() const { return closure_; } | 82 Handle<JSFunction> closure() const { return closure_; } |
83 Handle<SharedFunctionInfo> shared_info() const { return shared_info_; } | 83 Handle<SharedFunctionInfo> shared_info() const { return shared_info_; } |
84 Handle<Script> script() const { return script_; } | 84 Handle<Script> script() const { return script_; } |
| 85 void set_script(Handle<Script> script) { script_ = script; } |
85 HydrogenCodeStub* code_stub() const {return code_stub_; } | 86 HydrogenCodeStub* code_stub() const {return code_stub_; } |
86 v8::Extension* extension() const { return extension_; } | 87 v8::Extension* extension() const { return extension_; } |
87 ScriptData** cached_data() const { return cached_data_; } | 88 ScriptData** cached_data() const { return cached_data_; } |
88 ScriptCompiler::CompileOptions compile_options() const { | 89 ScriptCompiler::CompileOptions compile_options() const { |
89 return compile_options_; | 90 return compile_options_; |
90 } | 91 } |
| 92 ExternalSourceStream* source_stream() const { return source_stream_; } |
91 Handle<Context> context() const { return context_; } | 93 Handle<Context> context() const { return context_; } |
92 BailoutId osr_ast_id() const { return osr_ast_id_; } | 94 BailoutId osr_ast_id() const { return osr_ast_id_; } |
93 Handle<Code> unoptimized_code() const { return unoptimized_code_; } | 95 Handle<Code> unoptimized_code() const { return unoptimized_code_; } |
94 int opt_count() const { return opt_count_; } | 96 int opt_count() const { return opt_count_; } |
95 int num_parameters() const; | 97 int num_parameters() const; |
96 int num_heap_slots() const; | 98 int num_heap_slots() const; |
97 Code::Flags flags() const; | 99 Code::Flags flags() const; |
98 | 100 |
99 void MarkAsEval() { | 101 void MarkAsEval() { |
100 DCHECK(!is_lazy()); | 102 DCHECK(!is_lazy()); |
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
366 } | 368 } |
367 | 369 |
368 protected: | 370 protected: |
369 CompilationInfo(Handle<Script> script, | 371 CompilationInfo(Handle<Script> script, |
370 Zone* zone); | 372 Zone* zone); |
371 CompilationInfo(Handle<SharedFunctionInfo> shared_info, | 373 CompilationInfo(Handle<SharedFunctionInfo> shared_info, |
372 Zone* zone); | 374 Zone* zone); |
373 CompilationInfo(HydrogenCodeStub* stub, | 375 CompilationInfo(HydrogenCodeStub* stub, |
374 Isolate* isolate, | 376 Isolate* isolate, |
375 Zone* zone); | 377 Zone* zone); |
| 378 CompilationInfo(ExternalSourceStream* source_stream, Isolate* isolate, |
| 379 Zone* zone); |
| 380 |
376 | 381 |
377 private: | 382 private: |
378 Isolate* isolate_; | 383 Isolate* isolate_; |
379 | 384 |
380 // Compilation mode. | 385 // Compilation mode. |
381 // BASE is generated by the full codegen, optionally prepared for bailouts. | 386 // BASE is generated by the full codegen, optionally prepared for bailouts. |
382 // OPTIMIZE is optimized code generated by the Hydrogen-based backend. | 387 // OPTIMIZE is optimized code generated by the Hydrogen-based backend. |
383 // NONOPT is generated by the full codegen and is not prepared for | 388 // NONOPT is generated by the full codegen and is not prepared for |
384 // recompilation/bailouts. These functions are never recompiled. | 389 // recompilation/bailouts. These functions are never recompiled. |
385 enum Mode { | 390 enum Mode { |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
443 Scope* global_scope_; | 448 Scope* global_scope_; |
444 // For compiled stubs, the stub object | 449 // For compiled stubs, the stub object |
445 HydrogenCodeStub* code_stub_; | 450 HydrogenCodeStub* code_stub_; |
446 // The compiled code. | 451 // The compiled code. |
447 Handle<Code> code_; | 452 Handle<Code> code_; |
448 | 453 |
449 // Possible initial inputs to the compilation process. | 454 // Possible initial inputs to the compilation process. |
450 Handle<JSFunction> closure_; | 455 Handle<JSFunction> closure_; |
451 Handle<SharedFunctionInfo> shared_info_; | 456 Handle<SharedFunctionInfo> shared_info_; |
452 Handle<Script> script_; | 457 Handle<Script> script_; |
| 458 ExternalSourceStream* source_stream_; |
453 | 459 |
454 // Fields possibly needed for eager compilation, NULL by default. | 460 // Fields possibly needed for eager compilation, NULL by default. |
455 v8::Extension* extension_; | 461 v8::Extension* extension_; |
456 ScriptData** cached_data_; | 462 ScriptData** cached_data_; |
457 ScriptCompiler::CompileOptions compile_options_; | 463 ScriptCompiler::CompileOptions compile_options_; |
458 | 464 |
459 // The context of the caller for eval code, and the global context for a | 465 // The context of the caller for eval code, and the global context for a |
460 // global script. Will be a null handle otherwise. | 466 // global script. Will be a null handle otherwise. |
461 Handle<Context> context_; | 467 Handle<Context> context_; |
462 | 468 |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
522 public: | 528 public: |
523 explicit CompilationInfoWithZone(Handle<Script> script) | 529 explicit CompilationInfoWithZone(Handle<Script> script) |
524 : CompilationInfo(script, &zone_), | 530 : CompilationInfo(script, &zone_), |
525 zone_(script->GetIsolate()) {} | 531 zone_(script->GetIsolate()) {} |
526 explicit CompilationInfoWithZone(Handle<SharedFunctionInfo> shared_info) | 532 explicit CompilationInfoWithZone(Handle<SharedFunctionInfo> shared_info) |
527 : CompilationInfo(shared_info, &zone_), | 533 : CompilationInfo(shared_info, &zone_), |
528 zone_(shared_info->GetIsolate()) {} | 534 zone_(shared_info->GetIsolate()) {} |
529 explicit CompilationInfoWithZone(Handle<JSFunction> closure) | 535 explicit CompilationInfoWithZone(Handle<JSFunction> closure) |
530 : CompilationInfo(closure, &zone_), | 536 : CompilationInfo(closure, &zone_), |
531 zone_(closure->GetIsolate()) {} | 537 zone_(closure->GetIsolate()) {} |
| 538 explicit CompilationInfoWithZone(ExternalSourceStream* stream, |
| 539 Isolate* isolate) |
| 540 : CompilationInfo(stream, isolate, &zone_), zone_(isolate) {} |
532 CompilationInfoWithZone(HydrogenCodeStub* stub, Isolate* isolate) | 541 CompilationInfoWithZone(HydrogenCodeStub* stub, Isolate* isolate) |
533 : CompilationInfo(stub, isolate, &zone_), | 542 : CompilationInfo(stub, isolate, &zone_), |
534 zone_(isolate) {} | 543 zone_(isolate) {} |
535 | 544 |
536 // Virtual destructor because a CompilationInfoWithZone has to exit the | 545 // Virtual destructor because a CompilationInfoWithZone has to exit the |
537 // zone scope and get rid of dependent maps even when the destructor is | 546 // zone scope and get rid of dependent maps even when the destructor is |
538 // called when cast as a CompilationInfo. | 547 // called when cast as a CompilationInfo. |
539 virtual ~CompilationInfoWithZone() { | 548 virtual ~CompilationInfoWithZone() { |
540 RollbackDependencies(); | 549 RollbackDependencies(); |
541 } | 550 } |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
684 int scope_position); | 693 int scope_position); |
685 | 694 |
686 // Compile a String source within a context. | 695 // Compile a String source within a context. |
687 static Handle<SharedFunctionInfo> CompileScript( | 696 static Handle<SharedFunctionInfo> CompileScript( |
688 Handle<String> source, Handle<Object> script_name, int line_offset, | 697 Handle<String> source, Handle<Object> script_name, int line_offset, |
689 int column_offset, bool is_shared_cross_origin, Handle<Context> context, | 698 int column_offset, bool is_shared_cross_origin, Handle<Context> context, |
690 v8::Extension* extension, ScriptData** cached_data, | 699 v8::Extension* extension, ScriptData** cached_data, |
691 ScriptCompiler::CompileOptions compile_options, | 700 ScriptCompiler::CompileOptions compile_options, |
692 NativesFlag is_natives_code); | 701 NativesFlag is_natives_code); |
693 | 702 |
| 703 static Handle<SharedFunctionInfo> CompileStreamedScript(CompilationInfo* info, |
| 704 int source_length); |
| 705 |
694 // Create a shared function info object (the code may be lazily compiled). | 706 // Create a shared function info object (the code may be lazily compiled). |
695 static Handle<SharedFunctionInfo> BuildFunctionInfo(FunctionLiteral* node, | 707 static Handle<SharedFunctionInfo> BuildFunctionInfo(FunctionLiteral* node, |
696 Handle<Script> script, | 708 Handle<Script> script, |
697 CompilationInfo* outer); | 709 CompilationInfo* outer); |
698 | 710 |
699 enum ConcurrencyMode { NOT_CONCURRENT, CONCURRENT }; | 711 enum ConcurrencyMode { NOT_CONCURRENT, CONCURRENT }; |
700 | 712 |
701 // Generate and return optimized code or start a concurrent optimization job. | 713 // Generate and return optimized code or start a concurrent optimization job. |
702 // In the latter case, return the InOptimizationQueue builtin. On failure, | 714 // In the latter case, return the InOptimizationQueue builtin. On failure, |
703 // return the empty handle. | 715 // return the empty handle. |
704 MUST_USE_RESULT static MaybeHandle<Code> GetOptimizedCode( | 716 MUST_USE_RESULT static MaybeHandle<Code> GetOptimizedCode( |
705 Handle<JSFunction> function, | 717 Handle<JSFunction> function, |
706 Handle<Code> current_code, | 718 Handle<Code> current_code, |
707 ConcurrencyMode mode, | 719 ConcurrencyMode mode, |
708 BailoutId osr_ast_id = BailoutId::None()); | 720 BailoutId osr_ast_id = BailoutId::None()); |
709 | 721 |
710 // Generate and return code from previously queued optimization job. | 722 // Generate and return code from previously queued optimization job. |
711 // On failure, return the empty handle. | 723 // On failure, return the empty handle. |
712 static Handle<Code> GetConcurrentlyOptimizedCode(OptimizedCompileJob* job); | 724 static Handle<Code> GetConcurrentlyOptimizedCode(OptimizedCompileJob* job); |
713 | 725 |
714 static void RecordFunctionCompilation(Logger::LogEventsAndTags tag, | 726 static void RecordFunctionCompilation(Logger::LogEventsAndTags tag, |
715 CompilationInfo* info, | 727 CompilationInfo* info, |
716 Handle<SharedFunctionInfo> shared); | 728 Handle<SharedFunctionInfo> shared); |
| 729 |
| 730 static bool DebuggerWantsEagerCompilation( |
| 731 CompilationInfo* info, bool allow_lazy_without_ctx = false); |
717 }; | 732 }; |
718 | 733 |
719 | 734 |
720 class CompilationPhase BASE_EMBEDDED { | 735 class CompilationPhase BASE_EMBEDDED { |
721 public: | 736 public: |
722 CompilationPhase(const char* name, CompilationInfo* info); | 737 CompilationPhase(const char* name, CompilationInfo* info); |
723 ~CompilationPhase(); | 738 ~CompilationPhase(); |
724 | 739 |
725 protected: | 740 protected: |
726 bool ShouldProduceTraceOutput() const; | 741 bool ShouldProduceTraceOutput() const; |
727 | 742 |
728 const char* name() const { return name_; } | 743 const char* name() const { return name_; } |
729 CompilationInfo* info() const { return info_; } | 744 CompilationInfo* info() const { return info_; } |
730 Isolate* isolate() const { return info()->isolate(); } | 745 Isolate* isolate() const { return info()->isolate(); } |
731 Zone* zone() { return &zone_; } | 746 Zone* zone() { return &zone_; } |
732 | 747 |
733 private: | 748 private: |
734 const char* name_; | 749 const char* name_; |
735 CompilationInfo* info_; | 750 CompilationInfo* info_; |
736 Zone zone_; | 751 Zone zone_; |
737 unsigned info_zone_start_allocation_size_; | 752 unsigned info_zone_start_allocation_size_; |
738 base::ElapsedTimer timer_; | 753 base::ElapsedTimer timer_; |
739 | 754 |
740 DISALLOW_COPY_AND_ASSIGN(CompilationPhase); | 755 DISALLOW_COPY_AND_ASSIGN(CompilationPhase); |
741 }; | 756 }; |
742 | 757 |
743 } } // namespace v8::internal | 758 } } // namespace v8::internal |
744 | 759 |
745 #endif // V8_COMPILER_H_ | 760 #endif // V8_COMPILER_H_ |
OLD | NEW |