Home | History | Annotate | Download | only in parsing
      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