diff options
author | Andrei Popescu <andreip@google.com> | 2009-08-19 14:09:30 +0100 |
---|---|---|
committer | Andrei Popescu <andreip@google.com> | 2009-08-19 14:09:30 +0100 |
commit | 058ccc7ba0a4d59b9f6e92808332aa9895425fc7 (patch) | |
tree | 276aad5a2bbc2fd7d65d21bfca42c9de88b3dd20 /JavaScriptCore/parser/Lexer.cpp | |
parent | 2796dd1bf3b4b01e7e1d96ea91bd3a212f647579 (diff) | |
download | external_webkit-058ccc7ba0a4d59b9f6e92808332aa9895425fc7.zip external_webkit-058ccc7ba0a4d59b9f6e92808332aa9895425fc7.tar.gz external_webkit-058ccc7ba0a4d59b9f6e92808332aa9895425fc7.tar.bz2 |
Revert "Merge WebKit r47420"
This reverts commit d227fc870c7a697500a3c900c31baf05fb9a8524.
Diffstat (limited to 'JavaScriptCore/parser/Lexer.cpp')
-rw-r--r-- | JavaScriptCore/parser/Lexer.cpp | 101 |
1 files changed, 21 insertions, 80 deletions
diff --git a/JavaScriptCore/parser/Lexer.cpp b/JavaScriptCore/parser/Lexer.cpp index febd9a4..8e89c18 100644 --- a/JavaScriptCore/parser/Lexer.cpp +++ b/JavaScriptCore/parser/Lexer.cpp @@ -908,107 +908,45 @@ returnError: return -1; } -bool Lexer::scanRegExp(const Identifier*& pattern, const Identifier*& flags, UChar patternPrefix) +bool Lexer::scanRegExp() { ASSERT(m_buffer16.isEmpty()); bool lastWasEscape = false; bool inBrackets = false; - if (patternPrefix) { - ASSERT(!isLineTerminator(patternPrefix)); - ASSERT(patternPrefix != '/'); - ASSERT(patternPrefix != '['); - record16(patternPrefix); - } - while (true) { - int current = m_current; - - if (isLineTerminator(current) || current == -1) { - m_buffer16.resize(0); + if (isLineTerminator(m_current) || m_current == -1) return false; - } - - shift1(); - - if (current == '/' && !lastWasEscape && !inBrackets) - break; - - record16(current); - - if (lastWasEscape) { - lastWasEscape = false; - continue; - } - - switch (current) { - case '[': - inBrackets = true; - break; - case ']': - inBrackets = false; - break; - case '\\': - lastWasEscape = true; + if (m_current != '/' || lastWasEscape || inBrackets) { + // keep track of '[' and ']' + if (!lastWasEscape) { + if (m_current == '[' && !inBrackets) + inBrackets = true; + if (m_current == ']' && inBrackets) + inBrackets = false; + } + record16(m_current); + lastWasEscape = !lastWasEscape && m_current == '\\'; + } else { // end of regexp + m_pattern = UString(m_buffer16); + m_buffer16.resize(0); + shift1(); break; } + shift1(); } - pattern = makeIdentifier(m_buffer16.data(), m_buffer16.size()); - m_buffer16.resize(0); - while (isIdentPart(m_current)) { record16(m_current); shift1(); } - - flags = makeIdentifier(m_buffer16.data(), m_buffer16.size()); + m_flags = UString(m_buffer16); m_buffer16.resize(0); return true; } -bool Lexer::skipRegExp() -{ - bool lastWasEscape = false; - bool inBrackets = false; - - while (true) { - int current = m_current; - - if (isLineTerminator(current) || current == -1) - return false; - - shift1(); - - if (current == '/' && !lastWasEscape && !inBrackets) - break; - - if (lastWasEscape) { - lastWasEscape = false; - continue; - } - - switch (current) { - case '[': - inBrackets = true; - break; - case ']': - inBrackets = false; - break; - case '\\': - lastWasEscape = true; - break; - } - } - - while (isIdentPart(m_current)) - shift1(); - - return true; -} - void Lexer::clear() { m_identifiers.clear(); @@ -1023,6 +961,9 @@ void Lexer::clear() m_buffer16.swap(newBuffer16); m_isReparsing = false; + + m_pattern = UString(); + m_flags = UString(); } SourceCode Lexer::sourceCode(int openBrace, int closeBrace, int firstLine) |