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