• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/globals.h"
14 #include "src/handles.h"
15 #include "src/parsing/preparsed-scope-data.h"
16 #include "src/pending-compilation-error-handler.h"
17 
18 namespace v8 {
19 
20 class Extension;
21 
22 namespace internal {
23 
24 class AccountingAllocator;
25 class AstRawString;
26 class AstStringConstants;
27 class AstValueFactory;
28 class DeclarationScope;
29 class FunctionLiteral;
30 class RuntimeCallStats;
31 class Logger;
32 class SourceRangeMap;
33 class UnicodeCache;
34 class Utf16CharacterStream;
35 class Zone;
36 
37 // A container for the inputs, configuration options, and outputs of parsing.
38 class V8_EXPORT_PRIVATE ParseInfo {
39  public:
40   ParseInfo(Isolate*);
41   ParseInfo(Isolate*, AccountingAllocator* zone_allocator);
42   ParseInfo(Isolate* isolate, Handle<Script> script);
43   ParseInfo(Isolate* isolate, Handle<SharedFunctionInfo> shared);
44 
45   ~ParseInfo();
46 
47   Handle<Script> CreateScript(Isolate* isolate, Handle<String> source,
48                               ScriptOriginOptions origin_options,
49                               NativesFlag natives = NOT_NATIVES_CODE);
50 
51   // Either returns the ast-value-factory associcated with this ParseInfo, or
52   // creates and returns a new factory if none exists.
53   AstValueFactory* GetOrCreateAstValueFactory();
54 
zone()55   Zone* zone() const { return zone_.get(); }
56 
57 // Convenience accessor methods for flags.
58 #define FLAG_ACCESSOR(flag, getter, setter)     \
59   bool getter() const { return GetFlag(flag); } \
60   void setter() { SetFlag(flag); }              \
61   void setter(bool val) { SetFlag(flag, val); }
62 
63   FLAG_ACCESSOR(kToplevel, is_toplevel, set_toplevel)
64   FLAG_ACCESSOR(kEager, is_eager, set_eager)
65   FLAG_ACCESSOR(kEval, is_eval, set_eval)
66   FLAG_ACCESSOR(kStrictMode, is_strict_mode, set_strict_mode)
67   FLAG_ACCESSOR(kNative, is_native, set_native)
68   FLAG_ACCESSOR(kModule, is_module, set_module)
69   FLAG_ACCESSOR(kAllowLazyParsing, allow_lazy_parsing, set_allow_lazy_parsing)
70   FLAG_ACCESSOR(kIsNamedExpression, is_named_expression,
71                 set_is_named_expression)
72   FLAG_ACCESSOR(kLazyCompile, lazy_compile, set_lazy_compile)
73   FLAG_ACCESSOR(kCollectTypeProfile, collect_type_profile,
74                 set_collect_type_profile)
75   FLAG_ACCESSOR(kIsAsmWasmBroken, is_asm_wasm_broken, set_asm_wasm_broken)
76   FLAG_ACCESSOR(kBlockCoverageEnabled, block_coverage_enabled,
77                 set_block_coverage_enabled)
78   FLAG_ACCESSOR(kOnBackgroundThread, on_background_thread,
79                 set_on_background_thread)
80   FLAG_ACCESSOR(kWrappedAsFunction, is_wrapped_as_function,
81                 set_wrapped_as_function)
82   FLAG_ACCESSOR(kAllowEvalCache, allow_eval_cache, set_allow_eval_cache)
83   FLAG_ACCESSOR(kIsDeclaration, is_declaration, set_declaration)
84   FLAG_ACCESSOR(kRequiresInstanceFieldsInitializer,
85                 requires_instance_fields_initializer,
86                 set_requires_instance_fields_initializer);
87 #undef FLAG_ACCESSOR
88 
set_parse_restriction(ParseRestriction restriction)89   void set_parse_restriction(ParseRestriction restriction) {
90     SetFlag(kParseRestriction, restriction != NO_PARSE_RESTRICTION);
91   }
92 
parse_restriction()93   ParseRestriction parse_restriction() const {
94     return GetFlag(kParseRestriction) ? ONLY_SINGLE_FUNCTION_LITERAL
95                                       : NO_PARSE_RESTRICTION;
96   }
97 
character_stream()98   Utf16CharacterStream* character_stream() const {
99     return character_stream_.get();
100   }
101   void set_character_stream(
102       std::unique_ptr<Utf16CharacterStream> character_stream);
103   void ResetCharacterStream();
104 
extension()105   v8::Extension* extension() const { return extension_; }
set_extension(v8::Extension * extension)106   void set_extension(v8::Extension* extension) { extension_ = extension; }
107 
108 
consumed_preparsed_scope_data()109   ConsumedPreParsedScopeData* consumed_preparsed_scope_data() {
110     return &consumed_preparsed_scope_data_;
111   }
112 
script_scope()113   DeclarationScope* script_scope() const { return script_scope_; }
set_script_scope(DeclarationScope * script_scope)114   void set_script_scope(DeclarationScope* script_scope) {
115     script_scope_ = script_scope;
116   }
117 
ast_value_factory()118   AstValueFactory* ast_value_factory() const {
119     DCHECK(ast_value_factory_.get());
120     return ast_value_factory_.get();
121   }
122 
function_name()123   const AstRawString* function_name() const { return function_name_; }
set_function_name(const AstRawString * function_name)124   void set_function_name(const AstRawString* function_name) {
125     function_name_ = function_name;
126   }
127 
literal()128   FunctionLiteral* literal() const { return literal_; }
set_literal(FunctionLiteral * literal)129   void set_literal(FunctionLiteral* literal) { literal_ = literal; }
130 
131   DeclarationScope* scope() const;
132 
unicode_cache()133   UnicodeCache* unicode_cache() const { return unicode_cache_; }
set_unicode_cache(UnicodeCache * unicode_cache)134   void set_unicode_cache(UnicodeCache* unicode_cache) {
135     unicode_cache_ = unicode_cache;
136   }
137 
stack_limit()138   uintptr_t stack_limit() const { return stack_limit_; }
set_stack_limit(uintptr_t stack_limit)139   void set_stack_limit(uintptr_t stack_limit) { stack_limit_ = stack_limit; }
140 
hash_seed()141   uint64_t hash_seed() const { return hash_seed_; }
set_hash_seed(uint64_t hash_seed)142   void set_hash_seed(uint64_t hash_seed) { hash_seed_ = hash_seed; }
143 
start_position()144   int start_position() const { return start_position_; }
set_start_position(int start_position)145   void set_start_position(int start_position) {
146     start_position_ = start_position;
147   }
148 
end_position()149   int end_position() const { return end_position_; }
set_end_position(int end_position)150   void set_end_position(int end_position) { end_position_ = end_position; }
151 
parameters_end_pos()152   int parameters_end_pos() const { return parameters_end_pos_; }
set_parameters_end_pos(int parameters_end_pos)153   void set_parameters_end_pos(int parameters_end_pos) {
154     parameters_end_pos_ = parameters_end_pos;
155   }
156 
function_literal_id()157   int function_literal_id() const { return function_literal_id_; }
set_function_literal_id(int function_literal_id)158   void set_function_literal_id(int function_literal_id) {
159     function_literal_id_ = function_literal_id;
160   }
161 
function_kind()162   FunctionKind function_kind() const { return function_kind_; }
set_function_kind(FunctionKind function_kind)163   void set_function_kind(FunctionKind function_kind) {
164     function_kind_ = function_kind;
165   }
166 
max_function_literal_id()167   int max_function_literal_id() const { return max_function_literal_id_; }
set_max_function_literal_id(int max_function_literal_id)168   void set_max_function_literal_id(int max_function_literal_id) {
169     max_function_literal_id_ = max_function_literal_id;
170   }
171 
ast_string_constants()172   const AstStringConstants* ast_string_constants() const {
173     return ast_string_constants_;
174   }
set_ast_string_constants(const AstStringConstants * ast_string_constants)175   void set_ast_string_constants(
176       const AstStringConstants* ast_string_constants) {
177     ast_string_constants_ = ast_string_constants;
178   }
179 
runtime_call_stats()180   RuntimeCallStats* runtime_call_stats() const { return runtime_call_stats_; }
set_runtime_call_stats(RuntimeCallStats * runtime_call_stats)181   void set_runtime_call_stats(RuntimeCallStats* runtime_call_stats) {
182     runtime_call_stats_ = runtime_call_stats;
183   }
logger()184   Logger* logger() const { return logger_; }
set_logger(Logger * logger)185   void set_logger(Logger* logger) { logger_ = logger; }
186 
187   void AllocateSourceRangeMap();
source_range_map()188   SourceRangeMap* source_range_map() const { return source_range_map_; }
set_source_range_map(SourceRangeMap * source_range_map)189   void set_source_range_map(SourceRangeMap* source_range_map) {
190     source_range_map_ = source_range_map;
191   }
192 
pending_error_handler()193   PendingCompilationErrorHandler* pending_error_handler() {
194     return &pending_error_handler_;
195   }
196 
197   //--------------------------------------------------------------------------
198   // TODO(titzer): these should not be part of ParseInfo.
199   //--------------------------------------------------------------------------
script()200   Handle<Script> script() const { return script_; }
maybe_outer_scope_info()201   MaybeHandle<ScopeInfo> maybe_outer_scope_info() const {
202     return maybe_outer_scope_info_;
203   }
set_outer_scope_info(Handle<ScopeInfo> outer_scope_info)204   void set_outer_scope_info(Handle<ScopeInfo> outer_scope_info) {
205     maybe_outer_scope_info_ = outer_scope_info;
206   }
207 
script_id()208   int script_id() const { return script_id_; }
209   //--------------------------------------------------------------------------
210 
language_mode()211   LanguageMode language_mode() const {
212     return construct_language_mode(is_strict_mode());
213   }
set_language_mode(LanguageMode language_mode)214   void set_language_mode(LanguageMode language_mode) {
215     STATIC_ASSERT(LanguageModeSize == 2);
216     set_strict_mode(is_strict(language_mode));
217   }
218 
219   void EmitBackgroundParseStatisticsOnBackgroundThread();
220   void UpdateBackgroundParseStatisticsOnMainThread(Isolate* isolate);
221 
222  private:
223   void SetScriptForToplevelCompile(Isolate* isolate, Handle<Script> script);
224   void set_script(Handle<Script> script);
225 
226   // Various configuration flags for parsing.
227   enum Flag {
228     // ---------- Input flags ---------------------------
229     kToplevel = 1 << 0,
230     kEager = 1 << 1,
231     kEval = 1 << 2,
232     kStrictMode = 1 << 3,
233     kNative = 1 << 4,
234     kParseRestriction = 1 << 5,
235     kModule = 1 << 6,
236     kAllowLazyParsing = 1 << 7,
237     kIsNamedExpression = 1 << 8,
238     kLazyCompile = 1 << 9,
239     kCollectTypeProfile = 1 << 10,
240     kBlockCoverageEnabled = 1 << 11,
241     kIsAsmWasmBroken = 1 << 12,
242     kOnBackgroundThread = 1 << 13,
243     kWrappedAsFunction = 1 << 14,  // Implicitly wrapped as function.
244     kAllowEvalCache = 1 << 15,
245     kIsDeclaration = 1 << 16,
246     kRequiresInstanceFieldsInitializer = 1 << 17,
247   };
248 
249   //------------- Inputs to parsing and scope analysis -----------------------
250   std::unique_ptr<Zone> zone_;
251   unsigned flags_;
252   v8::Extension* extension_;
253   DeclarationScope* script_scope_;
254   UnicodeCache* unicode_cache_;
255   uintptr_t stack_limit_;
256   uint64_t hash_seed_;
257   FunctionKind function_kind_;
258   int script_id_;
259   int start_position_;
260   int end_position_;
261   int parameters_end_pos_;
262   int function_literal_id_;
263   int max_function_literal_id_;
264 
265   // TODO(titzer): Move handles out of ParseInfo.
266   Handle<Script> script_;
267   MaybeHandle<ScopeInfo> maybe_outer_scope_info_;
268 
269   //----------- Inputs+Outputs of parsing and scope analysis -----------------
270   std::unique_ptr<Utf16CharacterStream> character_stream_;
271   ConsumedPreParsedScopeData consumed_preparsed_scope_data_;
272   std::unique_ptr<AstValueFactory> ast_value_factory_;
273   const class AstStringConstants* ast_string_constants_;
274   const AstRawString* function_name_;
275   RuntimeCallStats* runtime_call_stats_;
276   Logger* logger_;
277   SourceRangeMap* source_range_map_;  // Used when block coverage is enabled.
278 
279   //----------- Output of parsing and scope analysis ------------------------
280   FunctionLiteral* literal_;
281   PendingCompilationErrorHandler pending_error_handler_;
282 
SetFlag(Flag f)283   void SetFlag(Flag f) { flags_ |= f; }
SetFlag(Flag f,bool v)284   void SetFlag(Flag f, bool v) { flags_ = v ? flags_ | f : flags_ & ~f; }
GetFlag(Flag f)285   bool GetFlag(Flag f) const { return (flags_ & f) != 0; }
286 };
287 
288 }  // namespace internal
289 }  // namespace v8
290 
291 #endif  // V8_PARSING_PARSE_INFO_H_
292