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