def _make_fre(checkerfn): if checkerfn == match_ANY_ALL: def fre(ctx, ptr, end, ppos): return end elif checkerfn == match_IN: install_jitdriver_spec('MatchIn', greens=['ppos', 'ctx.pattern'], reds=['ptr', 'end', 'ctx'], debugprint=(1, 0)) @specializectx def fre(ctx, ptr, end, ppos): while True: ctx.jitdriver_MatchIn.jit_merge_point(ctx=ctx, ptr=ptr, end=end, ppos=ppos) if ptr < end and checkerfn(ctx, ptr, ppos): ptr += 1 else: return ptr elif checkerfn == match_IN_IGNORE: install_jitdriver_spec('MatchInIgnore', greens=['ppos', 'ctx.pattern'], reds=['ptr', 'end', 'ctx'], debugprint=(1, 0)) @specializectx def fre(ctx, ptr, end, ppos): while True: ctx.jitdriver_MatchInIgnore.jit_merge_point(ctx=ctx, ptr=ptr, end=end, ppos=ppos) if ptr < end and checkerfn(ctx, ptr, ppos): ptr += 1 else: return ptr else: # in the other cases, the fre() function is not JITted at all # and is present as a residual call. @specializectx def fre(ctx, ptr, end, ppos): while ptr < end and checkerfn(ctx, ptr, ppos): ptr += 1 return ptr fre = func_with_new_name(fre, 'fre_' + checkerfn.__name__) return fre
reds=['start', 'ctx'], debugprint=(1, 0)) def regular_search(ctx, base): start = ctx.match_start while start <= ctx.end: ctx.jitdriver_RegularSearch.jit_merge_point(ctx=ctx, start=start, base=base) if sre_match(ctx, base, start, None) is not None: ctx.match_start = start return True start += 1 return False install_jitdriver_spec("LiteralSearch", greens=['base', 'character', 'ctx.pattern'], reds=['start', 'ctx'], debugprint=(2, 0, 1)) @specializectx def literal_search(ctx, base): # pattern starts with a literal character. this is used # for short prefixes, and if fast search is disabled character = ctx.pat(base + 1) base += 2 start = ctx.match_start while start < ctx.end: ctx.jitdriver_LiteralSearch.jit_merge_point(ctx=ctx, start=start, base=base, character=character) if ctx.str(start) == character: if sre_match(ctx, base, start + 1, None) is not None: ctx.match_start = start return True