LCOV - code coverage report
Current view: top level - src/parsing - parse-info.h (source / functions) Hit Total Coverage
Test: app.info Lines: 25 25 100.0 %
Date: 2019-04-17 Functions: 1 1 100.0 %

          Line data    Source code
       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_PARSING_PARSE_INFO_H_
       6             : #define V8_PARSING_PARSE_INFO_H_
       7             : 
       8             : #include <map>
       9             : #include <memory>
      10             : #include <vector>
      11             : 
      12             : #include "include/v8.h"
      13             : #include "src/function-kind.h"
      14             : #include "src/globals.h"
      15             : #include "src/handles.h"
      16             : #include "src/objects/script.h"
      17             : #include "src/parsing/preparse-data.h"
      18             : #include "src/pending-compilation-error-handler.h"
      19             : 
      20             : namespace v8 {
      21             : 
      22             : class Extension;
      23             : 
      24             : namespace internal {
      25             : 
      26             : class AccountingAllocator;
      27             : class AstRawString;
      28             : class AstStringConstants;
      29             : class AstValueFactory;
      30             : class CompilerDispatcher;
      31             : class DeclarationScope;
      32             : class FunctionLiteral;
      33             : class RuntimeCallStats;
      34             : class Logger;
      35             : class SourceRangeMap;
      36             : class Utf16CharacterStream;
      37             : class Zone;
      38             : 
      39             : // A container for the inputs, configuration options, and outputs of parsing.
      40     4931815 : class V8_EXPORT_PRIVATE ParseInfo {
      41             :  public:
      42             :   explicit ParseInfo(AccountingAllocator* zone_allocator);
      43             :   explicit ParseInfo(Isolate*);
      44             :   ParseInfo(Isolate*, AccountingAllocator* zone_allocator);
      45             :   ParseInfo(Isolate* isolate, Handle<Script> script);
      46             :   ParseInfo(Isolate* isolate, Handle<SharedFunctionInfo> shared);
      47             : 
      48             :   // Creates a new parse info based on parent top-level |outer_parse_info| for
      49             :   // function |literal|.
      50             :   static std::unique_ptr<ParseInfo> FromParent(
      51             :       const ParseInfo* outer_parse_info, AccountingAllocator* zone_allocator,
      52             :       const FunctionLiteral* literal, const AstRawString* function_name);
      53             : 
      54             :   ~ParseInfo();
      55             : 
      56             :   Handle<Script> CreateScript(Isolate* isolate, Handle<String> source,
      57             :                               ScriptOriginOptions origin_options,
      58             :                               NativesFlag natives = NOT_NATIVES_CODE);
      59             : 
      60             :   // Either returns the ast-value-factory associcated with this ParseInfo, or
      61             :   // creates and returns a new factory if none exists.
      62             :   AstValueFactory* GetOrCreateAstValueFactory();
      63             : 
      64             :   Zone* zone() const { return zone_.get(); }
      65             : 
      66             : // Convenience accessor methods for flags.
      67             : #define FLAG_ACCESSOR(flag, getter, setter)     \
      68             :   bool getter() const { return GetFlag(flag); } \
      69             :   void setter() { SetFlag(flag); }              \
      70             :   void setter(bool val) { SetFlag(flag, val); }
      71             : 
      72             :   FLAG_ACCESSOR(kToplevel, is_toplevel, set_toplevel)
      73             :   FLAG_ACCESSOR(kEager, is_eager, set_eager)
      74             :   FLAG_ACCESSOR(kEval, is_eval, set_eval)
      75             :   FLAG_ACCESSOR(kStrictMode, is_strict_mode, set_strict_mode)
      76             :   FLAG_ACCESSOR(kModule, is_module, set_module)
      77             :   FLAG_ACCESSOR(kAllowLazyParsing, allow_lazy_parsing, set_allow_lazy_parsing)
      78             :   FLAG_ACCESSOR(kIsNamedExpression, is_named_expression,
      79             :                 set_is_named_expression)
      80             :   FLAG_ACCESSOR(kLazyCompile, lazy_compile, set_lazy_compile)
      81             :   FLAG_ACCESSOR(kCollectTypeProfile, collect_type_profile,
      82             :                 set_collect_type_profile)
      83             :   FLAG_ACCESSOR(kIsAsmWasmBroken, is_asm_wasm_broken, set_asm_wasm_broken)
      84             :   FLAG_ACCESSOR(kContainsAsmModule, contains_asm_module,
      85             :                 set_contains_asm_module)
      86             :   FLAG_ACCESSOR(kCoverageEnabled, coverage_enabled, set_coverage_enabled)
      87             :   FLAG_ACCESSOR(kBlockCoverageEnabled, block_coverage_enabled,
      88             :                 set_block_coverage_enabled)
      89             :   FLAG_ACCESSOR(kOnBackgroundThread, on_background_thread,
      90             :                 set_on_background_thread)
      91             :   FLAG_ACCESSOR(kWrappedAsFunction, is_wrapped_as_function,
      92             :                 set_wrapped_as_function)
      93             :   FLAG_ACCESSOR(kAllowEvalCache, allow_eval_cache, set_allow_eval_cache)
      94             :   FLAG_ACCESSOR(kIsDeclaration, is_declaration, set_declaration)
      95             :   FLAG_ACCESSOR(kRequiresInstanceMembersInitializer,
      96             :                 requires_instance_members_initializer,
      97             :                 set_requires_instance_members_initializer)
      98             :   FLAG_ACCESSOR(kMightAlwaysOpt, might_always_opt, set_might_always_opt)
      99             :   FLAG_ACCESSOR(kAllowNativeSyntax, allow_natives_syntax,
     100             :                 set_allow_natives_syntax)
     101             :   FLAG_ACCESSOR(kAllowLazyCompile, allow_lazy_compile, set_allow_lazy_compile)
     102             :   FLAG_ACCESSOR(kAllowNativeSyntax, allow_native_syntax,
     103             :                 set_allow_native_syntax)
     104             :   FLAG_ACCESSOR(kAllowHarmonyPublicFields, allow_harmony_public_fields,
     105             :                 set_allow_harmony_public_fields)
     106             :   FLAG_ACCESSOR(kAllowHarmonyStaticFields, allow_harmony_static_fields,
     107             :                 set_allow_harmony_static_fields)
     108             :   FLAG_ACCESSOR(kAllowHarmonyDynamicImport, allow_harmony_dynamic_import,
     109             :                 set_allow_harmony_dynamic_import)
     110             :   FLAG_ACCESSOR(kAllowHarmonyImportMeta, allow_harmony_import_meta,
     111             :                 set_allow_harmony_import_meta)
     112             :   FLAG_ACCESSOR(kAllowHarmonyNumericSeparator, allow_harmony_numeric_separator,
     113             :                 set_allow_harmony_numeric_separator)
     114             :   FLAG_ACCESSOR(kAllowHarmonyPrivateFields, allow_harmony_private_fields,
     115             :                 set_allow_harmony_private_fields)
     116             :   FLAG_ACCESSOR(kAllowHarmonyPrivateMethods, allow_harmony_private_methods,
     117             :                 set_allow_harmony_private_methods)
     118             :   FLAG_ACCESSOR(kIsOneshotIIFE, is_oneshot_iife, set_is_oneshot_iife)
     119             :   FLAG_ACCESSOR(kCollectSourcePositions, collect_source_positions,
     120             :                 set_collect_source_positions)
     121             : #undef FLAG_ACCESSOR
     122             : 
     123             :   void set_parse_restriction(ParseRestriction restriction) {
     124             :     SetFlag(kParseRestriction, restriction != NO_PARSE_RESTRICTION);
     125             :   }
     126             : 
     127             :   ParseRestriction parse_restriction() const {
     128             :     return GetFlag(kParseRestriction) ? ONLY_SINGLE_FUNCTION_LITERAL
     129     1745904 :                                       : NO_PARSE_RESTRICTION;
     130             :   }
     131             : 
     132             :   Utf16CharacterStream* character_stream() const {
     133             :     return character_stream_.get();
     134             :   }
     135             :   void set_character_stream(
     136             :       std::unique_ptr<Utf16CharacterStream> character_stream);
     137             :   void ResetCharacterStream();
     138             : 
     139             :   v8::Extension* extension() const { return extension_; }
     140      157043 :   void set_extension(v8::Extension* extension) { extension_ = extension; }
     141             : 
     142             :   void set_consumed_preparse_data(std::unique_ptr<ConsumedPreparseData> data) {
     143             :     consumed_preparse_data_.swap(data);
     144             :   }
     145             :   ConsumedPreparseData* consumed_preparse_data() {
     146             :     return consumed_preparse_data_.get();
     147             :   }
     148             : 
     149             :   DeclarationScope* script_scope() const { return script_scope_; }
     150             :   void set_script_scope(DeclarationScope* script_scope) {
     151     2465831 :     script_scope_ = script_scope;
     152             :   }
     153             : 
     154             :   AstValueFactory* ast_value_factory() const {
     155             :     DCHECK(ast_value_factory_.get());
     156             :     return ast_value_factory_.get();
     157             :   }
     158             : 
     159             :   const AstRawString* function_name() const { return function_name_; }
     160             :   void set_function_name(const AstRawString* function_name) {
     161      719915 :     function_name_ = function_name;
     162             :   }
     163             : 
     164             :   FunctionLiteral* literal() const { return literal_; }
     165     2465830 :   void set_literal(FunctionLiteral* literal) { literal_ = literal; }
     166             : 
     167             :   DeclarationScope* scope() const;
     168             : 
     169             :   uintptr_t stack_limit() const { return stack_limit_; }
     170     2492771 :   void set_stack_limit(uintptr_t stack_limit) { stack_limit_ = stack_limit; }
     171             : 
     172             :   uint64_t hash_seed() const { return hash_seed_; }
     173     2465916 :   void set_hash_seed(uint64_t hash_seed) { hash_seed_ = hash_seed; }
     174             : 
     175             :   int start_position() const { return start_position_; }
     176             :   void set_start_position(int start_position) {
     177      721860 :     start_position_ = start_position;
     178             :   }
     179             : 
     180             :   int end_position() const { return end_position_; }
     181      721859 :   void set_end_position(int end_position) { end_position_ = end_position; }
     182             : 
     183             :   int parameters_end_pos() const { return parameters_end_pos_; }
     184             :   void set_parameters_end_pos(int parameters_end_pos) {
     185      961682 :     parameters_end_pos_ = parameters_end_pos;
     186             :   }
     187             : 
     188             :   int function_literal_id() const { return function_literal_id_; }
     189             :   void set_function_literal_id(int function_literal_id) {
     190          80 :     function_literal_id_ = function_literal_id;
     191             :   }
     192             : 
     193             :   FunctionKind function_kind() const { return function_kind_; }
     194             :   void set_function_kind(FunctionKind function_kind) {
     195      721861 :     function_kind_ = function_kind;
     196             :   }
     197             : 
     198             :   int max_function_literal_id() const { return max_function_literal_id_; }
     199             :   void set_max_function_literal_id(int max_function_literal_id) {
     200     1745924 :     max_function_literal_id_ = max_function_literal_id;
     201             :   }
     202             : 
     203             :   const AstStringConstants* ast_string_constants() const {
     204             :     return ast_string_constants_;
     205             :   }
     206             :   void set_ast_string_constants(
     207             :       const AstStringConstants* ast_string_constants) {
     208     2465916 :     ast_string_constants_ = ast_string_constants;
     209             :   }
     210             : 
     211             :   RuntimeCallStats* runtime_call_stats() const { return runtime_call_stats_; }
     212             :   void set_runtime_call_stats(RuntimeCallStats* runtime_call_stats) {
     213     2492771 :     runtime_call_stats_ = runtime_call_stats;
     214             :   }
     215             :   Logger* logger() const { return logger_; }
     216     2465916 :   void set_logger(Logger* logger) { logger_ = logger; }
     217             : 
     218             :   void AllocateSourceRangeMap();
     219             :   SourceRangeMap* source_range_map() const { return source_range_map_; }
     220             :   void set_source_range_map(SourceRangeMap* source_range_map) {
     221         676 :     source_range_map_ = source_range_map;
     222             :   }
     223             : 
     224             :   PendingCompilationErrorHandler* pending_error_handler() {
     225     2860202 :     return &pending_error_handler_;
     226             :   }
     227             : 
     228          98 :   class ParallelTasks {
     229             :    public:
     230             :     explicit ParallelTasks(CompilerDispatcher* compiler_dispatcher)
     231          98 :         : dispatcher_(compiler_dispatcher) {
     232             :       DCHECK(dispatcher_);
     233             :     }
     234             : 
     235             :     void Enqueue(ParseInfo* outer_parse_info, const AstRawString* function_name,
     236             :                  FunctionLiteral* literal);
     237             : 
     238             :     using EnqueuedJobsIterator =
     239             :         std::forward_list<std::pair<FunctionLiteral*, uintptr_t>>::iterator;
     240             : 
     241             :     EnqueuedJobsIterator begin() { return enqueued_jobs_.begin(); }
     242             :     EnqueuedJobsIterator end() { return enqueued_jobs_.end(); }
     243             : 
     244             :     CompilerDispatcher* dispatcher() { return dispatcher_; }
     245             : 
     246             :    private:
     247             :     CompilerDispatcher* dispatcher_;
     248             :     std::forward_list<std::pair<FunctionLiteral*, uintptr_t>> enqueued_jobs_;
     249             :   };
     250             : 
     251             :   ParallelTasks* parallel_tasks() { return parallel_tasks_.get(); }
     252             : 
     253             :   //--------------------------------------------------------------------------
     254             :   // TODO(titzer): these should not be part of ParseInfo.
     255             :   //--------------------------------------------------------------------------
     256             :   Handle<Script> script() const { return script_; }
     257             :   void set_script(Handle<Script> script);
     258             : 
     259             :   MaybeHandle<ScopeInfo> maybe_outer_scope_info() const {
     260             :     return maybe_outer_scope_info_;
     261             :   }
     262             :   void set_outer_scope_info(Handle<ScopeInfo> outer_scope_info) {
     263     1021715 :     maybe_outer_scope_info_ = outer_scope_info;
     264             :   }
     265             : 
     266             :   int script_id() const { return script_id_; }
     267             :   //--------------------------------------------------------------------------
     268             : 
     269             :   LanguageMode language_mode() const {
     270             :     return construct_language_mode(is_strict_mode());
     271             :   }
     272             :   void set_language_mode(LanguageMode language_mode) {
     273             :     STATIC_ASSERT(LanguageModeSize == 2);
     274             :     set_strict_mode(is_strict(language_mode));
     275             :   }
     276             : 
     277             :  private:
     278             :   void SetScriptForToplevelCompile(Isolate* isolate, Handle<Script> script);
     279             : 
     280             :   // Set function info flags based on those in either FunctionLiteral or
     281             :   // SharedFunctionInfo |function|
     282             :   template <typename T>
     283             :   void SetFunctionInfo(T function);
     284             : 
     285             :   // Various configuration flags for parsing.
     286             :   enum Flag {
     287             :     // ---------- Input flags ---------------------------
     288             :     kToplevel = 1 << 0,
     289             :     kEager = 1 << 1,
     290             :     kEval = 1 << 2,
     291             :     kStrictMode = 1 << 3,
     292             :     kNative = 1 << 4,
     293             :     kParseRestriction = 1 << 5,
     294             :     kModule = 1 << 6,
     295             :     kAllowLazyParsing = 1 << 7,
     296             :     kIsNamedExpression = 1 << 8,
     297             :     kLazyCompile = 1 << 9,
     298             :     kCollectTypeProfile = 1 << 10,
     299             :     kCoverageEnabled = 1 << 11,
     300             :     kBlockCoverageEnabled = 1 << 12,
     301             :     kIsAsmWasmBroken = 1 << 13,
     302             :     kOnBackgroundThread = 1 << 14,
     303             :     kWrappedAsFunction = 1 << 15,  // Implicitly wrapped as function.
     304             :     kAllowEvalCache = 1 << 16,
     305             :     kIsDeclaration = 1 << 17,
     306             :     kRequiresInstanceMembersInitializer = 1 << 18,
     307             :     kContainsAsmModule = 1 << 19,
     308             :     kMightAlwaysOpt = 1 << 20,
     309             :     kAllowLazyCompile = 1 << 21,
     310             :     kAllowNativeSyntax = 1 << 22,
     311             :     kAllowHarmonyPublicFields = 1 << 23,
     312             :     kAllowHarmonyStaticFields = 1 << 24,
     313             :     kAllowHarmonyDynamicImport = 1 << 25,
     314             :     kAllowHarmonyImportMeta = 1 << 26,
     315             :     kAllowHarmonyNumericSeparator = 1 << 27,
     316             :     kAllowHarmonyPrivateFields = 1 << 28,
     317             :     kAllowHarmonyPrivateMethods = 1 << 29,
     318             :     kIsOneshotIIFE = 1 << 30,
     319             :     kCollectSourcePositions = 1 << 31,
     320             :   };
     321             : 
     322             :   //------------- Inputs to parsing and scope analysis -----------------------
     323             :   std::unique_ptr<Zone> zone_;
     324             :   unsigned flags_;
     325             :   v8::Extension* extension_;
     326             :   DeclarationScope* script_scope_;
     327             :   uintptr_t stack_limit_;
     328             :   uint64_t hash_seed_;
     329             :   FunctionKind function_kind_;
     330             :   int script_id_;
     331             :   int start_position_;
     332             :   int end_position_;
     333             :   int parameters_end_pos_;
     334             :   int function_literal_id_;
     335             :   int max_function_literal_id_;
     336             : 
     337             :   // TODO(titzer): Move handles out of ParseInfo.
     338             :   Handle<Script> script_;
     339             :   MaybeHandle<ScopeInfo> maybe_outer_scope_info_;
     340             : 
     341             :   //----------- Inputs+Outputs of parsing and scope analysis -----------------
     342             :   std::unique_ptr<Utf16CharacterStream> character_stream_;
     343             :   std::unique_ptr<ConsumedPreparseData> consumed_preparse_data_;
     344             :   std::unique_ptr<AstValueFactory> ast_value_factory_;
     345             :   const class AstStringConstants* ast_string_constants_;
     346             :   const AstRawString* function_name_;
     347             :   RuntimeCallStats* runtime_call_stats_;
     348             :   Logger* logger_;
     349             :   SourceRangeMap* source_range_map_;  // Used when block coverage is enabled.
     350             :   std::unique_ptr<ParallelTasks> parallel_tasks_;
     351             : 
     352             :   //----------- Output of parsing and scope analysis ------------------------
     353             :   FunctionLiteral* literal_;
     354             :   PendingCompilationErrorHandler pending_error_handler_;
     355             : 
     356     3366590 :   void SetFlag(Flag f) { flags_ |= f; }
     357    47460994 :   void SetFlag(Flag f, bool v) { flags_ = v ? flags_ | f : flags_ & ~f; }
     358    83030183 :   bool GetFlag(Flag f) const { return (flags_ & f) != 0; }
     359             : };
     360             : 
     361             : }  // namespace internal
     362             : }  // namespace v8
     363             : 
     364             : #endif  // V8_PARSING_PARSE_INFO_H_

Generated by: LCOV version 1.10