int RegExp::match(const UString& s, int i, OwnArrayPtr<int>* ovector) { if (i < 0) i = 0; if (ovector) ovector->clear(); if (i > s.size() || s.isNull()) return -1; #if ENABLE(WREC) if (m_wrecFunction) { int offsetVectorSize = (m_numSubpatterns + 1) * 2; int* offsetVector = new int [offsetVectorSize]; for (int j = 0; j < offsetVectorSize; ++j) offsetVector[j] = -1; OwnArrayPtr<int> nonReturnedOvector; if (!ovector) nonReturnedOvector.set(offsetVector); else ovector->set(offsetVector); int result = reinterpret_cast<WRECFunction>(m_wrecFunction)(s.data(), i, s.size(), offsetVector); if (result < 0) { #ifndef NDEBUG // TODO: define up a symbol, rather than magic -1 if (result != -1) fprintf(stderr, "jsRegExpExecute failed with result %d\n", result); #endif if (ovector) ovector->clear(); } return result; } else #endif if (m_regExp) { // Set up the offset vector for the result. // First 2/3 used for result, the last third used by PCRE. int* offsetVector; int offsetVectorSize; int fixedSizeOffsetVector[3]; if (!ovector) { offsetVectorSize = 3; offsetVector = fixedSizeOffsetVector; } else { offsetVectorSize = (m_numSubpatterns + 1) * 3; offsetVector = new int [offsetVectorSize]; ovector->set(offsetVector); } int numMatches = jsRegExpExecute(m_regExp, reinterpret_cast<const UChar*>(s.data()), s.size(), i, offsetVector, offsetVectorSize); if (numMatches < 0) { #ifndef NDEBUG if (numMatches != JSRegExpErrorNoMatch) fprintf(stderr, "jsRegExpExecute failed with result %d\n", numMatches); #endif if (ovector) ovector->clear(); return -1; } return offsetVector[0]; } return -1; }
int RegExp::match(const UString& s, int startOffset, OwnArrayPtr<int>* ovector) { if (startOffset < 0) startOffset = 0; if (ovector) ovector->clear(); if (startOffset > s.size() || s.isNull()) return -1; #if ENABLE(YARR_JIT) if (m_regExpJITCode.m_jitCode) { #else if (m_regExpBytecode) { #endif int offsetVectorSize = (m_numSubpatterns + 1) * 3; // FIXME: should be 2 - but adding temporary fallback to pcre. int* offsetVector = new int [offsetVectorSize]; ASSERT(offsetVector); for (int j = 0; j < offsetVectorSize; ++j) offsetVector[j] = -1; OwnArrayPtr<int> nonReturnedOvector; if (!ovector) nonReturnedOvector.set(offsetVector); else ovector->set(offsetVector); #if ENABLE(YARR_JIT) int result = Yarr::executeRegex(m_regExpJITCode, s.data(), startOffset, s.size(), offsetVector, offsetVectorSize); #else int result = Yarr::interpretRegex(m_regExpBytecode.get(), s.data(), startOffset, s.size(), offsetVector); #endif if (result < 0) { #ifndef NDEBUG // TODO: define up a symbol, rather than magic -1 if (result != -1) fprintf(stderr, "jsRegExpExecute failed with result %d\n", result); #endif if (ovector) ovector->clear(); } return result; } return -1; } #else void RegExp::compile(JSGlobalData* globalData) { m_regExp = 0; #if ENABLE(WREC) m_wrecFunction = Generator::compileRegExp(globalData, m_pattern, &m_numSubpatterns, &m_constructionError, m_executablePool, ignoreCase(), multiline()); if (m_wrecFunction || m_constructionError) return; // Fall through to non-WREC case. #else UNUSED_PARAM(globalData); #endif JSRegExpIgnoreCaseOption ignoreCaseOption = ignoreCase() ? JSRegExpIgnoreCase : JSRegExpDoNotIgnoreCase; JSRegExpMultilineOption multilineOption = multiline() ? JSRegExpMultiline : JSRegExpSingleLine; m_regExp = jsRegExpCompile(reinterpret_cast<const UChar*>(m_pattern.data()), m_pattern.size(), ignoreCaseOption, multilineOption, &m_numSubpatterns, &m_constructionError); }