| 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 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 StrictMode strict_mode() const { | 100 StrictMode strict_mode() const { |
| 101 return GetFlag(kStrictMode) ? STRICT : SLOPPY; | 101 return GetFlag(kStrictMode) ? STRICT : SLOPPY; |
| 102 } | 102 } |
| 103 FunctionLiteral* function() const { return function_; } | 103 FunctionLiteral* function() const { return function_; } |
| 104 Scope* scope() const { return scope_; } | 104 Scope* scope() const { return scope_; } |
| 105 Scope* global_scope() const { return global_scope_; } | 105 Scope* global_scope() const { return global_scope_; } |
| 106 Handle<Code> code() const { return code_; } | 106 Handle<Code> code() const { return code_; } |
| 107 Handle<JSFunction> closure() const { return closure_; } | 107 Handle<JSFunction> closure() const { return closure_; } |
| 108 Handle<SharedFunctionInfo> shared_info() const { return shared_info_; } | 108 Handle<SharedFunctionInfo> shared_info() const { return shared_info_; } |
| 109 Handle<Script> script() const { return script_; } | 109 Handle<Script> script() const { return script_; } |
| 110 void set_script(Handle<Script> script) { script_ = script; } |
| 110 HydrogenCodeStub* code_stub() const {return code_stub_; } | 111 HydrogenCodeStub* code_stub() const {return code_stub_; } |
| 111 v8::Extension* extension() const { return extension_; } | 112 v8::Extension* extension() const { return extension_; } |
| 112 ScriptData** cached_data() const { return cached_data_; } | 113 ScriptData** cached_data() const { return cached_data_; } |
| 113 ScriptCompiler::CompileOptions compile_options() const { | 114 ScriptCompiler::CompileOptions compile_options() const { |
| 114 return compile_options_; | 115 return compile_options_; |
| 115 } | 116 } |
| 117 ScriptCompiler::ExternalSourceStream* source_stream() const { |
| 118 return source_stream_; |
| 119 } |
| 116 Handle<Context> context() const { return context_; } | 120 Handle<Context> context() const { return context_; } |
| 117 BailoutId osr_ast_id() const { return osr_ast_id_; } | 121 BailoutId osr_ast_id() const { return osr_ast_id_; } |
| 118 Handle<Code> unoptimized_code() const { return unoptimized_code_; } | 122 Handle<Code> unoptimized_code() const { return unoptimized_code_; } |
| 119 int opt_count() const { return opt_count_; } | 123 int opt_count() const { return opt_count_; } |
| 120 int num_parameters() const; | 124 int num_parameters() const; |
| 121 int num_heap_slots() const; | 125 int num_heap_slots() const; |
| 122 Code::Flags flags() const; | 126 Code::Flags flags() const; |
| 123 | 127 |
| 124 void MarkAsEval() { | 128 void MarkAsEval() { |
| 125 DCHECK(!is_lazy()); | 129 DCHECK(!is_lazy()); |
| (...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 371 AstNode::IdGen* ast_node_id_gen() { return &ast_node_id_gen_; } | 375 AstNode::IdGen* ast_node_id_gen() { return &ast_node_id_gen_; } |
| 372 | 376 |
| 373 protected: | 377 protected: |
| 374 CompilationInfo(Handle<Script> script, | 378 CompilationInfo(Handle<Script> script, |
| 375 Zone* zone); | 379 Zone* zone); |
| 376 CompilationInfo(Handle<SharedFunctionInfo> shared_info, | 380 CompilationInfo(Handle<SharedFunctionInfo> shared_info, |
| 377 Zone* zone); | 381 Zone* zone); |
| 378 CompilationInfo(HydrogenCodeStub* stub, | 382 CompilationInfo(HydrogenCodeStub* stub, |
| 379 Isolate* isolate, | 383 Isolate* isolate, |
| 380 Zone* zone); | 384 Zone* zone); |
| 385 CompilationInfo(ScriptCompiler::ExternalSourceStream* source_stream, |
| 386 Isolate* isolate, Zone* zone); |
| 387 |
| 381 | 388 |
| 382 private: | 389 private: |
| 383 Isolate* isolate_; | 390 Isolate* isolate_; |
| 384 | 391 |
| 385 // Compilation mode. | 392 // Compilation mode. |
| 386 // BASE is generated by the full codegen, optionally prepared for bailouts. | 393 // BASE is generated by the full codegen, optionally prepared for bailouts. |
| 387 // OPTIMIZE is optimized code generated by the Hydrogen-based backend. | 394 // OPTIMIZE is optimized code generated by the Hydrogen-based backend. |
| 388 // NONOPT is generated by the full codegen and is not prepared for | 395 // NONOPT is generated by the full codegen and is not prepared for |
| 389 // recompilation/bailouts. These functions are never recompiled. | 396 // recompilation/bailouts. These functions are never recompiled. |
| 390 enum Mode { | 397 enum Mode { |
| (...skipping 29 matching lines...) Expand all Loading... |
| 420 Scope* global_scope_; | 427 Scope* global_scope_; |
| 421 // For compiled stubs, the stub object | 428 // For compiled stubs, the stub object |
| 422 HydrogenCodeStub* code_stub_; | 429 HydrogenCodeStub* code_stub_; |
| 423 // The compiled code. | 430 // The compiled code. |
| 424 Handle<Code> code_; | 431 Handle<Code> code_; |
| 425 | 432 |
| 426 // Possible initial inputs to the compilation process. | 433 // Possible initial inputs to the compilation process. |
| 427 Handle<JSFunction> closure_; | 434 Handle<JSFunction> closure_; |
| 428 Handle<SharedFunctionInfo> shared_info_; | 435 Handle<SharedFunctionInfo> shared_info_; |
| 429 Handle<Script> script_; | 436 Handle<Script> script_; |
| 437 ScriptCompiler::ExternalSourceStream* source_stream_; |
| 430 | 438 |
| 431 // Fields possibly needed for eager compilation, NULL by default. | 439 // Fields possibly needed for eager compilation, NULL by default. |
| 432 v8::Extension* extension_; | 440 v8::Extension* extension_; |
| 433 ScriptData** cached_data_; | 441 ScriptData** cached_data_; |
| 434 ScriptCompiler::CompileOptions compile_options_; | 442 ScriptCompiler::CompileOptions compile_options_; |
| 435 | 443 |
| 436 // The context of the caller for eval code, and the global context for a | 444 // The context of the caller for eval code, and the global context for a |
| 437 // global script. Will be a null handle otherwise. | 445 // global script. Will be a null handle otherwise. |
| 438 Handle<Context> context_; | 446 Handle<Context> context_; |
| 439 | 447 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 498 public: | 506 public: |
| 499 explicit CompilationInfoWithZone(Handle<Script> script) | 507 explicit CompilationInfoWithZone(Handle<Script> script) |
| 500 : CompilationInfo(script, &zone_), | 508 : CompilationInfo(script, &zone_), |
| 501 zone_(script->GetIsolate()) {} | 509 zone_(script->GetIsolate()) {} |
| 502 explicit CompilationInfoWithZone(Handle<SharedFunctionInfo> shared_info) | 510 explicit CompilationInfoWithZone(Handle<SharedFunctionInfo> shared_info) |
| 503 : CompilationInfo(shared_info, &zone_), | 511 : CompilationInfo(shared_info, &zone_), |
| 504 zone_(shared_info->GetIsolate()) {} | 512 zone_(shared_info->GetIsolate()) {} |
| 505 explicit CompilationInfoWithZone(Handle<JSFunction> closure) | 513 explicit CompilationInfoWithZone(Handle<JSFunction> closure) |
| 506 : CompilationInfo(closure, &zone_), | 514 : CompilationInfo(closure, &zone_), |
| 507 zone_(closure->GetIsolate()) {} | 515 zone_(closure->GetIsolate()) {} |
| 516 explicit CompilationInfoWithZone(ScriptCompiler::ExternalSourceStream* stream, |
| 517 Isolate* isolate) |
| 518 : CompilationInfo(stream, isolate, &zone_), zone_(isolate) {} |
| 508 CompilationInfoWithZone(HydrogenCodeStub* stub, Isolate* isolate) | 519 CompilationInfoWithZone(HydrogenCodeStub* stub, Isolate* isolate) |
| 509 : CompilationInfo(stub, isolate, &zone_), | 520 : CompilationInfo(stub, isolate, &zone_), |
| 510 zone_(isolate) {} | 521 zone_(isolate) {} |
| 511 | 522 |
| 512 // Virtual destructor because a CompilationInfoWithZone has to exit the | 523 // Virtual destructor because a CompilationInfoWithZone has to exit the |
| 513 // zone scope and get rid of dependent maps even when the destructor is | 524 // zone scope and get rid of dependent maps even when the destructor is |
| 514 // called when cast as a CompilationInfo. | 525 // called when cast as a CompilationInfo. |
| 515 virtual ~CompilationInfoWithZone() { | 526 virtual ~CompilationInfoWithZone() { |
| 516 RollbackDependencies(); | 527 RollbackDependencies(); |
| 517 } | 528 } |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 660 int scope_position); | 671 int scope_position); |
| 661 | 672 |
| 662 // Compile a String source within a context. | 673 // Compile a String source within a context. |
| 663 static Handle<SharedFunctionInfo> CompileScript( | 674 static Handle<SharedFunctionInfo> CompileScript( |
| 664 Handle<String> source, Handle<Object> script_name, int line_offset, | 675 Handle<String> source, Handle<Object> script_name, int line_offset, |
| 665 int column_offset, bool is_shared_cross_origin, Handle<Context> context, | 676 int column_offset, bool is_shared_cross_origin, Handle<Context> context, |
| 666 v8::Extension* extension, ScriptData** cached_data, | 677 v8::Extension* extension, ScriptData** cached_data, |
| 667 ScriptCompiler::CompileOptions compile_options, | 678 ScriptCompiler::CompileOptions compile_options, |
| 668 NativesFlag is_natives_code); | 679 NativesFlag is_natives_code); |
| 669 | 680 |
| 681 static Handle<SharedFunctionInfo> CompileStreamedScript(CompilationInfo* info, |
| 682 int source_length); |
| 683 |
| 670 // Create a shared function info object (the code may be lazily compiled). | 684 // Create a shared function info object (the code may be lazily compiled). |
| 671 static Handle<SharedFunctionInfo> BuildFunctionInfo(FunctionLiteral* node, | 685 static Handle<SharedFunctionInfo> BuildFunctionInfo(FunctionLiteral* node, |
| 672 Handle<Script> script, | 686 Handle<Script> script, |
| 673 CompilationInfo* outer); | 687 CompilationInfo* outer); |
| 674 | 688 |
| 675 enum ConcurrencyMode { NOT_CONCURRENT, CONCURRENT }; | 689 enum ConcurrencyMode { NOT_CONCURRENT, CONCURRENT }; |
| 676 | 690 |
| 677 // Generate and return optimized code or start a concurrent optimization job. | 691 // Generate and return optimized code or start a concurrent optimization job. |
| 678 // In the latter case, return the InOptimizationQueue builtin. On failure, | 692 // In the latter case, return the InOptimizationQueue builtin. On failure, |
| 679 // return the empty handle. | 693 // return the empty handle. |
| 680 MUST_USE_RESULT static MaybeHandle<Code> GetOptimizedCode( | 694 MUST_USE_RESULT static MaybeHandle<Code> GetOptimizedCode( |
| 681 Handle<JSFunction> function, | 695 Handle<JSFunction> function, |
| 682 Handle<Code> current_code, | 696 Handle<Code> current_code, |
| 683 ConcurrencyMode mode, | 697 ConcurrencyMode mode, |
| 684 BailoutId osr_ast_id = BailoutId::None()); | 698 BailoutId osr_ast_id = BailoutId::None()); |
| 685 | 699 |
| 686 // Generate and return code from previously queued optimization job. | 700 // Generate and return code from previously queued optimization job. |
| 687 // On failure, return the empty handle. | 701 // On failure, return the empty handle. |
| 688 static Handle<Code> GetConcurrentlyOptimizedCode(OptimizedCompileJob* job); | 702 static Handle<Code> GetConcurrentlyOptimizedCode(OptimizedCompileJob* job); |
| 689 | 703 |
| 690 static void RecordFunctionCompilation(Logger::LogEventsAndTags tag, | 704 static void RecordFunctionCompilation(Logger::LogEventsAndTags tag, |
| 691 CompilationInfo* info, | 705 CompilationInfo* info, |
| 692 Handle<SharedFunctionInfo> shared); | 706 Handle<SharedFunctionInfo> shared); |
| 707 |
| 708 static bool DebuggerWantsEagerCompilation( |
| 709 CompilationInfo* info, bool allow_lazy_without_ctx = false); |
| 693 }; | 710 }; |
| 694 | 711 |
| 695 | 712 |
| 696 class CompilationPhase BASE_EMBEDDED { | 713 class CompilationPhase BASE_EMBEDDED { |
| 697 public: | 714 public: |
| 698 CompilationPhase(const char* name, CompilationInfo* info); | 715 CompilationPhase(const char* name, CompilationInfo* info); |
| 699 ~CompilationPhase(); | 716 ~CompilationPhase(); |
| 700 | 717 |
| 701 protected: | 718 protected: |
| 702 bool ShouldProduceTraceOutput() const; | 719 bool ShouldProduceTraceOutput() const; |
| 703 | 720 |
| 704 const char* name() const { return name_; } | 721 const char* name() const { return name_; } |
| 705 CompilationInfo* info() const { return info_; } | 722 CompilationInfo* info() const { return info_; } |
| 706 Isolate* isolate() const { return info()->isolate(); } | 723 Isolate* isolate() const { return info()->isolate(); } |
| 707 Zone* zone() { return &zone_; } | 724 Zone* zone() { return &zone_; } |
| 708 | 725 |
| 709 private: | 726 private: |
| 710 const char* name_; | 727 const char* name_; |
| 711 CompilationInfo* info_; | 728 CompilationInfo* info_; |
| 712 Zone zone_; | 729 Zone zone_; |
| 713 unsigned info_zone_start_allocation_size_; | 730 unsigned info_zone_start_allocation_size_; |
| 714 base::ElapsedTimer timer_; | 731 base::ElapsedTimer timer_; |
| 715 | 732 |
| 716 DISALLOW_COPY_AND_ASSIGN(CompilationPhase); | 733 DISALLOW_COPY_AND_ASSIGN(CompilationPhase); |
| 717 }; | 734 }; |
| 718 | 735 |
| 719 } } // namespace v8::internal | 736 } } // namespace v8::internal |
| 720 | 737 |
| 721 #endif // V8_COMPILER_H_ | 738 #endif // V8_COMPILER_H_ |
| OLD | NEW |