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/ast/ast-value-factory.h" 8 #include "src/ast/ast.h" 9 10 namespace v8 { 11 namespace internal { 12 13 ParseInfo::ParseInfo(Zone* zone) 14 : zone_(zone), 15 flags_(0), 16 source_stream_(nullptr), 17 source_stream_encoding_(ScriptCompiler::StreamedSource::ONE_BYTE), 18 character_stream_(nullptr), 19 extension_(nullptr), 20 compile_options_(ScriptCompiler::kNoCompileOptions), 21 script_scope_(nullptr), 22 unicode_cache_(nullptr), 23 stack_limit_(0), 24 hash_seed_(0), 25 compiler_hints_(0), 26 start_position_(0), 27 end_position_(0), 28 isolate_(nullptr), 29 cached_data_(nullptr), 30 ast_value_factory_(nullptr), 31 function_name_(nullptr), 32 literal_(nullptr) {} 33 34 ParseInfo::ParseInfo(Zone* zone, Handle<SharedFunctionInfo> shared) 35 : ParseInfo(zone) { 36 isolate_ = shared->GetIsolate(); 37 38 set_toplevel(shared->is_toplevel()); 39 set_allow_lazy_parsing(FLAG_lazy_inner_functions); 40 set_hash_seed(isolate_->heap()->HashSeed()); 41 set_is_named_expression(shared->is_named_expression()); 42 set_calls_eval(shared->scope_info()->CallsEval()); 43 set_compiler_hints(shared->compiler_hints()); 44 set_start_position(shared->start_position()); 45 set_end_position(shared->end_position()); 46 set_stack_limit(isolate_->stack_guard()->real_climit()); 47 set_unicode_cache(isolate_->unicode_cache()); 48 set_language_mode(shared->language_mode()); 49 set_shared_info(shared); 50 51 Handle<Script> script(Script::cast(shared->script())); 52 set_script(script); 53 set_native(script->type() == Script::TYPE_NATIVE); 54 set_eval(script->compilation_type() == Script::COMPILATION_TYPE_EVAL); 55 56 Handle<HeapObject> scope_info(shared->outer_scope_info()); 57 if (!scope_info->IsTheHole(isolate()) && 58 Handle<ScopeInfo>::cast(scope_info)->length() > 0) { 59 set_outer_scope_info(Handle<ScopeInfo>::cast(scope_info)); 60 } 61 } 62 63 ParseInfo::ParseInfo(Zone* zone, Handle<Script> script) : ParseInfo(zone) { 64 isolate_ = script->GetIsolate(); 65 66 set_allow_lazy_parsing(String::cast(script->source())->length() > 67 FLAG_min_preparse_length); 68 set_toplevel(); 69 set_hash_seed(isolate_->heap()->HashSeed()); 70 set_stack_limit(isolate_->stack_guard()->real_climit()); 71 set_unicode_cache(isolate_->unicode_cache()); 72 set_script(script); 73 74 set_native(script->type() == Script::TYPE_NATIVE); 75 set_eval(script->compilation_type() == Script::COMPILATION_TYPE_EVAL); 76 } 77 78 ParseInfo::~ParseInfo() { 79 if (ast_value_factory_owned()) { 80 delete ast_value_factory_; 81 set_ast_value_factory_owned(false); 82 } 83 ast_value_factory_ = nullptr; 84 } 85 86 DeclarationScope* ParseInfo::scope() const { return literal()->scope(); } 87 88 bool ParseInfo::is_declaration() const { 89 return (compiler_hints_ & (1 << SharedFunctionInfo::kIsDeclaration)) != 0; 90 } 91 92 bool ParseInfo::requires_class_field_init() const { 93 return (compiler_hints_ & 94 (1 << SharedFunctionInfo::kRequiresClassFieldInit)) != 0; 95 } 96 bool ParseInfo::is_class_field_initializer() const { 97 return (compiler_hints_ & 98 (1 << SharedFunctionInfo::kIsClassFieldInitializer)) != 0; 99 } 100 101 FunctionKind ParseInfo::function_kind() const { 102 return SharedFunctionInfo::FunctionKindBits::decode(compiler_hints_); 103 } 104 105 #ifdef DEBUG 106 bool ParseInfo::script_is_native() const { 107 return script_->type() == Script::TYPE_NATIVE; 108 } 109 #endif // DEBUG 110 111 } // namespace internal 112 } // namespace v8 113