ce145d7977dbfea4baf4e6bb43a7a3041208b154
[WebKit-https.git] / Source / JavaScriptCore / parser / ParserError.h
1 /*
2  * Copyright (C) 2013 Apple Inc. All Rights Reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef ParserError_h
27 #define ParserError_h
28
29 #include "Error.h"
30 #include "ErrorHandlingScope.h"
31 #include "ExceptionHelpers.h"
32 #include "ParserTokens.h"
33 #include <wtf/text/WTFString.h>
34
35 namespace JSC {
36
37 class ParserError {
38 public:
39     enum SyntaxErrorType {
40         SyntaxErrorNone,
41         SyntaxErrorIrrecoverable,
42         SyntaxErrorUnterminatedLiteral,
43         SyntaxErrorRecoverable
44     };
45
46     enum ErrorType {
47         ErrorNone,
48         StackOverflow,
49         EvalError,
50         OutOfMemory,
51         SyntaxError
52     };
53
54     ParserError()
55         : m_type(ErrorNone)
56         , m_syntaxErrorType(SyntaxErrorNone)
57     {
58     }
59     
60     explicit ParserError(ErrorType type)
61         : m_type(type)
62         , m_syntaxErrorType(SyntaxErrorNone)
63     {
64     }
65
66     ParserError(ErrorType type, SyntaxErrorType syntaxError, JSToken token)
67         : m_token(token)
68         , m_type(type)
69         , m_syntaxErrorType(syntaxError)
70     {
71     }
72
73     ParserError(ErrorType type, SyntaxErrorType syntaxError, JSToken token, String msg, int line)
74         : m_token(token)
75         , m_message(msg)
76         , m_line(line)
77         , m_type(type)
78         , m_syntaxErrorType(syntaxError)
79     {
80     }
81
82     bool isValid() const { return m_type != ErrorNone; }
83     SyntaxErrorType syntaxErrorType() const { return m_syntaxErrorType; }
84     const JSToken& token() const { return m_token; }
85     const String& message() const { return m_message; }
86     int line() const { return m_line; }
87
88     JSObject* toErrorObject(
89         JSGlobalObject* globalObject, const SourceCode& source, 
90         int overrideLineNumber = -1)
91     {
92         ExecState* exec = globalObject->globalExec();
93         switch (m_type) {
94         case ErrorNone:
95             return nullptr;
96         case SyntaxError:
97             return addErrorInfo(
98                 exec, 
99                 createSyntaxError(exec, m_message), 
100                 overrideLineNumber == -1 ? m_line : overrideLineNumber, source);
101         case EvalError:
102             return createSyntaxError(exec, m_message);
103         case StackOverflow: {
104             ErrorHandlingScope errorScope(globalObject->vm());
105             return createStackOverflowError(exec);
106         }
107         case OutOfMemory:
108             return createOutOfMemoryError(exec);
109         }
110         CRASH();
111         return nullptr;
112     }
113
114 private:
115     JSToken m_token;
116     String m_message;
117     int m_line { -1 };
118     ErrorType m_type;
119     SyntaxErrorType m_syntaxErrorType;
120 };
121
122 } // namespace JSC
123
124 #endif // ParserError_h