예제 #1
0
def _make_fre(checkerfn):
    if checkerfn == match_ANY_ALL:

        def fre(ctx, pattern, ptr, end, ppos):
            return end
    elif checkerfn == match_IN:
        install_jitdriver_spec('MatchIn',
                               greens=['ppos', 'pattern'],
                               reds=['ptr', 'end', 'ctx'],
                               debugprint=(1, 0))

        @specializectx
        def fre(ctx, pattern, ptr, end, ppos):
            while True:
                ctx.jitdriver_MatchIn.jit_merge_point(ctx=ctx,
                                                      ptr=ptr,
                                                      end=end,
                                                      ppos=ppos,
                                                      pattern=pattern)
                if ptr < end and checkerfn(ctx, pattern, ptr, ppos):
                    ptr += 1
                else:
                    return ptr
    elif checkerfn == match_IN_IGNORE:
        install_jitdriver_spec('MatchInIgnore',
                               greens=['ppos', 'pattern'],
                               reds=['ptr', 'end', 'ctx'],
                               debugprint=(1, 0))

        @specializectx
        def fre(ctx, pattern, ptr, end, ppos):
            while True:
                ctx.jitdriver_MatchInIgnore.jit_merge_point(ctx=ctx,
                                                            ptr=ptr,
                                                            end=end,
                                                            ppos=ppos,
                                                            pattern=pattern)
                if ptr < end and checkerfn(ctx, pattern, 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, pattern, ptr, end, ppos):
            while ptr < end and checkerfn(ctx, pattern, ptr, ppos):
                ptr += 1
            return ptr

    fre = func_with_new_name(fre, 'fre_' + checkerfn.__name__)
    return fre
예제 #2
0
파일: rsre_core.py 프로젝트: mozillazg/pypy
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
예제 #3
0
def regular_search(ctx, pattern, base):
    start = ctx.match_start
    while start <= ctx.end:
        ctx.jitdriver_RegularSearch.jit_merge_point(ctx=ctx,
                                                    start=start,
                                                    base=base,
                                                    pattern=pattern)
        if sre_match(ctx, pattern, base, start, None) is not None:
            ctx.match_start = start
            return True
        start += 1
    return False


install_jitdriver_spec("LiteralSearch",
                       greens=['base', 'character', 'pattern'],
                       reds=['start', 'ctx'],
                       debugprint=(2, 0, 1))


@specializectx
def literal_search(ctx, pattern, base):
    # pattern starts with a literal character.  this is used
    # for short prefixes, and if fast search is disabled
    character = pattern.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,
예제 #4
0
파일: rsre_core.py 프로젝트: charred/pypy
                  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
예제 #5
0
파일: rsre_core.py 프로젝트: mozillazg/pypy
install_jitdriver("RegularSearch", greens=["base", "ctx.pattern"], 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