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/parsing.h"
      6 
      7 #include <memory>
      8 
      9 #include "src/ast/ast.h"
     10 #include "src/objects-inl.h"
     11 #include "src/parsing/parse-info.h"
     12 #include "src/parsing/parser.h"
     13 
     14 namespace v8 {
     15 namespace internal {
     16 namespace parsing {
     17 
     18 bool ParseProgram(ParseInfo* info, bool internalize) {
     19   DCHECK(info->is_toplevel());
     20   DCHECK_NULL(info->literal());
     21 
     22   Parser parser(info);
     23 
     24   FunctionLiteral* result = nullptr;
     25   // Ok to use Isolate here; this function is only called in the main thread.
     26   DCHECK(parser.parsing_on_main_thread_);
     27   Isolate* isolate = info->isolate();
     28 
     29   parser.SetCachedData(info);
     30   result = parser.ParseProgram(isolate, info);
     31   info->set_literal(result);
     32   if (result == nullptr) {
     33     parser.ReportErrors(isolate, info->script());
     34   } else {
     35     info->set_language_mode(info->literal()->language_mode());
     36   }
     37   parser.UpdateStatistics(isolate, info->script());
     38   if (internalize) {
     39     info->ast_value_factory()->Internalize(isolate);
     40   }
     41   return (result != nullptr);
     42 }
     43 
     44 bool ParseFunction(ParseInfo* info, bool internalize) {
     45   DCHECK(!info->is_toplevel());
     46   DCHECK_NULL(info->literal());
     47 
     48   Parser parser(info);
     49 
     50   FunctionLiteral* result = nullptr;
     51   // Ok to use Isolate here; this function is only called in the main thread.
     52   DCHECK(parser.parsing_on_main_thread_);
     53   Isolate* isolate = info->isolate();
     54 
     55   result = parser.ParseFunction(isolate, info);
     56   info->set_literal(result);
     57   if (result == nullptr) {
     58     parser.ReportErrors(isolate, info->script());
     59   }
     60   parser.UpdateStatistics(isolate, info->script());
     61   if (internalize) {
     62     info->ast_value_factory()->Internalize(isolate);
     63   }
     64   return (result != nullptr);
     65 }
     66 
     67 bool ParseAny(ParseInfo* info, bool internalize) {
     68   return info->is_toplevel() ? ParseProgram(info, internalize)
     69                              : ParseFunction(info, internalize);
     70 }
     71 
     72 }  // namespace parsing
     73 }  // namespace internal
     74 }  // namespace v8
     75