#define STACK_ENSURE(n) do {\
if (stk_end - stk < (n)) {\
- int r = stack_double(is_alloca, &alloc_base, &stk_base, &stk_end, &stk,\
- msa);\
+ int r = stack_double(is_alloca, &alloc_base, &stk_base, &stk_end, &stk, msa);\
if (r != 0) { STACK_SAVE; return r; } \
is_alloca = 0;\
UPDATE_FOR_STACK_REALLOC;\
} while(0)
#define STACK_PUSH_SAVE_VAL(sid, stype, sval) do {\
- STACK_ENSURE(1);\
+ /* STACK_ENSURE(1) */;\
stk->type = STK_SAVE_VAL;\
stk->u.val.id = (sid);\
stk->u.val.type = (stype);\
}\
} while (0)
-#define STACK_GET_SAVE_VAL_TYPE_LAST_ID(stype, sid, sval) do {\
+#define STACK_GET_SAVE_VAL_TYPE_LAST_ID(stype, sid, sval) do { \
int level = 0;\
StackType *k = stk;\
while (k > stk_base) {\
level++;\
}\
} while (0)
+#define STACK_GET_SAVE_VAL_TYPE_LAST_ID_FROM(stype, sid, sval, stk_from) do {\
+ StackType *k = (stk_from);\
+ while (k > stk_base) {\
+ STACK_BASE_CHECK(k, "STACK_GET_SAVE_VAL_TYPE_LAST_ID_FROM"); \
+ if (k->type == STK_SAVE_VAL && k->u.val.type == (stype)\
+ && k->u.val.id == (sid)) {\
+ (sval) = k->u.val.v;\
+ break;\
+ }\
+ k--;\
+ }\
+} while (0)
#ifdef ONIG_DEBUG
#define STACK_BASE_CHECK(p, at) \
StackIndex si;
StackIndex *repeat_stk;
StackIndex *mem_start_stk, *mem_end_stk;
+ StackIndex right_range_index;
UChar* keep;
#ifdef USE_COMBINATION_EXPLOSION_CHECK
int scv;
#else
right_range = (UChar* )end;
#endif
+ right_range_index = INVALID_STACK_INDEX;
while (1) {
#ifdef ONIG_DEBUG_MATCH
SaveType type;
GET_SAVE_TYPE_INC(type, p);
GET_MEMNUM_INC(mem, p); /* mem: save id */
+ STACK_ENSURE(1); /* for GET_STACK_INDEX() */
switch ((enum SaveType )type) {
case SAVE_KEEP:
STACK_PUSH_SAVE_VAL(mem, SAVE_KEEP, s);
break;
case SAVE_RIGHT_RANGE:
+ right_range_index = GET_STACK_INDEX(stk);
STACK_PUSH_SAVE_VAL(mem, SAVE_RIGHT_RANGE, right_range);
break;
}
STACK_GET_SAVE_VAL_TYPE_LAST(SAVE_KEEP, keep);
break;
case UPDATE_VAR_RIGHT_RANGE_FROM_STACK_LAST:
- //fprintf(stderr, "curr right_range: %ld\n", (right_range - sstart));
- STACK_GET_SAVE_VAL_TYPE_LAST_ID(SAVE_RIGHT_RANGE, mem, right_range);
- //fprintf(stderr, "update right_range: %ld\n", (right_range - sstart));
+ {
+ StackType* from;
+ if (right_range_index != INVALID_STACK_INDEX &&
+ right_range_index < GET_STACK_INDEX(stk))
+ from = STACK_AT(right_range_index);
+ else
+ from = stk;
+
+ STACK_GET_SAVE_VAL_TYPE_LAST_ID_FROM(SAVE_RIGHT_RANGE, mem,
+ right_range, from);
+ //fprintf(stderr, "update right_range: %ld\n", (right_range - sstart));
+ }
break;
case UPDATE_VAR_RIGHT_RANGE_SPREV:
right_range = sprev;