v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
pending-compilation-error-handler.cc
Go to the documentation of this file.
1// Copyright 2015 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
9#include "src/base/logging.h"
10#include "src/debug/debug.h"
13#include "src/handles/handles.h"
16
17namespace v8 {
18namespace internal {
19
26
28 int index, Handle<String> string, LocalIsolate* isolate) {
29 DCHECK_NE(args_[index].type, kMainThreadHandle);
30 args_[index].type = kMainThreadHandle;
31 args_[index].js_string = isolate->heap()->NewPersistentHandle(string);
32}
33
34template <typename IsolateT>
36 IsolateT* isolate) {
37 for (int i = 0; i < kMaxArgumentCount; i++) {
38 switch (args_[i].type) {
39 case kAstRawString:
40 SetString(i, args_[i].ast_string->string(), isolate);
41 break;
42 case kNone:
43 case kConstCharString:
44 // We can delay allocation until ArgString(isolate).
45 break;
46
47 case kMainThreadHandle:
48 // The message details might already be prepared, so skip them if this
49 // is the case.
50 break;
51 }
52 }
53}
54
56 Isolate* isolate, int index) const {
57 // `index` may be >= argc; in that case we return a default value to pass on
58 // elsewhere.
59 DCHECK_LT(index, kMaxArgumentCount);
60 switch (args_[index].type) {
61 case kMainThreadHandle:
62 return args_[index].js_string;
63 case kNone:
64 return Handle<String>::null();
65 case kConstCharString:
66 return isolate->factory()
67 ->NewStringFromUtf8(base::CStrVector(args_[index].c_string),
69 .ToHandleChecked();
70 case kAstRawString:
72 }
73}
74
76 Handle<Script> script) const {
77 return MessageLocation(script, start_position_, end_position_);
78}
79
81 int end_position,
82 MessageTemplate message,
83 const char* arg) {
84 if (has_pending_error_ && end_position >= error_details_.start_pos()) return;
85
86 has_pending_error_ = true;
87
88 error_details_ = MessageDetails(start_position, end_position, message, arg);
89}
90
92 int end_position,
93 MessageTemplate message,
94 const AstRawString* arg) {
95 if (has_pending_error_ && end_position >= error_details_.start_pos()) return;
96
97 has_pending_error_ = true;
98
99 error_details_ = MessageDetails(start_position, end_position, message, arg);
100}
101
103 int end_position,
104 MessageTemplate message,
105 const AstRawString* arg0,
106 const char* arg1) {
107 if (has_pending_error_ && end_position >= error_details_.start_pos()) return;
108
109 has_pending_error_ = true;
111 MessageDetails(start_position, end_position, message, arg0, arg1);
112}
113
115 int start_position, int end_position, MessageTemplate message,
116 const AstRawString* arg0, const AstRawString* arg1, const char* arg2) {
117 if (has_pending_error_ && end_position >= error_details_.start_pos()) return;
118
119 has_pending_error_ = true;
121 MessageDetails(start_position, end_position, message, arg0, arg1, arg2);
122}
123
125 int end_position,
126 MessageTemplate message,
127 const char* arg) {
128 warning_messages_.emplace_front(
129 MessageDetails(start_position, end_position, message, arg));
130}
131
132template <typename IsolateT>
135
136 for (MessageDetails& warning : warning_messages_) {
137 warning.Prepare(isolate);
138 }
139}
142 LocalIsolate* isolate);
143
145 Isolate* isolate, Handle<Script> script) const {
147
148 for (const MessageDetails& warning : warning_messages_) {
149 MessageLocation location = warning.GetLocation(script);
150 DirectHandle<String> argument = warning.ArgString(isolate, 0);
151 DCHECK_LT(warning.ArgCount(), 2); // Arg1 is only used for errors.
153 isolate, warning.message(), &location, argument);
154 message->set_error_level(v8::Isolate::kMessageWarning);
155 MessageHandler::ReportMessage(isolate, &location, message);
156 }
157}
158
159template <typename IsolateT>
161 IsolateT* isolate, AstValueFactory* ast_value_factory) {
162 if (stack_overflow()) return;
163
165 // Internalize ast values for throwing the pending error.
166 ast_value_factory->Internalize(isolate);
167 error_details_.Prepare(isolate);
168}
171 PrepareErrors(Isolate* isolate, AstValueFactory* ast_value_factory);
174 PrepareErrors(LocalIsolate* isolate, AstValueFactory* ast_value_factory);
175
177 Handle<Script> script) const {
178 if (stack_overflow()) {
179 isolate->StackOverflow();
180 } else {
182 ThrowPendingError(isolate, script);
183 }
184}
185
187 Isolate* isolate, Handle<Script> script) const {
188 if (!has_pending_error_) return;
189
190 MessageLocation location = error_details_.GetLocation(script);
191 int num_args = 0;
193 for (; num_args < MessageDetails::kMaxArgumentCount; ++num_args) {
194 args[num_args] = error_details_.ArgString(isolate, num_args);
195 if (args[num_args].is_null()) break;
196 }
197 isolate->debug()->OnCompileError(script);
198
199 Factory* factory = isolate->factory();
200 DirectHandle<JSObject> error = factory->NewSyntaxError(
202 isolate->ThrowAt(error, &location);
203}
204
206 Isolate* isolate) {
207 error_details_.Prepare(isolate);
208 int num_args = 0;
210 for (; num_args < MessageDetails::kMaxArgumentCount; ++num_args) {
211 args[num_args] = error_details_.ArgString(isolate, num_args);
212 if (args[num_args].is_null()) break;
213 }
215 base::VectorOf(args, num_args));
216}
217
218} // namespace internal
219} // namespace v8
void Internalize(IsolateT *isolate)
static DirectHandle< String > Format(Isolate *isolate, MessageTemplate index, base::Vector< const DirectHandle< Object > > args)
Definition messages.cc:396
static V8_EXPORT_PRIVATE void ReportMessage(Isolate *isolate, const MessageLocation *loc, DirectHandle< JSMessageObject > message)
Definition messages.cc:98
static V8_EXPORT_PRIVATE Handle< JSMessageObject > MakeMessageObject(Isolate *isolate, MessageTemplate type, const MessageLocation *location, DirectHandle< Object > argument, DirectHandle< StackTraceInfo > stack_trace=DirectHandle< StackTraceInfo >::null())
Definition messages.cc:77
void SetString(int index, Handle< String > string, Isolate *isolate)
DirectHandle< String > ArgString(Isolate *isolate, int index) const
void ReportWarningAt(int start_position, int end_position, MessageTemplate message, const char *arg=nullptr)
void ThrowPendingError(Isolate *isolate, Handle< Script > script) const
V8_EXPORT_PRIVATE DirectHandle< String > FormatErrorMessageForTest(Isolate *isolate)
V8_EXPORT_PRIVATE void ReportErrors(Isolate *isolate, Handle< Script > script) const
void ReportMessageAt(int start_position, int end_position, MessageTemplate message, const char *arg=nullptr)
void ReportWarnings(Isolate *isolate, Handle< Script > script) const
void PrepareErrors(IsolateT *isolate, AstValueFactory *ast_value_factory)
base::Vector< const DirectHandle< Object > > args
Definition execution.cc:74
#define EXPORT_TEMPLATE_DEFINE(export)
constexpr Vector< T > VectorOf(T *start, size_t size)
Definition vector.h:360
Vector< const char > CStrVector(const char *data)
Definition vector.h:331
template const char * string
#define DCHECK_NE(v1, v2)
Definition logging.h:486
#define DCHECK(condition)
Definition logging.h:482
#define DCHECK_LT(v1, v2)
Definition logging.h:489
#define V8_EXPORT_PRIVATE
Definition macros.h:460