RegExpRunStatus RegExpShared::execute(JSContext *cx, const jschar *chars, size_t length, size_t *lastIndex, MatchPairs **output) { const size_t origLength = length; size_t backingPairCount = RegExpCode::getOutputSize(pairCount()); LifoAlloc &alloc = cx->tempLifoAlloc(); MatchPairs *matchPairs = MatchPairs::create(alloc, pairCount(), backingPairCount); if (!matchPairs) return RegExpRunStatus_Error; /* * |displacement| emulates sticky mode by matching from this offset * into the char buffer and subtracting the delta off at the end. */ size_t start = *lastIndex; size_t displacement = 0; if (sticky()) { displacement = *lastIndex; chars += displacement; length -= displacement; start = 0; } RegExpRunStatus status = code.execute(cx, chars, length, start, matchPairs->buffer(), backingPairCount); switch (status) { case RegExpRunStatus_Error: return status; case RegExpRunStatus_Success_NotFound: *output = matchPairs; return status; default: JS_ASSERT(status == RegExpRunStatus_Success); } matchPairs->displace(displacement); matchPairs->checkAgainst(origLength); *lastIndex = matchPairs->pair(0).limit; *output = matchPairs; return RegExpRunStatus_Success; }