ops_init(regex_t* reg, int init_alloc_size)
{
Operation* p;
- size_t size = sizeof(Operation) * init_alloc_size;
+ size_t size;
if (init_alloc_size > 0) {
+ size = sizeof(Operation) * init_alloc_size;
p = (Operation* )xrealloc(reg->ops, size);
CHECK_NULL_RETURN_MEMERR(p);
+#ifdef USE_DIRECT_THREADED_CODE
+ {
+ enum OpCode* cp;
+ size = sizeof(enum OpCode) * init_alloc_size;
+ cp = (enum OpCode* )xrealloc(reg->ocs, size);
+ CHECK_NULL_RETURN_MEMERR(cp);
+ reg->ocs = cp;
+ }
+#endif
}
else {
- p = (Operation* )0;
+ p = (Operation* )0;
+#ifdef USE_DIRECT_THREADED_CODE
+ reg->ocs = (enum OpCode* )0;
+#endif
}
reg->ops = p;
{
#define MIN_OPS_EXPAND_SIZE 4
+#ifdef USE_DIRECT_THREADED_CODE
+ enum OpCode* cp;
+#endif
Operation* p;
size_t size;
if (n <= 0) n = MIN_OPS_EXPAND_SIZE;
n += reg->ops_alloc;
- size = sizeof(Operation) * n;
+ size = sizeof(Operation) * n;
p = (Operation* )xrealloc(reg->ops, size);
CHECK_NULL_RETURN_MEMERR(p);
+#ifdef USE_DIRECT_THREADED_CODE
+ size = sizeof(enum OpCode) * n;
+ cp = (enum OpCode* )xrealloc(reg->ocs, size);
+ CHECK_NULL_RETURN_MEMERR(cp);
+ reg->ocs = cp;
+#endif
+
reg->ops = p;
reg->ops_alloc = n;
if (reg->ops_used == 0)
if (IS_NULL(reg->ops)) return ;
for (i = 0; i < (int )reg->ops_used; i++) {
- Operation* op = reg->ops + i;
- switch (op->opcode) {
+ enum OpCode opcode;
+ Operation* op;
+
+ op = reg->ops + i;
+
+#ifdef USE_DIRECT_THREADED_CODE
+ opcode = *(reg->ocs + i);
+#else
+ opcode = op->opcode;
+#endif
+
+ switch (opcode) {
case OP_EXACTMBN:
xfree(op->exact_len_n.s);
break;
}
xfree(reg->ops);
+#ifdef USE_DIRECT_THREADED_CODE
+ xfree(reg->ocs);
+ reg->ocs = 0;
+#endif
reg->ops = 0;
reg->ops_curr = 0;
r = ops_new(reg);
if (r != ONIG_NORMAL) return r;
+#ifdef USE_DIRECT_THREADED_CODE
+ *(reg->ocs + (reg->ops_curr - reg->ops)) = opcode;
+#else
reg->ops_curr->opcode = opcode;
+#endif
+
return 0;
}
}
extern void
-onig_print_compiled_byte_code(FILE* f, Operation* p, Operation* start, OnigEncoding enc)
+onig_print_compiled_byte_code(FILE* f, regex_t* reg, int index,
+ Operation* start, OnigEncoding enc)
{
int i, n;
RelAddrType addr;
OnigCodePoint code;
ModeType mode;
UChar *q;
+ Operation* p;
+ enum OpCode opcode;
- fprintf(f, "%s", op2name(p->opcode));
- switch (p->opcode) {
+ p = reg->ops + index;
+
+#ifdef USE_DIRECT_THREADED_CODE
+ opcode = reg->ocs[index];
+#else
+ opcode = p->opcode;
+#endif
+
+ fprintf(f, "%s", op2name(opcode));
+ switch (opcode) {
case OP_EXACT1:
p_string(f, 1, p->exact.s); break;
case OP_EXACT2:
case OP_CCLASS:
case OP_CCLASS_NOT:
- n = bitset_on_num(p->cclass.bs);
+ n = bitset_on_num(p->cclass.bsp);
fprintf(f, ":%d", n);
break;
case OP_CCLASS_MB:
OnigCodePoint* codes;
codes = (OnigCodePoint* )p->cclass_mix.mb;
- n = bitset_on_num(p->cclass_mix.bs);
+ n = bitset_on_num(p->cclass_mix.bsp);
GET_CODE_POINT(ncode, codes);
codes++;
break;
default:
- fprintf(stderr, "onig_print_compiled_byte_code: undefined code %d\n", p->opcode);
+ fprintf(stderr, "onig_print_compiled_byte_code: undefined code %d\n", opcode);
break;
}
}
int pos = bp - start;
fprintf(f, "%4d: ", pos);
- onig_print_compiled_byte_code(f, bp, start, reg->enc);
+ onig_print_compiled_byte_code(f, reg, pos, start, reg->enc);
fprintf(f, "\n");
bp++;
}
fputs((char* )buf, stderr);\
for (i = 0; i < 20 - (bp - buf); i++) fputc(' ', stderr);\
if (xp == FinishCode)\
- fprintf(stderr, "----: ");\
- else\
+ fprintf(stderr, "----: finish");\
+ else {\
fprintf(stderr, "%4d: ", (int )(xp - reg->ops));\
- onig_print_compiled_byte_code(stderr, xp, reg->ops, encode);\
+ onig_print_compiled_byte_code(stderr, reg, (int )(xp - reg->ops), reg->ops, encode);\
+ }\
fprintf(stderr, "\n");\
} while(0);
#else
{
#if defined(USE_DIRECT_THREADED_CODE)
- static Operation FinishCode[] = { { .opaddr=&&L_FINISH, .opcode=OP_FINISH } };
+ static Operation FinishCode[] = { { .opaddr=&&L_FINISH } };
#else
static Operation FinishCode[] = { { OP_FINISH } };
#endif
if (IS_NULL(msa)) {
for (i = 0; i < reg->ops_used; i++) {
const void* addr;
- addr = opcode_to_label[p->opcode];
+ addr = opcode_to_label[reg->ocs[i]];
p->opaddr = addr;
p++;
}
#endif
empty_check_found:
/* empty loop founded, skip next instruction */
-#ifdef ONIG_DEBUG
+#if defined(ONIG_DEBUG) && !defined(USE_DIRECT_THREADED_CODE)
switch (p->opcode) {
case OP_JUMP:
case OP_PUSH:
STACK_SAVE;
return ONIGERR_UNDEFINED_BYTECODE;
-#ifdef ONIG_DEBUG
+#if defined(ONIG_DEBUG) && !defined(USE_DIRECT_THREADED_CODE)
unexpected_bytecode_error:
STACK_SAVE;
return ONIGERR_UNEXPECTED_BYTECODE;