define emit_x functions as macros

This commit is contained in:
Yuichi Nishiwaki 2015-06-28 00:25:02 +09:00
parent 62dbdb79dd
commit 1595be099b
1 changed files with 39 additions and 56 deletions

View File

@ -933,53 +933,45 @@ codegen_context_destroy(pic_state *pic, codegen_context *cxt)
return irep; return irep;
} }
static void #define check_size(pic, cxt, x, name, type) do { \
emit_n(pic_state *pic, codegen_context *cxt, enum pic_opcode insn) if (cxt->x##len >= cxt->x##capa) { \
{ cxt->x##capa *= 2; \
if (cxt->clen >= cxt->ccapa) { cxt->name = pic_realloc(pic, cxt->name, sizeof(type) * cxt->x##capa); \
cxt->ccapa *= 2; } \
cxt->code = pic_realloc(pic, cxt->code, sizeof(pic_code) * cxt->ccapa); } while (0)
}
cxt->code[cxt->clen].insn = insn;
cxt->clen++;
}
static void #define check_code_size(pic, cxt) check_size(pic, cxt, c, code, pic_code)
emit_i(pic_state *pic, codegen_context *cxt, enum pic_opcode insn, int i) #define check_syms_size(pic, cxt) check_size(pic, cxt, s, syms, pic_sym *)
{ #define check_irep_size(pic, cxt) check_size(pic, cxt, i, irep, struct pic_irep *)
if (cxt->clen >= cxt->ccapa) { #define check_pool_size(pic, cxt) check_size(pic, cxt, p, pool, pic_value)
cxt->ccapa *= 2;
cxt->code = pic_realloc(pic, cxt->code, sizeof(pic_code) * cxt->ccapa);
}
cxt->code[cxt->clen].insn = insn;
cxt->code[cxt->clen].u.i = i;
cxt->clen++;
}
static void #define emit_n(pic, cxt, ins) do { \
emit_c(pic_state *pic, codegen_context *cxt, enum pic_opcode insn, char c) check_code_size(pic, cxt); \
{ cxt->code[cxt->clen].insn = ins; \
if (cxt->clen >= cxt->ccapa) { cxt->clen++; \
cxt->ccapa *= 2; } while (0) \
cxt->code = pic_realloc(pic, cxt->code, sizeof(pic_code) * cxt->ccapa);
}
cxt->code[cxt->clen].insn = insn;
cxt->code[cxt->clen].u.c = c;
cxt->clen++;
}
static void #define emit_i(pic, cxt, ins, I) do { \
emit_r(pic_state *pic, codegen_context *cxt, enum pic_opcode insn, int d, int i) check_code_size(pic, cxt); \
{ cxt->code[cxt->clen].insn = ins; \
if (cxt->clen >= cxt->ccapa) { cxt->code[cxt->clen].u.i = I; \
cxt->ccapa *= 2; cxt->clen++; \
cxt->code = pic_realloc(pic, cxt->code, sizeof(pic_code) * cxt->ccapa); } while (0) \
}
cxt->code[cxt->clen].insn = insn; #define emit_c(pic, cxt, ins, C) do { \
cxt->code[cxt->clen].u.r.depth = d; check_code_size(pic, cxt); \
cxt->code[cxt->clen].u.r.idx = i; cxt->code[cxt->clen].insn = ins; \
cxt->clen++; cxt->code[cxt->clen].u.c = C; \
} cxt->clen++; \
} while (0) \
#define emit_r(pic, cxt, ins, D, I) do { \
check_code_size(pic, cxt); \
cxt->code[cxt->clen].insn = ins; \
cxt->code[cxt->clen].u.r.depth = D; \
cxt->code[cxt->clen].u.r.idx = I; \
cxt->clen++; \
} while (0) \
static void static void
create_activation(pic_state *pic, codegen_context *cxt) create_activation(pic_state *pic, codegen_context *cxt)
@ -1057,10 +1049,7 @@ index_symbol(pic_state *pic, codegen_context *cxt, pic_sym *sym)
return i; return i;
} }
} }
if (cxt->slen >= cxt->scapa) { check_syms_size(pic, cxt);
cxt->scapa *= 2;
cxt->syms = pic_realloc(pic, cxt->syms, sizeof(pic_sym *) * cxt->scapa);
}
cxt->syms[cxt->slen++] = sym; cxt->syms[cxt->slen++] = sym;
return i; return i;
} }
@ -1137,10 +1126,7 @@ codegen(pic_state *pic, codegen_context *cxt, pic_value obj)
else if (sym == pic->sLAMBDA) { else if (sym == pic->sLAMBDA) {
int k; int k;
if (cxt->ilen >= cxt->icapa) { check_irep_size(pic, cxt);
cxt->icapa *= 2;
cxt->irep = pic_realloc(pic, cxt->irep, sizeof(struct pic_irep *) * cxt->icapa);
}
k = (int)cxt->ilen++; k = (int)cxt->ilen++;
emit_i(pic, cxt, OP_LAMBDA, k); emit_i(pic, cxt, OP_LAMBDA, k);
@ -1200,10 +1186,7 @@ codegen(pic_state *pic, codegen_context *cxt, pic_value obj)
emit_c(pic, cxt, OP_PUSHCHAR, pic_char(obj)); emit_c(pic, cxt, OP_PUSHCHAR, pic_char(obj));
return; return;
default: default:
if (cxt->plen >= cxt->pcapa) { check_pool_size(pic, cxt);
cxt->pcapa *= 2;
cxt->pool = pic_realloc(pic, cxt->pool, sizeof(pic_value) * cxt->pcapa);
}
pidx = (int)cxt->plen++; pidx = (int)cxt->plen++;
cxt->pool[pidx] = obj; cxt->pool[pidx] = obj;
emit_i(pic, cxt, OP_PUSHCONST, pidx); emit_i(pic, cxt, OP_PUSHCONST, pidx);