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 #include "src/parsing/parse-info.h"
6 
7 #include "src/api.h"
8 #include "src/ast/ast-value-factory.h"
9 #include "src/ast/ast.h"
10 #include "src/heap/heap-inl.h"
11 #include "src/objects-inl.h"
12 #include "src/objects/scope-info.h"
13 #include "src/zone/zone.h"
14 
15 namespace v8 {
16 namespace internal {
17 
ParseInfo(AccountingAllocator * zone_allocator)18 ParseInfo::ParseInfo(AccountingAllocator* zone_allocator)
19     : zone_(std::make_shared<Zone>(zone_allocator, ZONE_NAME)),
20       flags_(0),
21       source_stream_(nullptr),
22       source_stream_encoding_(ScriptCompiler::StreamedSource::ONE_BYTE),
23       character_stream_(nullptr),
24       extension_(nullptr),
25       compile_options_(ScriptCompiler::kNoCompileOptions),
26       script_scope_(nullptr),
27       asm_function_scope_(nullptr),
28       unicode_cache_(nullptr),
29       stack_limit_(0),
30       hash_seed_(0),
31       compiler_hints_(0),
32       start_position_(0),
33       end_position_(0),
34       parameters_end_pos_(kNoSourcePosition),
35       function_literal_id_(FunctionLiteral::kIdTypeInvalid),
36       max_function_literal_id_(FunctionLiteral::kIdTypeInvalid),
37       isolate_(nullptr),
38       cached_data_(nullptr),
39       ast_value_factory_(nullptr),
40       function_name_(nullptr),
41       literal_(nullptr),
42       deferred_handles_(nullptr) {}
43 
ParseInfo(Handle<SharedFunctionInfo> shared)44 ParseInfo::ParseInfo(Handle<SharedFunctionInfo> shared)
45     : ParseInfo(shared->GetIsolate()->allocator()) {
46   isolate_ = shared->GetIsolate();
47 
48   set_toplevel(shared->is_toplevel());
49   set_allow_lazy_parsing(FLAG_lazy_inner_functions);
50   set_hash_seed(isolate_->heap()->HashSeed());
51   set_is_named_expression(shared->is_named_expression());
52   set_calls_eval(shared->scope_info()->CallsEval());
53   set_compiler_hints(shared->compiler_hints());
54   set_start_position(shared->start_position());
55   set_end_position(shared->end_position());
56   function_literal_id_ = shared->function_literal_id();
57   set_stack_limit(isolate_->stack_guard()->real_climit());
58   set_unicode_cache(isolate_->unicode_cache());
59   set_language_mode(shared->language_mode());
60   set_shared_info(shared);
61   set_module(shared->kind() == FunctionKind::kModule);
62 
63   Handle<Script> script(Script::cast(shared->script()));
64   set_script(script);
65   set_native(script->type() == Script::TYPE_NATIVE);
66   set_eval(script->compilation_type() == Script::COMPILATION_TYPE_EVAL);
67 
68   Handle<HeapObject> scope_info(shared->outer_scope_info());
69   if (!scope_info->IsTheHole(isolate()) &&
70       Handle<ScopeInfo>::cast(scope_info)->length() > 0) {
71     set_outer_scope_info(Handle<ScopeInfo>::cast(scope_info));
72   }
73 }
74 
ParseInfo(Handle<SharedFunctionInfo> shared,std::shared_ptr<Zone> zone)75 ParseInfo::ParseInfo(Handle<SharedFunctionInfo> shared,
76                      std::shared_ptr<Zone> zone)
77     : ParseInfo(shared) {
78   zone_.swap(zone);
79 }
80 
ParseInfo(Handle<Script> script)81 ParseInfo::ParseInfo(Handle<Script> script)
82     : ParseInfo(script->GetIsolate()->allocator()) {
83   isolate_ = script->GetIsolate();
84 
85   set_allow_lazy_parsing();
86   set_toplevel();
87   set_hash_seed(isolate_->heap()->HashSeed());
88   set_stack_limit(isolate_->stack_guard()->real_climit());
89   set_unicode_cache(isolate_->unicode_cache());
90   set_script(script);
91 
92   set_native(script->type() == Script::TYPE_NATIVE);
93   set_eval(script->compilation_type() == Script::COMPILATION_TYPE_EVAL);
94 }
95 
~ParseInfo()96 ParseInfo::~ParseInfo() {
97   if (ast_value_factory_owned()) {
98     delete ast_value_factory_;
99     set_ast_value_factory_owned(false);
100   }
101   ast_value_factory_ = nullptr;
102 }
103 
104 // static
AllocateWithoutScript(Handle<SharedFunctionInfo> shared)105 ParseInfo* ParseInfo::AllocateWithoutScript(Handle<SharedFunctionInfo> shared) {
106   Isolate* isolate = shared->GetIsolate();
107   ParseInfo* p = new ParseInfo(isolate->allocator());
108   p->isolate_ = isolate;
109 
110   p->set_toplevel(shared->is_toplevel());
111   p->set_allow_lazy_parsing(FLAG_lazy_inner_functions);
112   p->set_hash_seed(isolate->heap()->HashSeed());
113   p->set_is_named_expression(shared->is_named_expression());
114   p->set_calls_eval(shared->scope_info()->CallsEval());
115   p->set_compiler_hints(shared->compiler_hints());
116   p->set_start_position(shared->start_position());
117   p->set_end_position(shared->end_position());
118   p->function_literal_id_ = shared->function_literal_id();
119   p->set_stack_limit(isolate->stack_guard()->real_climit());
120   p->set_unicode_cache(isolate->unicode_cache());
121   p->set_language_mode(shared->language_mode());
122   p->set_shared_info(shared);
123   p->set_module(shared->kind() == FunctionKind::kModule);
124 
125   // BUG(5946): This function exists as a workaround until we can
126   // get rid of %SetCode in our native functions. The ParseInfo
127   // is explicitly set up for the case that:
128   // a) you have a native built-in,
129   // b) it's being run for the 2nd-Nth time in an isolate,
130   // c) we've already compiled bytecode and therefore don't need
131   //    to parse.
132   // We tolerate a ParseInfo without a Script in this case.
133   p->set_native(true);
134   p->set_eval(false);
135 
136   Handle<HeapObject> scope_info(shared->outer_scope_info());
137   if (!scope_info->IsTheHole(isolate) &&
138       Handle<ScopeInfo>::cast(scope_info)->length() > 0) {
139     p->set_outer_scope_info(Handle<ScopeInfo>::cast(scope_info));
140   }
141   return p;
142 }
143 
scope() const144 DeclarationScope* ParseInfo::scope() const { return literal()->scope(); }
145 
is_declaration() const146 bool ParseInfo::is_declaration() const {
147   return (compiler_hints_ & (1 << SharedFunctionInfo::kIsDeclaration)) != 0;
148 }
149 
function_kind() const150 FunctionKind ParseInfo::function_kind() const {
151   return SharedFunctionInfo::FunctionKindBits::decode(compiler_hints_);
152 }
153 
set_deferred_handles(std::shared_ptr<DeferredHandles> deferred_handles)154 void ParseInfo::set_deferred_handles(
155     std::shared_ptr<DeferredHandles> deferred_handles) {
156   DCHECK(deferred_handles_.get() == nullptr);
157   deferred_handles_.swap(deferred_handles);
158 }
159 
set_deferred_handles(DeferredHandles * deferred_handles)160 void ParseInfo::set_deferred_handles(DeferredHandles* deferred_handles) {
161   DCHECK(deferred_handles_.get() == nullptr);
162   deferred_handles_.reset(deferred_handles);
163 }
164 
165 #ifdef DEBUG
script_is_native() const166 bool ParseInfo::script_is_native() const {
167   return script_->type() == Script::TYPE_NATIVE;
168 }
169 #endif  // DEBUG
170 
171 }  // namespace internal
172 }  // namespace v8
173