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 |