<https://bugs.webkit.org/show_bug.cgi?id=23049> [jsfunfuzz] With blocks do not correc...
[WebKit-https.git] / JavaScriptCore / parser / Lexer.h
1 /*
2  *  This file is part of the KDE libraries
3  *  Copyright (C) 1999-2000 Harri Porten (porten@kde.org)
4  *  Copyright (C) 2007 Apple Inc.
5  *
6  *  This library is free software; you can redistribute it and/or
7  *  modify it under the terms of the GNU Library General Public
8  *  License as published by the Free Software Foundation; either
9  *  version 2 of the License, or (at your option) any later version.
10  *
11  *  This library is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  *  Library General Public License for more details.
15  *
16  *  You should have received a copy of the GNU Library General Public License
17  *  along with this library; see the file COPYING.LIB.  If not, write to
18  *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  *  Boston, MA 02110-1301, USA.
20  *
21  */
22
23 #ifndef Lexer_h
24 #define Lexer_h
25
26 #include "Identifier.h"
27 #include "Lookup.h"
28 #include "SegmentedVector.h"
29 #include "SourceCode.h"
30 #include <wtf/Vector.h>
31
32 namespace JSC {
33
34     class RegExp;
35
36     class Lexer : Noncopyable {
37     public:
38         void setCode(const SourceCode&);
39         void setIsReparsing() { m_isReparsing = true; }
40         int lex(void* lvalp, void* llocp);
41
42         int lineNo() const { return yylineno; }
43
44         bool prevTerminator() const { return m_terminator; }
45
46         enum State {
47             Start,
48             IdentifierOrKeyword,
49             Identifier,
50             InIdentifierOrKeyword,
51             InIdentifier,
52             InIdentifierStartUnicodeEscapeStart,
53             InIdentifierStartUnicodeEscape,
54             InIdentifierPartUnicodeEscapeStart,
55             InIdentifierPartUnicodeEscape,
56             InSingleLineComment,
57             InMultiLineComment,
58             InNum,
59             InNum0,
60             InHex,
61             InOctal,
62             InDecimal,
63             InExponentIndicator,
64             InExponent,
65             Hex,
66             Octal,
67             Number,
68             String,
69             Eof,
70             InString,
71             InEscapeSequence,
72             InHexEscape,
73             InUnicodeEscape,
74             Other,
75             Bad
76         };
77
78         bool scanRegExp();
79         const UString& pattern() const { return m_pattern; }
80         const UString& flags() const { return m_flags; }
81
82         static unsigned char convertHex(int);
83         static unsigned char convertHex(int c1, int c2);
84         static UChar convertUnicode(int c1, int c2, int c3, int c4);
85         static bool isIdentStart(int);
86         static bool isIdentPart(int);
87         static bool isHexDigit(int);
88
89         bool sawError() const { return m_error; }
90
91         void clear();
92         SourceCode sourceCode(int openBrace, int closeBrace, int firstLine) { return SourceCode(m_source->provider(), openBrace + 1, closeBrace, firstLine); }
93
94     private:
95         friend class JSGlobalData;
96         Lexer(JSGlobalData*);
97         ~Lexer();
98
99         void setDone(State);
100         void shift(unsigned int p);
101         void nextLine();
102         int lookupKeyword(const char *);
103
104         bool isWhiteSpace() const;
105         bool isLineTerminator();
106         static bool isOctalDigit(int);
107
108         int matchPunctuator(int& charPos, int c1, int c2, int c3, int c4);
109         static unsigned short singleEscape(unsigned short);
110         static unsigned short convertOctal(int c1, int c2, int c3);
111
112         void record8(int);
113         void record16(int);
114         void record16(UChar);
115
116         JSC::Identifier* makeIdentifier(const Vector<UChar>& buffer)
117         {
118             m_identifiers.append(JSC::Identifier(m_globalData, buffer.data(), buffer.size()));
119             return &m_identifiers.last();
120         }
121
122         static const size_t initialReadBufferCapacity = 32;
123         static const size_t initialIdentifierTableCapacity = 64;
124
125         int yylineno;
126         int yycolumn;
127
128         bool m_done;
129         Vector<char> m_buffer8;
130         Vector<UChar> m_buffer16;
131         bool m_terminator;
132         bool m_restrKeyword;
133         bool m_delimited; // encountered delimiter like "'" and "}" on last run
134         bool m_skipLF;
135         bool m_skipCR;
136         bool m_eatNextIdentifier;
137         int m_stackToken;
138         int m_lastToken;
139
140         State m_state;
141         unsigned int m_position;
142         const SourceCode* m_source;
143         const UChar* m_code;
144         unsigned int m_length;
145         bool m_isReparsing;
146         int m_atLineStart;
147         bool m_error;
148
149         // current and following unicode characters (int to allow for -1 for end-of-file marker)
150         int m_current;
151         int m_next1;
152         int m_next2;
153         int m_next3;
154         
155         int m_currentOffset;
156         int m_nextOffset1;
157         int m_nextOffset2;
158         int m_nextOffset3;
159         
160         SegmentedVector<JSC::Identifier, initialIdentifierTableCapacity> m_identifiers;
161
162         JSGlobalData* m_globalData;
163
164         UString m_pattern;
165         UString m_flags;
166
167         const HashTable m_mainTable;
168     };
169
170 } // namespace JSC
171
172 #endif // Lexer_h