Home | History | Annotate | Download | only in compiler-dispatcher
      1 // Copyright 2016 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef V8_COMPILER_DISPATCHER_COMPILER_DISPATCHER_JOB_H_
      6 #define V8_COMPILER_DISPATCHER_COMPILER_DISPATCHER_JOB_H_
      7 
      8 #include <memory>
      9 
     10 #include "src/base/macros.h"
     11 #include "src/globals.h"
     12 #include "src/handles.h"
     13 #include "testing/gtest/include/gtest/gtest_prod.h"
     14 
     15 namespace v8 {
     16 namespace internal {
     17 
     18 class CompilerDispatcherTracer;
     19 class CompilationInfo;
     20 class CompilationJob;
     21 class Isolate;
     22 class ParseInfo;
     23 class Parser;
     24 class SharedFunctionInfo;
     25 class String;
     26 class UnicodeCache;
     27 class Utf16CharacterStream;
     28 class Zone;
     29 
     30 enum class CompileJobStatus {
     31   kInitial,
     32   kReadyToParse,
     33   kParsed,
     34   kReadyToAnalyse,
     35   kReadyToCompile,
     36   kCompiled,
     37   kFailed,
     38   kDone,
     39 };
     40 
     41 class V8_EXPORT_PRIVATE CompilerDispatcherJob {
     42  public:
     43   CompilerDispatcherJob(Isolate* isolate, Handle<SharedFunctionInfo> shared,
     44                         size_t max_stack_size);
     45   ~CompilerDispatcherJob();
     46 
     47   CompileJobStatus status() const { return status_; }
     48   bool can_parse_on_background_thread() const {
     49     return can_parse_on_background_thread_;
     50   }
     51   // Should only be called after kReadyToCompile.
     52   bool can_compile_on_background_thread() const {
     53     DCHECK(compile_job_.get());
     54     return can_compile_on_background_thread_;
     55   }
     56 
     57   // Transition from kInitial to kReadyToParse.
     58   void PrepareToParseOnMainThread();
     59 
     60   // Transition from kReadyToParse to kParsed.
     61   void Parse();
     62 
     63   // Transition from kParsed to kReadyToAnalyse (or kFailed). Returns false
     64   // when transitioning to kFailed. In that case, an exception is pending.
     65   bool FinalizeParsingOnMainThread();
     66 
     67   // Transition from kReadyToAnalyse to kReadyToCompile (or kFailed). Returns
     68   // false when transitioning to kFailed. In that case, an exception is pending.
     69   bool PrepareToCompileOnMainThread();
     70 
     71   // Transition from kReadyToCompile to kCompiled.
     72   void Compile();
     73 
     74   // Transition from kCompiled to kDone (or kFailed). Returns false when
     75   // transitioning to kFailed. In that case, an exception is pending.
     76   bool FinalizeCompilingOnMainThread();
     77 
     78   // Transition from any state to kInitial and free all resources.
     79   void ResetOnMainThread();
     80 
     81  private:
     82   FRIEND_TEST(CompilerDispatcherJobTest, ScopeChain);
     83 
     84   CompileJobStatus status_ = CompileJobStatus::kInitial;
     85   Isolate* isolate_;
     86   CompilerDispatcherTracer* tracer_;
     87   Handle<SharedFunctionInfo> shared_;  // Global handle.
     88   Handle<String> source_;        // Global handle.
     89   size_t max_stack_size_;
     90 
     91   // Members required for parsing.
     92   std::unique_ptr<UnicodeCache> unicode_cache_;
     93   std::unique_ptr<Zone> zone_;
     94   std::unique_ptr<Utf16CharacterStream> character_stream_;
     95   std::unique_ptr<ParseInfo> parse_info_;
     96   std::unique_ptr<Parser> parser_;
     97   std::unique_ptr<DeferredHandles> handles_from_parsing_;
     98 
     99   // Members required for compiling.
    100   std::unique_ptr<CompilationInfo> compile_info_;
    101   std::unique_ptr<CompilationJob> compile_job_;
    102 
    103   bool can_parse_on_background_thread_;
    104   bool can_compile_on_background_thread_;
    105 
    106   DISALLOW_COPY_AND_ASSIGN(CompilerDispatcherJob);
    107 };
    108 
    109 }  // namespace internal
    110 }  // namespace v8
    111 
    112 #endif  // V8_COMPILER_DISPATCHER_COMPILER_DISPATCHER_JOB_H_
    113