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 has_pending_error()61 bool has_pending_error() const { return has_pending_error_; } 62 63 void ThrowPendingError(Isolate* isolate, Handle<Script> script); 64 Handle<String> FormatMessage(Isolate* isolate); 65 66 private: 67 Handle<String> ArgumentString(Isolate* isolate); 68 69 bool has_pending_error_; 70 int start_position_; 71 int end_position_; 72 MessageTemplate::Template message_; 73 const AstRawString* arg_; 74 const char* char_arg_; 75 ParseErrorType error_type_; 76 77 DISALLOW_COPY_AND_ASSIGN(PendingCompilationErrorHandler); 78 }; 79 80 } // namespace internal 81 } // namespace v8 82 #endif // V8_PENDING_COMPILATION_ERROR_HANDLER_H_ 83