RegExpRunStatus RegExpShared::execute(JSContext *cx, const jschar *chars, size_t length, size_t *lastIndex, MatchPairs &matches) { /* Protect inlined chars from root analysis poisoning. */ SkipRoot skip(cx, &chars); /* Compile the code at point-of-use. */ if (!compileIfNecessary(cx)) return RegExpRunStatus_Error; /* Ensure sufficient memory for output vector. */ if (!matches.initArray(pairCount())) 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 origLength = length; size_t start = *lastIndex; size_t displacement = 0; if (sticky()) { displacement = start; chars += displacement; length -= displacement; start = 0; } unsigned *outputBuf = matches.rawBuf(); unsigned result; #if ENABLE_YARR_JIT if (codeBlock.isFallBack()) result = JSC::Yarr::interpret(cx, bytecode, chars, length, start, outputBuf); else result = codeBlock.execute(chars, start, length, (int *)outputBuf).start; #else result = JSC::Yarr::interpret(cx, bytecode, chars, length, start, outputBuf); #endif if (result == JSC::Yarr::offsetNoMatch) return RegExpRunStatus_Success_NotFound; matches.displace(displacement); matches.checkAgainst(origLength); *lastIndex = matches[0].limit; return RegExpRunStatus_Success; }
RegExpRunStatus RegExpShared::execute(JSContext *cx, const jschar *chars, size_t length, size_t *lastIndex, MatchPairs &matches) { TraceLogger *logger = TraceLoggerForMainThread(cx->runtime()); { /* Compile the code at point-of-use. */ AutoTraceLog logCompile(logger, TraceLogger::YarrCompile); if (!compileIfNecessary(cx)) return RegExpRunStatus_Error; } /* Ensure sufficient memory for output vector. */ if (!matches.initArray(pairCount())) 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 origLength = length; size_t start = *lastIndex; size_t displacement = 0; if (sticky()) { displacement = start; chars += displacement; length -= displacement; start = 0; } unsigned *outputBuf = matches.rawBuf(); unsigned result; #if ENABLE_YARR_JIT if (codeBlock.isFallBack()) { AutoTraceLog logInterpret(logger, TraceLogger::YarrInterpret); result = JSC::Yarr::interpret(cx, bytecode, chars, length, start, outputBuf); } else { AutoTraceLog logJIT(logger, TraceLogger::YarrJIT); result = codeBlock.execute(chars, start, length, (int *)outputBuf).start; } #else { AutoTraceLog logInterpret(logger, TraceLogger::YarrInterpret); result = JSC::Yarr::interpret(cx, bytecode, chars, length, start, outputBuf); } #endif if (result == JSC::Yarr::offsetError) { reportYarrError(cx, nullptr, JSC::Yarr::RuntimeError); return RegExpRunStatus_Error; } if (result == JSC::Yarr::offsetNoMatch) return RegExpRunStatus_Success_NotFound; matches.displace(displacement); matches.checkAgainst(origLength); *lastIndex = matches[0].limit; return RegExpRunStatus_Success; }