本文整理汇总了C++中MatchPair::displace方法的典型用法代码示例。如果您正苦于以下问题:C++ MatchPair::displace方法的具体用法?C++ MatchPair::displace怎么用?C++ MatchPair::displace使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类MatchPair
的用法示例。
在下文中一共展示了MatchPair::displace方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: logJIT
RegExpRunStatus
RegExpShared::executeMatchOnly(JSContext *cx, const jschar *chars, size_t length,
size_t *lastIndex, MatchPair &match)
{
TraceLogger *logger = js::TraceLoggerForMainThread(cx->runtime());
/* Compile the code at point-of-use. */
if (!compileMatchOnlyIfNecessary(cx))
return RegExpRunStatus_Error;
#ifdef DEBUG
const size_t origLength = length;
#endif
size_t start = *lastIndex;
size_t displacement = 0;
if (sticky()) {
displacement = start;
chars += displacement;
length -= displacement;
start = 0;
}
if (canStringMatch) {
int res = StringFindPattern(chars+start, length-start, source->chars(), source->length());
if (res == -1)
return RegExpRunStatus_Success_NotFound;
match = MatchPair(res + start, res + start + source->length());
match.displace(displacement);
*lastIndex = match.limit;
return RegExpRunStatus_Success;
}
#ifdef JS_ION
if (!codeBlock.isFallBack()) {
AutoTraceLog logJIT(logger, TraceLogger::YarrJIT);
MatchResult result = codeBlock.execute(chars, start, length);
if (!result)
return RegExpRunStatus_Success_NotFound;
match = MatchPair(result.start, result.end);
match.displace(displacement);
*lastIndex = match.limit;
return RegExpRunStatus_Success;
}
#endif
/*
* The JIT could not be used, so fall back to the Yarr interpreter.
* Unfortunately, the interpreter does not have a MatchOnly mode, so a
* temporary output vector must be provided.
*/
JS_ASSERT(hasBytecode());
ScopedMatchPairs matches(&cx->tempLifoAlloc());
if (!matches.initArray(pairCount()))
return RegExpRunStatus_Error;
unsigned result;
{
AutoTraceLog logInterpret(logger, TraceLogger::YarrInterpret);
result = JSC::Yarr::interpret(cx, bytecode, chars, length, start, (unsigned *) matches.pairsRaw());
}
if (result == JSC::Yarr::offsetError) {
reportYarrError(cx, nullptr, JSC::Yarr::RuntimeError);
return RegExpRunStatus_Error;
}
if (result == JSC::Yarr::offsetNoMatch)
return RegExpRunStatus_Success_NotFound;
match = MatchPair(result, matches[0].limit);
match.displace(displacement);
#ifdef DEBUG
matches.displace(displacement);
matches.checkAgainst(origLength);
#endif
*lastIndex = match.limit;
return RegExpRunStatus_Success;
}