# This test is run only when JIT support is available. It checks JIT complete
# and partial modes, and things that are different with JIT.

#pattern jitverify

# JIT does not support this pattern (callout at start of condition).

/(?(?C1)(?=a)a)/I

# Check that an infinite recursion loop is caught.

/(?(R)a*(?1)|((?R))b)/
    aaaabcde

/abcd/I
    abcd
    xyz

/(*NO_JIT)abcd/I
    abcd
    xyz

/abcd/
    abcd
    ab\=ps
    ab\=ph
    xyz

/abcd/jitfast
    abcd
    ab\=ps
    ab\=ph
    xyz

/abcd/jit=1
    abcd
    ab\=ps
    ab\=ph
    xyz
    xyz\=ps

/abcd/jit=1,jitfast
    abcd
    ab\=ps
    ab\=ph
    xyz
    xyz\=ps

/abcd/jit=2
    abcd
    ab\=ps
    ab\=ph
    xyz

/abcd/jit=2,jitfast
    abcd
    ab\=ps
    ab\=ph
    xyz

/abcd/jit=3
    abcd
    ab\=ps
    ab\=ph
    xyz

/abcd/jit=4
    abcd
    ab\=ps
    ab\=ph
    xyz

/abcd/jit=5
    abcd
    ab\=ps
    ab\=ph
    xyz

/abcd/jit=6
    abcd
    ab\=ps
    ab\=ph
    xyz

/abcd/jit=7
    abcd
    ab\=ps
    ab\=ph
    xyz

/abcd/I,jit=2

/(*NO_START_OPT)a(*:m)b/mark
    a

/^12345678abcd/m
    12345678abcd
    
# Limits tests that give different output with JIT. 

/(a+)*zz/I
  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazzbbbbbb\=find_limits
  aaaaaaaaaaaaaz\=find_limits

!((?:\s|//.*\\n|/[*](?:\\n|.)*?[*]/)*)!I
   /* this is a C style comment */\=find_limits

/^(?>a)++/
    aa\=find_limits
    aaaaaaaaa\=find_limits
    
/(a)(?1)++/
    aa\=find_limits
    aaaaaaaaa\=find_limits

/a(?:.)*?a/ims
    abbbbbbbbbbbbbbbbbbbbba\=find_limits
    
/a(?:.(*THEN))*?a/ims
    abbbbbbbbbbbbbbbbbbbbba\=find_limits

/a(?:.(*THEN:ABC))*?a/ims
    abbbbbbbbbbbbbbbbbbbbba\=find_limits

/^(?>a+)(?>b+)(?>c+)(?>d+)(?>e+)/
     aabbccddee\=find_limits

/^(?>(a+))(?>(b+))(?>(c+))(?>(d+))(?>(e+))/
     aabbccddee\=find_limits

/^(?>(a+))(?>b+)(?>(c+))(?>d+)(?>(e+))/
     aabbccddee\=find_limits

/^(?>(a+))(?>b+)(?>(c+))(?>d+)(?>(e+))/jitfast
     aabbccddee\=find_limits
     aabbccddee\=jitstack=1

/(a+)*zz/
    aaaaaaaaaaaaaz
    aaaaaaaaaaaaaz\=match_limit=3000

/(*LIMIT_MATCH=3000)(a+)*zz/I
    aaaaaaaaaaaaaz
    aaaaaaaaaaaaaz\=match_limit=60000

/(*LIMIT_MATCH=60000)(*LIMIT_MATCH=3000)(a+)*zz/I
    aaaaaaaaaaaaaz

/(*LIMIT_MATCH=60000)(a+)*zz/I
    aaaaaaaaaaaaaz
    aaaaaaaaaaaaaz\=match_limit=3000

# These three have infinitely nested recursions. 
    
/((?2))((?1))/
    abc

/((?(R2)a+|(?1)b))/
    aaaabcde

/(?(R)a*(?1)|((?R))b)/
    aaaabcde
    
# Invalid options disable JIT when called via pcre2_match(), causing the
# match to happen via the interpreter, but for fast JIT invalid options are
# ignored, so an unanchored match happens.

/abcd/
    abcd\=anchored
    fail abcd\=anchored 
    
/abcd/jitfast
    abcd\=anchored 
    succeed abcd\=anchored 
    
# Push/pop does not lose the JIT information, though jitverify applies only to
# compilation, but serializing (save/load) discards JIT data completely.

/^abc\Kdef/info,push
#pop jitverify
    abcdef

/^abc\Kdef/info,push
#save testsaved1
#load testsaved1
#pop jitverify
    abcdef
    
#load testsaved1
#pop jit,jitverify
    abcdef
    
# Test pattern compilation

/(?:a|b|c|d|e)(?R)/jit=1

/(?:a|b|c|d|e)(?R)(?R)/jit=1

/(a(?:a|b|c|d|e)b){8,16}/jit=1

# End of testinput16