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 
5 #ifndef V8_PENDING_COMPILATION_ERROR_HANDLER_H_
6 #define V8_PENDING_COMPILATION_ERROR_HANDLER_H_
7 
8 #include "src/base/macros.h"
9 #include "src/globals.h"
10 #include "src/handles.h"
11 #include "src/messages.h"
12 
13 namespace v8 {
14 namespace internal {
15 
16 class AstRawString;
17 class Isolate;
18 class Script;
19 
20 // Helper class for handling pending compilation errors consistently in various
21 // compilation phases.
22 class PendingCompilationErrorHandler {
23  public:
PendingCompilationErrorHandler()24   PendingCompilationErrorHandler()
25       : has_pending_error_(false),
26         start_position_(-1),
27         end_position_(-1),
28         message_(MessageTemplate::kNone),
29         arg_(nullptr),
30         char_arg_(nullptr),
31         error_type_(kSyntaxError) {}
32 
33   void ReportMessageAt(int start_position, int end_position,
34                        MessageTemplate::Template message,
35                        const char* arg = nullptr,
36                        ParseErrorType error_type = kSyntaxError) {
37     if (has_pending_error_) return;
38     has_pending_error_ = true;
39     start_position_ = start_position;
40     end_position_ = end_position;
41     message_ = message;
42     char_arg_ = arg;
43     arg_ = nullptr;
44     error_type_ = error_type;
45   }
46 
47   void ReportMessageAt(int start_position, int end_position,
48                        MessageTemplate::Template message,
49                        const AstRawString* arg,
50                        ParseErrorType error_type = kSyntaxError) {
51     if (has_pending_error_) return;
52     has_pending_error_ = true;
53     start_position_ = start_position;
54     end_position_ = end_position;
55     message_ = message;
56     char_arg_ = nullptr;
57     arg_ = arg;
58     error_type_ = error_type;
59   }
60 
61   void ReportMessageAt(int start_position, int end_position,
62                        MessageTemplate::Template message, Handle<String> arg,
63                        ParseErrorType error_type = kSyntaxError) {
64     if (has_pending_error_) return;
65     has_pending_error_ = true;
66     start_position_ = start_position;
67     end_position_ = end_position;
68     message_ = message;
69     char_arg_ = nullptr;
70     arg_ = nullptr;
71     handle_arg_ = arg;
72     error_type_ = error_type;
73   }
74 
has_pending_error()75   bool has_pending_error() const { return has_pending_error_; }
76 
77   void ThrowPendingError(Isolate* isolate, Handle<Script> script);
78 
79  private:
80   bool has_pending_error_;
81   int start_position_;
82   int end_position_;
83   MessageTemplate::Template message_;
84   const AstRawString* arg_;
85   const char* char_arg_;
86   Handle<String> handle_arg_;
87   ParseErrorType error_type_;
88 
89   DISALLOW_COPY_AND_ASSIGN(PendingCompilationErrorHandler);
90 };
91 
92 }  // namespace internal
93 }  // namespace v8
94 #endif  // V8_PENDING_COMPILATION_ERROR_HANDLER_H_
95