1f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Copyright 2016 the V8 project authors. All rights reserved.
2f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// found in the LICENSE file.
4f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
5f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/parsing/parse-info.h"
6f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/api.h"
8f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/ast/ast-value-factory.h"
9f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/ast/ast.h"
1062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/heap/heap-inl.h"
1162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/objects-inl.h"
1262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/objects/scope-info.h"
1362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/zone/zone.h"
14f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
15f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochnamespace v8 {
16f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochnamespace internal {
17f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochParseInfo::ParseInfo(AccountingAllocator* zone_allocator)
1962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    : zone_(std::make_shared<Zone>(zone_allocator, ZONE_NAME)),
20f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      flags_(0),
21f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      source_stream_(nullptr),
22f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      source_stream_encoding_(ScriptCompiler::StreamedSource::ONE_BYTE),
23f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      character_stream_(nullptr),
24f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      extension_(nullptr),
25f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      compile_options_(ScriptCompiler::kNoCompileOptions),
26f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      script_scope_(nullptr),
2762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      asm_function_scope_(nullptr),
28f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      unicode_cache_(nullptr),
29f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      stack_limit_(0),
30f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      hash_seed_(0),
31f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      compiler_hints_(0),
32f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      start_position_(0),
33f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      end_position_(0),
3462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      parameters_end_pos_(kNoSourcePosition),
3562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      function_literal_id_(FunctionLiteral::kIdTypeInvalid),
3662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      max_function_literal_id_(FunctionLiteral::kIdTypeInvalid),
37f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      isolate_(nullptr),
38f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      cached_data_(nullptr),
39f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      ast_value_factory_(nullptr),
40f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      function_name_(nullptr),
4162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      literal_(nullptr),
4262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      deferred_handles_(nullptr) {}
43f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
4462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochParseInfo::ParseInfo(Handle<SharedFunctionInfo> shared)
4562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    : ParseInfo(shared->GetIsolate()->allocator()) {
46f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  isolate_ = shared->GetIsolate();
47f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
48c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  set_toplevel(shared->is_toplevel());
49c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  set_allow_lazy_parsing(FLAG_lazy_inner_functions);
50f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  set_hash_seed(isolate_->heap()->HashSeed());
51f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  set_is_named_expression(shared->is_named_expression());
52f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  set_calls_eval(shared->scope_info()->CallsEval());
53f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  set_compiler_hints(shared->compiler_hints());
54f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  set_start_position(shared->start_position());
55f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  set_end_position(shared->end_position());
5662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  function_literal_id_ = shared->function_literal_id();
57f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  set_stack_limit(isolate_->stack_guard()->real_climit());
58f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  set_unicode_cache(isolate_->unicode_cache());
59f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  set_language_mode(shared->language_mode());
60f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  set_shared_info(shared);
6162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  set_module(shared->kind() == FunctionKind::kModule);
62f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
63f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Handle<Script> script(Script::cast(shared->script()));
64f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  set_script(script);
65c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  set_native(script->type() == Script::TYPE_NATIVE);
66c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  set_eval(script->compilation_type() == Script::COMPILATION_TYPE_EVAL);
67c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
68c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Handle<HeapObject> scope_info(shared->outer_scope_info());
69c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  if (!scope_info->IsTheHole(isolate()) &&
70c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      Handle<ScopeInfo>::cast(scope_info)->length() > 0) {
71c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    set_outer_scope_info(Handle<ScopeInfo>::cast(scope_info));
72f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
73f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
74f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
7562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochParseInfo::ParseInfo(Handle<SharedFunctionInfo> shared,
7662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                     std::shared_ptr<Zone> zone)
7762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    : ParseInfo(shared) {
7862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  zone_.swap(zone);
7962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
8062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
8162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochParseInfo::ParseInfo(Handle<Script> script)
8262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    : ParseInfo(script->GetIsolate()->allocator()) {
83f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  isolate_ = script->GetIsolate();
84f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
8562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  set_allow_lazy_parsing();
86c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  set_toplevel();
87f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  set_hash_seed(isolate_->heap()->HashSeed());
88f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  set_stack_limit(isolate_->stack_guard()->real_climit());
89f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  set_unicode_cache(isolate_->unicode_cache());
90f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  set_script(script);
91f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
92c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  set_native(script->type() == Script::TYPE_NATIVE);
93c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  set_eval(script->compilation_type() == Script::COMPILATION_TYPE_EVAL);
94f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
95f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
96f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochParseInfo::~ParseInfo() {
97f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  if (ast_value_factory_owned()) {
98f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    delete ast_value_factory_;
99f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    set_ast_value_factory_owned(false);
100f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
101f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  ast_value_factory_ = nullptr;
102f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
103f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
10462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// static
10562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochParseInfo* ParseInfo::AllocateWithoutScript(Handle<SharedFunctionInfo> shared) {
10662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Isolate* isolate = shared->GetIsolate();
10762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  ParseInfo* p = new ParseInfo(isolate->allocator());
10862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  p->isolate_ = isolate;
10962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
11062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  p->set_toplevel(shared->is_toplevel());
11162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  p->set_allow_lazy_parsing(FLAG_lazy_inner_functions);
11262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  p->set_hash_seed(isolate->heap()->HashSeed());
11362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  p->set_is_named_expression(shared->is_named_expression());
11462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  p->set_calls_eval(shared->scope_info()->CallsEval());
11562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  p->set_compiler_hints(shared->compiler_hints());
11662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  p->set_start_position(shared->start_position());
11762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  p->set_end_position(shared->end_position());
11862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  p->function_literal_id_ = shared->function_literal_id();
11962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  p->set_stack_limit(isolate->stack_guard()->real_climit());
12062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  p->set_unicode_cache(isolate->unicode_cache());
12162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  p->set_language_mode(shared->language_mode());
12262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  p->set_shared_info(shared);
12362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  p->set_module(shared->kind() == FunctionKind::kModule);
12462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
12562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // BUG(5946): This function exists as a workaround until we can
12662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // get rid of %SetCode in our native functions. The ParseInfo
12762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // is explicitly set up for the case that:
12862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // a) you have a native built-in,
12962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // b) it's being run for the 2nd-Nth time in an isolate,
13062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // c) we've already compiled bytecode and therefore don't need
13162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  //    to parse.
13262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // We tolerate a ParseInfo without a Script in this case.
13362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  p->set_native(true);
13462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  p->set_eval(false);
13562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
13662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<HeapObject> scope_info(shared->outer_scope_info());
13762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (!scope_info->IsTheHole(isolate) &&
13862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Handle<ScopeInfo>::cast(scope_info)->length() > 0) {
13962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    p->set_outer_scope_info(Handle<ScopeInfo>::cast(scope_info));
14062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
14162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return p;
14262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
14362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
144f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochDeclarationScope* ParseInfo::scope() const { return literal()->scope(); }
145f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
146f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochbool ParseInfo::is_declaration() const {
147f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return (compiler_hints_ & (1 << SharedFunctionInfo::kIsDeclaration)) != 0;
148f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
149f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
15062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochFunctionKind ParseInfo::function_kind() const {
15162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return SharedFunctionInfo::FunctionKindBits::decode(compiler_hints_);
152f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
15362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
15462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid ParseInfo::set_deferred_handles(
15562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    std::shared_ptr<DeferredHandles> deferred_handles) {
15662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(deferred_handles_.get() == nullptr);
15762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  deferred_handles_.swap(deferred_handles);
158f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
159f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
16062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid ParseInfo::set_deferred_handles(DeferredHandles* deferred_handles) {
16162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(deferred_handles_.get() == nullptr);
16262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  deferred_handles_.reset(deferred_handles);
163f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
164f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
165f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#ifdef DEBUG
166f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochbool ParseInfo::script_is_native() const {
167f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return script_->type() == Script::TYPE_NATIVE;
168f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
169f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#endif  // DEBUG
170f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
171f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}  // namespace internal
172f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}  // namespace v8
173