void SegmentedString::advanceAndUpdateLineNumberSlowCase() { if (m_pushedChar1) { m_pushedChar1 = m_pushedChar2; m_pushedChar2 = 0; if (m_pushedChar1) { m_currentChar = m_pushedChar1; return; } updateAdvanceFunctionPointers(); } else if (m_currentString.m_length) { if (m_currentString.getCurrentChar() == '\n' && m_currentString.doNotExcludeLineNumbers()) { ++m_currentLine; // Plus 1 because numberOfCharactersConsumed value hasn't incremented yet; it does with m_length decrement below. m_numberOfCharactersConsumedPriorToCurrentLine = numberOfCharactersConsumed() + 1; } if (--m_currentString.m_length == 0) advanceSubstring(); else m_currentString.incrementAndGetCurrentChar(); // Only need the ++ } else if (!isComposite()) { m_currentString.clear(); m_empty = true; m_fastPathFlags = NoFastPath; m_advanceFunc = &SegmentedString::advanceEmpty; m_advanceAndUpdateLineNumberFunc = &SegmentedString::advanceEmpty; } m_currentChar = m_currentString.m_length ? m_currentString.getCurrentChar() : 0; }
void SegmentedString::advanceAndUpdateLineNumberSlowCase() { if (m_currentString.length()) { if (m_currentString.getCurrentChar() == '\n' && m_currentString.doNotExcludeLineNumbers()) { ++m_currentLine; // Plus 1 because numberOfCharactersConsumed value hasn't incremented yet; // it does with length() decrement below. m_numberOfCharactersConsumedPriorToCurrentLine = numberOfCharactersConsumed() + 1; } m_currentString.decrementLength(); if (!m_currentString.length()) advanceSubstring(); else m_currentString.incrementAndGetCurrentChar(); // Only need the ++ } else if (!isComposite()) { m_currentString.clear(); m_empty = true; m_fastPathFlags = NoFastPath; m_advanceFunc = &SegmentedString::advanceEmpty; m_advanceAndUpdateLineNumberFunc = &SegmentedString::advanceEmpty; } m_currentChar = m_currentString.length() ? m_currentString.getCurrentChar() : 0; }
void SegmentedString::setCurrentPosition(OrdinalNumber line, OrdinalNumber columnAftreProlog, int prologLength) { m_currentLine = line.zeroBasedInt(); m_numberOfCharactersConsumedPriorToCurrentLine = numberOfCharactersConsumed() + prologLength - columnAftreProlog.zeroBasedInt(); }
void SegmentedString::advanceAndUpdateLineNumber16() { ASSERT(m_currentString.getCurrentChar() == m_currentChar); if (m_currentChar == '\n') { ++m_currentLine; m_numberOfCharactersConsumedPriorToCurrentLine = numberOfCharactersConsumed() + 1; } decrementAndCheckLength(); m_currentChar = m_currentString.incrementAndGetCurrentChar16(); }
void SegmentedString::advanceSlowCase(int& lineNumber) { if (m_pushedChar1) { m_pushedChar1 = m_pushedChar2; m_pushedChar2 = 0; } else if (m_currentString.m_current) { if (*m_currentString.m_current++ == '\n' && m_currentString.doNotExcludeLineNumbers()) { ++lineNumber; ++m_currentLine; // Plus 1 because numberOfCharactersConsumed value hasn't incremented yet; it does with m_length decrement below. m_numberOfCharactersConsumedPriorToCurrentLine = numberOfCharactersConsumed() + 1; } if (--m_currentString.m_length == 0) advanceSubstring(); } m_currentChar = m_pushedChar1 ? &m_pushedChar1 : m_currentString.m_current; }
void SegmentedString::pushBack(String&& string) { // We never create a substring for an empty string. ASSERT(string.length()); // The new substring we will create won't have the doNotExcludeLineNumbers set appropriately. // That was lost when the characters were consumed before pushing them back. But this does // not matter, because clients never use this for newlines. Catch that with this assertion. ASSERT(!string.contains('\n')); // The characters in the string must be previously consumed characters from this segmented string. ASSERT(string.length() <= numberOfCharactersConsumed()); m_numberOfCharactersConsumedPriorToCurrentSubstring += m_currentSubstring.numberOfCharactersConsumed(); if (m_currentSubstring.length) m_otherSubstrings.prepend(WTFMove(m_currentSubstring)); m_currentSubstring = WTFMove(string); m_numberOfCharactersConsumedPriorToCurrentSubstring -= m_currentSubstring.length; m_currentCharacter = m_currentSubstring.currentCharacter(); updateAdvanceFunctionPointers(); }
OrdinalNumber SegmentedString::currentColumn() const { int zeroBasedColumn = numberOfCharactersConsumed() - m_numberOfCharactersConsumedPriorToCurrentLine; return OrdinalNumber::fromZeroBasedInt(zeroBasedColumn); }