v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
parsing.cc
Go to the documentation of this file.
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
6
7#include <memory>
8
9#include "src/ast/ast.h"
14#include "src/parsing/parser.h"
17#include "src/zone/zone-list-inl.h" // crbug.com/v8/8816
18
19namespace v8 {
20namespace internal {
21namespace parsing {
22
23namespace {
24
25void MaybeReportStatistics(ParseInfo* info, DirectHandle<Script> script,
26 Isolate* isolate, Parser* parser,
28 switch (mode) {
30 parser->UpdateStatistics(isolate, script);
31 break;
33 break;
34 }
35}
36
37} // namespace
38
40 MaybeDirectHandle<ScopeInfo> maybe_outer_scope_info,
41 Isolate* isolate, ReportStatisticsMode mode) {
42 DCHECK(info->flags().is_toplevel());
43 DCHECK_NULL(info->literal());
44
45 VMState<PARSER> state(isolate);
46
47 // Create a character stream for the parser.
48 Handle<String> source(Cast<String>(script->source()), isolate);
49 std::unique_ptr<Utf16CharacterStream> stream(
50 ScannerStream::For(isolate, source));
51 info->set_character_stream(std::move(stream));
52
53 Parser parser(isolate->main_thread_local_isolate(), info);
54
55 // Ok to use Isolate here; this function is only called in the main thread.
56 DCHECK(parser.parsing_on_main_thread_);
57 parser.ParseProgram(isolate, script, info, maybe_outer_scope_info);
58 MaybeReportStatistics(info, script, isolate, &parser, mode);
59 return info->literal() != nullptr;
60}
61
63 Isolate* isolate, ReportStatisticsMode mode) {
64 return ParseProgram(info, script, kNullMaybeHandle, isolate, mode);
65}
66
69 Isolate* isolate, ReportStatisticsMode mode) {
70 DCHECK(!info->flags().is_toplevel());
71 DCHECK(!shared_info.is_null());
72 DCHECK_NULL(info->literal());
73
74 VMState<PARSER> state(isolate);
75
76 // Create a character stream for the parser.
77 DirectHandle<Script> script(Cast<Script>(shared_info->script()), isolate);
78 Handle<String> source(Cast<String>(script->source()), isolate);
79 uint32_t start_pos = shared_info->StartPosition();
80 uint32_t end_pos = shared_info->EndPosition();
81 if (end_pos > source->length()) {
82 isolate->PushStackTraceAndDie(reinterpret_cast<void*>(script->ptr()),
83 reinterpret_cast<void*>(source->ptr()));
84 }
85 std::unique_ptr<Utf16CharacterStream> stream(
86 ScannerStream::For(isolate, source, start_pos, end_pos));
87 info->set_character_stream(std::move(stream));
88
89 Parser parser(isolate->main_thread_local_isolate(), info);
90
91 // Ok to use Isolate here; this function is only called in the main thread.
92 DCHECK(parser.parsing_on_main_thread_);
93 parser.ParseFunction(isolate, info, shared_info);
94 MaybeReportStatistics(info, script, isolate, &parser, mode);
95 return info->literal() != nullptr;
96}
97
99 Isolate* isolate, ReportStatisticsMode mode) {
100 DCHECK(!shared_info.is_null());
101 if (info->flags().is_toplevel()) {
102 MaybeDirectHandle<ScopeInfo> maybe_outer_scope_info;
103 if (shared_info->HasOuterScopeInfo()) {
104 maybe_outer_scope_info =
105 direct_handle(shared_info->GetOuterScopeInfo(), isolate);
106 }
107 return ParseProgram(
108 info, direct_handle(Cast<Script>(shared_info->script()), isolate),
109 maybe_outer_scope_info, isolate, mode);
110 }
111 return ParseFunction(info, shared_info, isolate, mode);
112}
113
114} // namespace parsing
115} // namespace internal
116} // namespace v8
V8_INLINE bool is_null() const
Definition handles.h:693
void UpdateStatistics(Isolate *isolate, DirectHandle< Script > script)
Definition parser.cc:3413
void ParseFunction(Isolate *isolate, ParseInfo *info, DirectHandle< SharedFunctionInfo > shared_info)
Definition parser.cc:976
void ParseProgram(Isolate *isolate, DirectHandle< Script > script, ParseInfo *info, MaybeDirectHandle< ScopeInfo > maybe_outer_scope_info)
Definition parser.cc:668
static Utf16CharacterStream * For(Isolate *isolate, Handle< String > data)
LiftoffAssembler::CacheState state
InstructionOperand source
bool ParseAny(ParseInfo *info, DirectHandle< SharedFunctionInfo > shared_info, Isolate *isolate, ReportStatisticsMode mode)
Definition parsing.cc:98
bool ParseFunction(ParseInfo *info, DirectHandle< SharedFunctionInfo > shared_info, Isolate *isolate, ReportStatisticsMode mode)
Definition parsing.cc:67
bool ParseProgram(ParseInfo *info, DirectHandle< Script > script, MaybeDirectHandle< ScopeInfo > maybe_outer_scope_info, Isolate *isolate, ReportStatisticsMode mode)
Definition parsing.cc:39
constexpr NullMaybeHandleType kNullMaybeHandle
V8_INLINE DirectHandle< T > direct_handle(Tagged< T > object, Isolate *isolate)
kInterpreterTrampolineOffset script
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
Definition casting.h:150
#define DCHECK_NULL(val)
Definition logging.h:491
#define DCHECK(condition)
Definition logging.h:482