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