summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/runtime/LiteralParser.h
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/JavaScriptCore/runtime/LiteralParser.h
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/JavaScriptCore/runtime/LiteralParser.h')
-rw-r--r--Source/JavaScriptCore/runtime/LiteralParser.h64
1 files changed, 51 insertions, 13 deletions
diff --git a/Source/JavaScriptCore/runtime/LiteralParser.h b/Source/JavaScriptCore/runtime/LiteralParser.h
index f05f03204..8dc142cd8 100644
--- a/Source/JavaScriptCore/runtime/LiteralParser.h
+++ b/Source/JavaScriptCore/runtime/LiteralParser.h
@@ -23,13 +23,13 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef LiteralParser_h
-#define LiteralParser_h
+#pragma once
#include "Identifier.h"
#include "JSCJSValue.h"
#include "JSGlobalObjectFunctions.h"
#include <array>
+#include <wtf/text/StringBuilder.h>
#include <wtf/text/WTFString.h>
namespace JSC {
@@ -65,10 +65,15 @@ struct JSONPData {
template <typename CharType>
struct LiteralParserToken {
+private:
+WTF_MAKE_NONCOPYABLE(LiteralParserToken<CharType>);
+
+public:
+ LiteralParserToken() = default;
+
TokenType type;
const CharType* start;
const CharType* end;
- String stringBuffer;
union {
double numberToken;
struct {
@@ -98,9 +103,9 @@ public:
String getErrorMessage()
{
if (!m_lexer.getErrorMessage().isEmpty())
- return String::format("JSON Parse error: %s", m_lexer.getErrorMessage().ascii().data()).impl();
+ return String::format("JSON Parse error: %s", m_lexer.getErrorMessage().ascii().data());
if (!m_parseErrorMessage.isEmpty())
- return String::format("JSON Parse error: %s", m_parseErrorMessage.ascii().data()).impl();
+ return String::format("JSON Parse error: %s", m_parseErrorMessage.ascii().data());
return ASCIILiteral("JSON Parse error: Unable to parse JSON string");
}
@@ -108,9 +113,9 @@ public:
{
m_lexer.next();
JSValue result = parse(m_mode == StrictJSON ? StartParseExpression : StartParseStatement);
- if (m_lexer.currentToken().type == TokSemi)
+ if (m_lexer.currentToken()->type == TokSemi)
m_lexer.next();
- if (m_lexer.currentToken().type != TokEnd)
+ if (m_lexer.currentToken()->type != TokEnd)
return JSValue();
return result;
}
@@ -129,10 +134,40 @@ private:
TokenType next();
- const LiteralParserToken<CharType>& currentToken()
+#if ASSERT_DISABLED
+ typedef const LiteralParserToken<CharType>* LiteralParserTokenPtr;
+
+ LiteralParserTokenPtr currentToken()
{
- return m_currentToken;
+ return &m_currentToken;
}
+#else
+ class LiteralParserTokenPtr;
+ friend class LiteralParserTokenPtr;
+ class LiteralParserTokenPtr {
+ public:
+ LiteralParserTokenPtr(Lexer& lexer)
+ : m_lexer(lexer)
+ , m_tokenID(lexer.m_currentTokenID)
+ {
+ }
+
+ ALWAYS_INLINE const LiteralParserToken<CharType>* operator->() const
+ {
+ ASSERT(m_tokenID == m_lexer.m_currentTokenID);
+ return &m_lexer.m_currentToken;
+ }
+
+ private:
+ Lexer& m_lexer;
+ unsigned m_tokenID;
+ };
+
+ LiteralParserTokenPtr currentToken()
+ {
+ return LiteralParserTokenPtr(*this);
+ }
+#endif
String getErrorMessage() { return m_lexErrorMessage; }
@@ -141,11 +176,16 @@ private:
template <ParserMode mode> TokenType lex(LiteralParserToken<CharType>&);
ALWAYS_INLINE TokenType lexIdentifier(LiteralParserToken<CharType>&);
template <ParserMode mode, char terminator> ALWAYS_INLINE TokenType lexString(LiteralParserToken<CharType>&);
+ template <ParserMode mode, char terminator> TokenType lexStringSlow(LiteralParserToken<CharType>&, const CharType* runStart);
ALWAYS_INLINE TokenType lexNumber(LiteralParserToken<CharType>&);
LiteralParserToken<CharType> m_currentToken;
ParserMode m_mode;
const CharType* m_ptr;
const CharType* m_end;
+ StringBuilder m_builder;
+#if !ASSERT_DISABLED
+ unsigned m_currentTokenID { 0 };
+#endif
};
class StackGuard;
@@ -160,8 +200,6 @@ private:
std::array<Identifier, MaximumCachableCharacter> m_recentIdentifiers;
ALWAYS_INLINE const Identifier makeIdentifier(const LChar* characters, size_t length);
ALWAYS_INLINE const Identifier makeIdentifier(const UChar* characters, size_t length);
- };
-
-}
+};
-#endif
+} // namespace JSC