Home | History | Annotate | Download | only in src
      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:
     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   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