| 170 |
struct jump_list *next; |
struct jump_list *next; |
| 171 |
} jump_list; |
} jump_list; |
| 172 |
|
|
| 173 |
enum stub_types { stack_alloc, max_index }; |
enum stub_types { stack_alloc }; |
| 174 |
|
|
| 175 |
typedef struct stub_list { |
typedef struct stub_list { |
| 176 |
enum stub_types type; |
enum stub_types type; |
| 328 |
|
|
| 329 |
enum { |
enum { |
| 330 |
frame_end = 0, |
frame_end = 0, |
| 331 |
frame_setmaxindex = -1, |
frame_setstrbegin = -1 |
|
frame_setstrbegin = -2 |
|
| 332 |
}; |
}; |
| 333 |
|
|
| 334 |
/* Used for accessing the elements of the stack. */ |
/* Used for accessing the elements of the stack. */ |
| 356 |
#define LOCALS_HEAD (4 * sizeof(sljit_w)) |
#define LOCALS_HEAD (4 * sizeof(sljit_w)) |
| 357 |
/* Head of the last recursion. */ |
/* Head of the last recursion. */ |
| 358 |
#define RECURSIVE_HEAD (5 * sizeof(sljit_w)) |
#define RECURSIVE_HEAD (5 * sizeof(sljit_w)) |
|
/* Number of recursions. */ |
|
|
#define MAX_INDEX (6 * sizeof(sljit_w)) |
|
| 359 |
/* Max limit of recursions. */ |
/* Max limit of recursions. */ |
| 360 |
#define CALL_LIMIT (7 * sizeof(sljit_w)) |
#define CALL_LIMIT (7 * sizeof(sljit_w)) |
| 361 |
/* Last known position of the requested byte. */ |
/* Last known position of the requested byte. */ |
| 697 |
int length = 0; |
int length = 0; |
| 698 |
BOOL possessive = FALSE; |
BOOL possessive = FALSE; |
| 699 |
BOOL needs_frame = FALSE; |
BOOL needs_frame = FALSE; |
|
BOOL needs_maxindex = FALSE; |
|
| 700 |
BOOL setsom_found = FALSE; |
BOOL setsom_found = FALSE; |
| 701 |
|
|
| 702 |
if (!recursive && (*cc == OP_CBRAPOS || *cc == OP_SCBRAPOS)) |
if (!recursive && (*cc == OP_CBRAPOS || *cc == OP_SCBRAPOS)) |
| 703 |
{ |
{ |
| 704 |
length = 3 + 2; |
length = 3; |
|
needs_maxindex = TRUE; |
|
| 705 |
possessive = TRUE; |
possessive = TRUE; |
| 706 |
} |
} |
| 707 |
|
|
| 746 |
case OP_CBRAPOS: |
case OP_CBRAPOS: |
| 747 |
case OP_SCBRA: |
case OP_SCBRA: |
| 748 |
case OP_SCBRAPOS: |
case OP_SCBRAPOS: |
|
if (!needs_maxindex) |
|
|
{ |
|
|
needs_maxindex = TRUE; |
|
|
length += 2; |
|
|
} |
|
| 749 |
length += 3; |
length += 3; |
| 750 |
cc += 1 + LINK_SIZE + 2; |
cc += 1 + LINK_SIZE + 2; |
| 751 |
break; |
break; |
| 770 |
/* TMP2 must contain STACK_TOP - (-STACK(stackpos)) */ |
/* TMP2 must contain STACK_TOP - (-STACK(stackpos)) */ |
| 771 |
DEFINE_COMPILER; |
DEFINE_COMPILER; |
| 772 |
uschar *ccend = bracketend(cc); |
uschar *ccend = bracketend(cc); |
|
BOOL needs_maxindex = FALSE; |
|
| 773 |
BOOL setsom_found = FALSE; |
BOOL setsom_found = FALSE; |
| 774 |
int offset; |
int offset; |
| 775 |
|
|
| 816 |
case OP_CBRAPOS: |
case OP_CBRAPOS: |
| 817 |
case OP_SCBRA: |
case OP_SCBRA: |
| 818 |
case OP_SCBRAPOS: |
case OP_SCBRAPOS: |
|
if (!needs_maxindex) |
|
|
{ |
|
|
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), MAX_INDEX); |
|
|
OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, frame_setmaxindex); |
|
|
stackpos += (int)sizeof(sljit_w); |
|
|
OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP1, 0); |
|
|
stackpos += (int)sizeof(sljit_w); |
|
|
needs_maxindex = TRUE; |
|
|
} |
|
| 819 |
offset = (GET2(cc, 1 + LINK_SIZE)) << 1; |
offset = (GET2(cc, 1 + LINK_SIZE)) << 1; |
| 820 |
OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, OVECTOR(offset)); |
OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, OVECTOR(offset)); |
| 821 |
stackpos += (int)sizeof(sljit_w); |
stackpos += (int)sizeof(sljit_w); |
| 1151 |
case stack_alloc: |
case stack_alloc: |
| 1152 |
add_jump(compiler, &common->stackalloc, JUMP(SLJIT_FAST_CALL)); |
add_jump(compiler, &common->stackalloc, JUMP(SLJIT_FAST_CALL)); |
| 1153 |
break; |
break; |
|
|
|
|
case max_index: |
|
|
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), MAX_INDEX, SLJIT_IMM, list_item->data); |
|
|
break; |
|
| 1154 |
} |
} |
| 1155 |
JUMPTO(SLJIT_JUMP, list_item->leave); |
JUMPTO(SLJIT_JUMP, list_item->leave); |
| 1156 |
list_item = list_item->next; |
list_item = list_item->next; |
| 1195 |
int i; |
int i; |
| 1196 |
/* At this point we can freely use all temporary registers. */ |
/* At this point we can freely use all temporary registers. */ |
| 1197 |
/* TMP1 returns with begin - 1. */ |
/* TMP1 returns with begin - 1. */ |
|
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), MAX_INDEX, SLJIT_IMM, 1); |
|
| 1198 |
OP2(SLJIT_SUB, SLJIT_TEMPORARY_REG1, 0, SLJIT_MEM1(SLJIT_GENERAL_REG1), SLJIT_OFFSETOF(jit_arguments, begin), SLJIT_IMM, 1); |
OP2(SLJIT_SUB, SLJIT_TEMPORARY_REG1, 0, SLJIT_MEM1(SLJIT_GENERAL_REG1), SLJIT_OFFSETOF(jit_arguments, begin), SLJIT_IMM, 1); |
| 1199 |
if (length < 8) |
if (length < 8) |
| 1200 |
{ |
{ |
| 1212 |
} |
} |
| 1213 |
} |
} |
| 1214 |
|
|
| 1215 |
static SLJIT_INLINE void copy_ovector(compiler_common *common) |
static SLJIT_INLINE void copy_ovector(compiler_common *common, int topbracket) |
| 1216 |
{ |
{ |
| 1217 |
DEFINE_COMPILER; |
DEFINE_COMPILER; |
| 1218 |
struct sljit_label *loop; |
struct sljit_label *loop; |
| 1219 |
struct sljit_jump *earlyexit; |
struct sljit_jump *earlyexit; |
| 1220 |
|
|
| 1221 |
/* At this point we can freely use all registers. */ |
/* At this point we can freely use all registers. */ |
| 1222 |
|
OP1(SLJIT_MOV, SLJIT_GENERAL_REG3, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(1)); |
| 1223 |
|
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(1), STR_PTR, 0); |
| 1224 |
|
|
| 1225 |
OP1(SLJIT_MOV, SLJIT_TEMPORARY_REG1, 0, ARGUMENTS, 0); |
OP1(SLJIT_MOV, SLJIT_TEMPORARY_REG1, 0, ARGUMENTS, 0); |
| 1226 |
OP1(SLJIT_MOV_SI, SLJIT_TEMPORARY_REG2, 0, SLJIT_MEM1(SLJIT_TEMPORARY_REG1), SLJIT_OFFSETOF(jit_arguments, offsetcount)); |
OP1(SLJIT_MOV_SI, SLJIT_TEMPORARY_REG2, 0, SLJIT_MEM1(SLJIT_TEMPORARY_REG1), SLJIT_OFFSETOF(jit_arguments, offsetcount)); |
| 1227 |
OP2(SLJIT_SUB, SLJIT_TEMPORARY_REG3, 0, SLJIT_MEM1(SLJIT_TEMPORARY_REG1), SLJIT_OFFSETOF(jit_arguments, offsets), SLJIT_IMM, sizeof(int)); |
OP2(SLJIT_SUB, SLJIT_TEMPORARY_REG3, 0, SLJIT_MEM1(SLJIT_TEMPORARY_REG1), SLJIT_OFFSETOF(jit_arguments, offsets), SLJIT_IMM, sizeof(int)); |
| 1237 |
OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_TEMPORARY_REG2, 0, SLJIT_TEMPORARY_REG2, 0, SLJIT_IMM, 1); |
OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_TEMPORARY_REG2, 0, SLJIT_TEMPORARY_REG2, 0, SLJIT_IMM, 1); |
| 1238 |
JUMPTO(SLJIT_C_NOT_ZERO, loop); |
JUMPTO(SLJIT_C_NOT_ZERO, loop); |
| 1239 |
JUMPHERE(earlyexit); |
JUMPHERE(earlyexit); |
| 1240 |
|
|
| 1241 |
|
/* Calculate the return value, which is the maximum ovector value. */ |
| 1242 |
|
if (topbracket > 1) |
| 1243 |
|
{ |
| 1244 |
|
OP2(SLJIT_ADD, SLJIT_TEMPORARY_REG1, 0, SLJIT_LOCALS_REG, 0, SLJIT_IMM, OVECTOR_START + topbracket * 2 * sizeof(sljit_w)); |
| 1245 |
|
OP1(SLJIT_MOV, SLJIT_TEMPORARY_REG2, 0, SLJIT_IMM, topbracket + 1); |
| 1246 |
|
|
| 1247 |
|
/* OVECTOR(0) is never equal to SLJIT_GENERAL_REG3. */ |
| 1248 |
|
loop = LABEL(); |
| 1249 |
|
OP1(SLJIT_MOVU, SLJIT_TEMPORARY_REG3, 0, SLJIT_MEM1(SLJIT_TEMPORARY_REG1), -(2 * sizeof(sljit_w))); |
| 1250 |
|
OP2(SLJIT_SUB, SLJIT_TEMPORARY_REG2, 0, SLJIT_TEMPORARY_REG2, 0, SLJIT_IMM, 1); |
| 1251 |
|
CMPTO(SLJIT_C_EQUAL, SLJIT_TEMPORARY_REG3, 0, SLJIT_GENERAL_REG3, 0, loop); |
| 1252 |
|
OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_TEMPORARY_REG2, 0); |
| 1253 |
|
} |
| 1254 |
|
else |
| 1255 |
|
OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, 1); |
| 1256 |
} |
} |
| 1257 |
|
|
| 1258 |
static SLJIT_INLINE BOOL char_has_othercase(compiler_common *common, uschar* cc) |
static SLJIT_INLINE BOOL char_has_othercase(compiler_common *common, uschar* cc) |
| 1994 |
sljit_emit_fast_return(compiler, RETURN_ADDR, 0); |
sljit_emit_fast_return(compiler, RETURN_ADDR, 0); |
| 1995 |
|
|
| 1996 |
JUMPHERE(jump); |
JUMPHERE(jump); |
|
jump = CMP(SLJIT_C_NOT_EQUAL, TMP2, 0, SLJIT_IMM, frame_setmaxindex); |
|
|
/* Set max index. */ |
|
|
OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), sizeof(sljit_w)); |
|
|
OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 2 * sizeof(sljit_w)); |
|
|
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), MAX_INDEX, TMP2, 0); |
|
|
JUMPTO(SLJIT_JUMP, mainloop); |
|
|
|
|
|
JUMPHERE(jump); |
|
| 1997 |
jump = CMP(SLJIT_C_NOT_EQUAL, TMP2, 0, SLJIT_IMM, frame_setstrbegin); |
jump = CMP(SLJIT_C_NOT_EQUAL, TMP2, 0, SLJIT_IMM, frame_setstrbegin); |
| 1998 |
/* Set max index. */ |
/* Set string begin. */ |
| 1999 |
OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), sizeof(sljit_w)); |
OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), sizeof(sljit_w)); |
| 2000 |
OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 2 * sizeof(sljit_w)); |
OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 2 * sizeof(sljit_w)); |
| 2001 |
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(0), TMP2, 0); |
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(0), TMP2, 0); |
| 3833 |
A - Push the current STR_PTR. Needed for restoring the STR_PTR |
A - Push the current STR_PTR. Needed for restoring the STR_PTR |
| 3834 |
before the next alternative. Not pushed if there are no alternatives. |
before the next alternative. Not pushed if there are no alternatives. |
| 3835 |
M - Any values pushed by the current alternative. Can be empty, or anything. |
M - Any values pushed by the current alternative. Can be empty, or anything. |
| 3836 |
C - Push the previous OVECTOR(i), OVECTOR(i+1), MAX_INDEX and OVECTOR_PRIV(i) to the stack. |
C - Push the previous OVECTOR(i), OVECTOR(i+1) and OVECTOR_PRIV(i) to the stack. |
| 3837 |
L - Push the previous local (pointed by localptr) to the stack |
L - Push the previous local (pointed by localptr) to the stack |
| 3838 |
() - opional values stored on the stack |
() - opional values stored on the stack |
| 3839 |
()* - optonal, can be stored multiple times |
()* - optonal, can be stored multiple times |
| 4060 |
else if (opcode == OP_CBRA || opcode == OP_SCBRA) |
else if (opcode == OP_CBRA || opcode == OP_SCBRA) |
| 4061 |
{ |
{ |
| 4062 |
/* Saving the previous values. */ |
/* Saving the previous values. */ |
| 4063 |
allocate_stack(common, 4); |
allocate_stack(common, 3); |
| 4064 |
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset)); |
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset)); |
| 4065 |
OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset + 1)); |
OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset + 1)); |
| 4066 |
OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP1, 0); |
OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP1, 0); |
| 4067 |
OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP2, 0); |
OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP2, 0); |
| 4068 |
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), MAX_INDEX); |
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr); |
|
OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr); |
|
| 4069 |
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, STR_PTR, 0); |
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, STR_PTR, 0); |
| 4070 |
OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(2), TMP1, 0); |
OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(2), TMP1, 0); |
|
OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(3), TMP2, 0); |
|
|
/* Update MAX_INDEX if necessary. */ |
|
|
add_stub(common, max_index, (offset >> 1) + 1, CMP(SLJIT_C_LESS, TMP1, 0, SLJIT_IMM, (offset >> 1) + 1)); |
|
| 4071 |
} |
} |
| 4072 |
else if (opcode == OP_SBRA || opcode == OP_SCOND) |
else if (opcode == OP_SBRA || opcode == OP_SCOND) |
| 4073 |
{ |
{ |
| 4276 |
FALLBACK_AS(bracketpos_fallback)->framesize = framesize; |
FALLBACK_AS(bracketpos_fallback)->framesize = framesize; |
| 4277 |
if (framesize < 0) |
if (framesize < 0) |
| 4278 |
{ |
{ |
| 4279 |
stacksize = (opcode == OP_CBRAPOS || opcode == OP_SCBRAPOS) ? 3 : 1; |
stacksize = (opcode == OP_CBRAPOS || opcode == OP_SCBRAPOS) ? 2 : 1; |
| 4280 |
if (!zero) |
if (!zero) |
| 4281 |
stacksize++; |
stacksize++; |
| 4282 |
FALLBACK_AS(bracketpos_fallback)->stacksize = stacksize; |
FALLBACK_AS(bracketpos_fallback)->stacksize = stacksize; |
| 4288 |
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset)); |
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset)); |
| 4289 |
OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset + 1)); |
OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset + 1)); |
| 4290 |
OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP1, 0); |
OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP1, 0); |
|
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), MAX_INDEX); |
|
| 4291 |
OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP2, 0); |
OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP2, 0); |
|
OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(2), TMP1, 0); |
|
| 4292 |
} |
} |
| 4293 |
else |
else |
| 4294 |
OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); |
OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); |
| 4345 |
if (opcode == OP_CBRAPOS || opcode == OP_SCBRAPOS) |
if (opcode == OP_CBRAPOS || opcode == OP_SCBRAPOS) |
| 4346 |
{ |
{ |
| 4347 |
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), cbraprivptr); |
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), cbraprivptr); |
|
OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), MAX_INDEX); |
|
| 4348 |
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset + 1), STR_PTR, 0); |
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset + 1), STR_PTR, 0); |
|
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset), TMP1, 0); |
|
|
add_stub(common, max_index, (offset >> 1) + 1, CMP(SLJIT_C_LESS, TMP2, 0, SLJIT_IMM, (offset >> 1) + 1)); |
|
| 4349 |
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), cbraprivptr, STR_PTR, 0); |
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), cbraprivptr, STR_PTR, 0); |
| 4350 |
|
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset), TMP1, 0); |
| 4351 |
} |
} |
| 4352 |
else |
else |
| 4353 |
{ |
{ |
| 4367 |
if (opcode == OP_CBRAPOS || opcode == OP_SCBRAPOS) |
if (opcode == OP_CBRAPOS || opcode == OP_SCBRAPOS) |
| 4368 |
{ |
{ |
| 4369 |
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), cbraprivptr); |
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), cbraprivptr); |
|
OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), MAX_INDEX); |
|
|
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset + 1), STR_PTR, 0); |
|
|
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset), TMP1, 0); |
|
|
add_stub(common, max_index, (offset >> 1) + 1, CMP(SLJIT_C_LESS, TMP2, 0, SLJIT_IMM, (offset >> 1) + 1)); |
|
| 4370 |
if (!zero) |
if (!zero) |
| 4371 |
OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr); |
OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr); |
| 4372 |
|
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset + 1), STR_PTR, 0); |
| 4373 |
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), cbraprivptr, STR_PTR, 0); |
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), cbraprivptr, STR_PTR, 0); |
| 4374 |
|
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset), TMP1, 0); |
| 4375 |
} |
} |
| 4376 |
else |
else |
| 4377 |
{ |
{ |
| 4751 |
static SLJIT_INLINE uschar *compile_close_hotpath(compiler_common *common, uschar *cc) |
static SLJIT_INLINE uschar *compile_close_hotpath(compiler_common *common, uschar *cc) |
| 4752 |
{ |
{ |
| 4753 |
DEFINE_COMPILER; |
DEFINE_COMPILER; |
|
struct sljit_jump *jump; |
|
| 4754 |
int offset = GET2(cc, 1); |
int offset = GET2(cc, 1); |
| 4755 |
|
|
| 4756 |
/* Data will be discarded anyway... */ |
/* Data will be discarded anyway... */ |
| 4758 |
return cc + 3; |
return cc + 3; |
| 4759 |
|
|
| 4760 |
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR_PRIV(offset)); |
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR_PRIV(offset)); |
|
OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), MAX_INDEX); |
|
| 4761 |
offset <<= 1; |
offset <<= 1; |
| 4762 |
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset + 1), STR_PTR, 0); |
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset + 1), STR_PTR, 0); |
| 4763 |
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset), TMP1, 0); |
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset), TMP1, 0); |
|
offset = (offset >> 1) + 1; |
|
|
jump = CMP(SLJIT_C_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, offset); |
|
|
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), MAX_INDEX, SLJIT_IMM, offset); |
|
|
JUMPHERE(jump); |
|
| 4764 |
return cc + 3; |
return cc + 3; |
| 4765 |
} |
} |
| 4766 |
|
|
| 5527 |
OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(1)); |
OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(1)); |
| 5528 |
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset), TMP1, 0); |
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset), TMP1, 0); |
| 5529 |
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset + 1), TMP2, 0); |
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset + 1), TMP2, 0); |
| 5530 |
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(2)); |
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, SLJIT_MEM1(STACK_TOP), STACK(2)); |
| 5531 |
OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(3)); |
free_stack(common, 3); |
|
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), MAX_INDEX, TMP1, 0); |
|
|
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, TMP2, 0); |
|
|
free_stack(common, 4); |
|
| 5532 |
} |
} |
| 5533 |
else if (opcode == OP_SBRA || opcode == OP_SCOND) |
else if (opcode == OP_SBRA || opcode == OP_SCOND) |
| 5534 |
{ |
{ |
| 5616 |
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); |
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); |
| 5617 |
OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(1)); |
OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(1)); |
| 5618 |
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset), TMP1, 0); |
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset), TMP1, 0); |
|
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(2)); |
|
| 5619 |
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset + 1), TMP2, 0); |
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset + 1), TMP2, 0); |
|
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), MAX_INDEX, TMP1, 0); |
|
| 5620 |
} |
} |
| 5621 |
set_jumps(current->topfallbacks, LABEL()); |
set_jumps(current->topfallbacks, LABEL()); |
| 5622 |
free_stack(common, CURRENT_AS(bracketpos_fallback)->stacksize); |
free_stack(common, CURRENT_AS(bracketpos_fallback)->stacksize); |
| 6077 |
set_jumps(common->accept, common->acceptlabel); |
set_jumps(common->accept, common->acceptlabel); |
| 6078 |
|
|
| 6079 |
/* This means we have a match. Update the ovector. */ |
/* This means we have a match. Update the ovector. */ |
| 6080 |
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(1), STR_PTR, 0); |
copy_ovector(common, re->top_bracket + 1); |
|
|
|
| 6081 |
leave = LABEL(); |
leave = LABEL(); |
|
copy_ovector(common); |
|
|
OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), MAX_INDEX); |
|
| 6082 |
sljit_emit_return(compiler, SLJIT_UNUSED, 0); |
sljit_emit_return(compiler, SLJIT_UNUSED, 0); |
| 6083 |
|
|
| 6084 |
empty_match_fallback = LABEL(); |
empty_match_fallback = LABEL(); |
| 6127 |
JUMPHERE(reqbyte_notfound); |
JUMPHERE(reqbyte_notfound); |
| 6128 |
/* Copy OVECTOR(1) to OVECTOR(0) */ |
/* Copy OVECTOR(1) to OVECTOR(0) */ |
| 6129 |
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(0), SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(1)); |
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(0), SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(1)); |
| 6130 |
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), MAX_INDEX, SLJIT_IMM, PCRE_ERROR_NOMATCH); |
OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE_ERROR_NOMATCH); |
| 6131 |
JUMPTO(SLJIT_JUMP, leave); |
JUMPTO(SLJIT_JUMP, leave); |
| 6132 |
|
|
| 6133 |
flush_stubs(common); |
flush_stubs(common); |
| 6180 |
/* Allocation failed. */ |
/* Allocation failed. */ |
| 6181 |
JUMPHERE(alloc_error); |
JUMPHERE(alloc_error); |
| 6182 |
/* We break the return address cache here, but this is a really rare case. */ |
/* We break the return address cache here, but this is a really rare case. */ |
| 6183 |
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), MAX_INDEX, SLJIT_IMM, PCRE_ERROR_JIT_STACKLIMIT); |
OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE_ERROR_JIT_STACKLIMIT); |
| 6184 |
JUMPTO(SLJIT_JUMP, leave); |
JUMPTO(SLJIT_JUMP, leave); |
| 6185 |
|
|
| 6186 |
/* Call limit reached. */ |
/* Call limit reached. */ |
| 6187 |
set_jumps(common->calllimit, LABEL()); |
set_jumps(common->calllimit, LABEL()); |
| 6188 |
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), MAX_INDEX, SLJIT_IMM, PCRE_ERROR_MATCHLIMIT); |
OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE_ERROR_MATCHLIMIT); |
| 6189 |
JUMPTO(SLJIT_JUMP, leave); |
JUMPTO(SLJIT_JUMP, leave); |
| 6190 |
|
|
| 6191 |
if (common->revertframes != NULL) |
if (common->revertframes != NULL) |