V8 API Reference, 7.2.502.16 (for Deno 0.2.4)
parsing.cc
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 #include "src/parsing/scanner-character-streams.h"
14 #include "src/vm-state-inl.h"
15 
16 namespace v8 {
17 namespace internal {
18 namespace parsing {
19 
20 bool ParseProgram(ParseInfo* info, Isolate* isolate) {
21  DCHECK(info->is_toplevel());
22  DCHECK_NULL(info->literal());
23 
24  VMState<PARSER> state(isolate);
25 
26  // Create a character stream for the parser.
27  Handle<String> source(String::cast(info->script()->source()), isolate);
28  isolate->counters()->total_parse_size()->Increment(source->length());
29  std::unique_ptr<Utf16CharacterStream> stream(
30  ScannerStream::For(isolate, source));
31  info->set_character_stream(std::move(stream));
32 
33  Parser parser(info);
34 
35  FunctionLiteral* result = nullptr;
36  // Ok to use Isolate here; this function is only called in the main thread.
37  DCHECK(parser.parsing_on_main_thread_);
38 
39  result = parser.ParseProgram(isolate, info);
40  info->set_literal(result);
41  if (result == nullptr) {
42  info->pending_error_handler()->ReportErrors(isolate, info->script(),
43  info->ast_value_factory());
44  } else {
45  result->scope()->AttachOuterScopeInfo(info, isolate);
46  info->set_language_mode(info->literal()->language_mode());
47  if (info->is_eval()) {
48  info->set_allow_eval_cache(parser.allow_eval_cache());
49  }
50  }
51  parser.UpdateStatistics(isolate, info->script());
52  return (result != nullptr);
53 }
54 
55 bool ParseFunction(ParseInfo* info, Handle<SharedFunctionInfo> shared_info,
56  Isolate* isolate) {
57  DCHECK(!info->is_toplevel());
58  DCHECK(!shared_info.is_null());
59  DCHECK_NULL(info->literal());
60 
61  // Create a character stream for the parser.
62  Handle<String> source(String::cast(info->script()->source()), isolate);
63  isolate->counters()->total_parse_size()->Increment(source->length());
64  std::unique_ptr<Utf16CharacterStream> stream(
65  ScannerStream::For(isolate, source, shared_info->StartPosition(),
66  shared_info->EndPosition()));
67  info->set_character_stream(std::move(stream));
68 
69  VMState<PARSER> state(isolate);
70 
71  Parser parser(info);
72 
73  FunctionLiteral* result = nullptr;
74  // Ok to use Isolate here; this function is only called in the main thread.
75  DCHECK(parser.parsing_on_main_thread_);
76 
77  result = parser.ParseFunction(isolate, info, shared_info);
78  info->set_literal(result);
79  if (result == nullptr) {
80  info->pending_error_handler()->ReportErrors(isolate, info->script(),
81  info->ast_value_factory());
82  } else {
83  result->scope()->AttachOuterScopeInfo(info, isolate);
84  if (info->is_eval()) {
85  info->set_allow_eval_cache(parser.allow_eval_cache());
86  }
87  }
88  parser.UpdateStatistics(isolate, info->script());
89  return (result != nullptr);
90 }
91 
92 bool ParseAny(ParseInfo* info, Handle<SharedFunctionInfo> shared_info,
93  Isolate* isolate) {
94  DCHECK(!shared_info.is_null());
95  return info->is_toplevel() ? ParseProgram(info, isolate)
96  : ParseFunction(info, shared_info, isolate);
97 }
98 
99 } // namespace parsing
100 } // namespace internal
101 } // namespace v8
Definition: libplatform.h:13