summaryrefslogtreecommitdiff
path: root/compile.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-03-19 06:20:55 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-03-19 06:20:55 +0000
commit0d1c2268a81268e0026230d4d55cf73931665fcd (patch)
treeacf141e49c2df6eee3cbdbe7a3fa6bc79765c787 /compile.c
parentd4f0f28430c29d6d33621852640fbbccdd666b65 (diff)
* compile.c (iseq_specialized_instruction): DRY and replace chain
of if-else with switch for special instructions. based on a patch by Vasfed. https://github.com/ruby/ruby/pull/105 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35089 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'compile.c')
-rw-r--r--compile.c82
1 files changed, 27 insertions, 55 deletions
diff --git a/compile.c b/compile.c
index ae1aa40580..db8e48b6c6 100644
--- a/compile.c
+++ b/compile.c
@@ -1870,68 +1870,40 @@ iseq_specialized_instruction(rb_iseq_t *iseq, INSN *iobj)
VALUE block = OPERAND_AT(iobj, 2);
VALUE flag = OPERAND_AT(iobj, 3);
- /* TODO: should be more sophisticated search */
+#define SP_INSN(opt) insn_set_specialized_instruction(iseq, iobj, BIN(opt_##opt))
+
if (block == 0 && flag == INT2FIX(0)) {
- if (argc == 0) {
- if (mid == idLength) {
- insn_set_specialized_instruction(iseq, iobj, BIN(opt_length));
- }
- else if (mid == idSize) {
- insn_set_specialized_instruction(iseq, iobj, BIN(opt_size));
- }
- else if (mid == idSucc) {
- insn_set_specialized_instruction(iseq, iobj, BIN(opt_succ));
- }
- else if (mid == idNot) {
- insn_set_specialized_instruction(iseq, iobj, BIN(opt_not));
- }
- }
- else if (argc == 1) {
- if (0) {
- }
- else if (mid == idPLUS) {
- insn_set_specialized_instruction(iseq, iobj, BIN(opt_plus));
- }
- else if (mid == idMINUS) {
- insn_set_specialized_instruction(iseq, iobj, BIN(opt_minus));
- }
- else if (mid == idMULT) {
- insn_set_specialized_instruction(iseq, iobj, BIN(opt_mult));
- }
- else if (mid == idDIV) {
- insn_set_specialized_instruction(iseq, iobj, BIN(opt_div));
+ switch (argc) {
+ case 0:
+ switch (mid) {
+ case idLength: SP_INSN(length); break;
+ case idSize: SP_INSN(size); break;
+ case idSucc: SP_INSN(succ); break;
+ case idNot: SP_INSN(not); break;
}
- else if (mid == idMOD) {
- insn_set_specialized_instruction(iseq, iobj, BIN(opt_mod));
- }
- else if (mid == idEq) {
- insn_set_specialized_instruction(iseq, iobj, BIN(opt_eq));
- }
- else if (mid == idNeq) {
- insn_set_specialized_instruction(iseq, iobj, BIN(opt_neq));
- }
- else if (mid == idLT) {
- insn_set_specialized_instruction(iseq, iobj, BIN(opt_lt));
- }
- else if (mid == idLE) {
- insn_set_specialized_instruction(iseq, iobj, BIN(opt_le));
- }
- else if (mid == idGT) {
- insn_set_specialized_instruction(iseq, iobj, BIN(opt_gt));
- }
- else if (mid == idGE) {
- insn_set_specialized_instruction(iseq, iobj, BIN(opt_ge));
- }
- else if (mid == idLTLT) {
- insn_set_specialized_instruction(iseq, iobj, BIN(opt_ltlt));
- }
- else if (mid == idAREF) {
- insn_set_specialized_instruction(iseq, iobj, BIN(opt_aref));
+ break;
+ case 1:
+ switch (mid) {
+ case idPLUS: SP_INSN(plus); break;
+ case idMINUS: SP_INSN(minus); break;
+ case idMULT: SP_INSN(mult); break;
+ case idDIV: SP_INSN(div); break;
+ case idMOD: SP_INSN(mod); break;
+ case idEq: SP_INSN(eq); break;
+ case idNeq: SP_INSN(neq); break;
+ case idLT: SP_INSN(lt); break;
+ case idLE: SP_INSN(le); break;
+ case idGT: SP_INSN(gt); break;
+ case idGE: SP_INSN(ge); break;
+ case idLTLT: SP_INSN(ltlt); break;
+ case idAREF: SP_INSN(aref); break;
}
+ break;
}
}
}
return COMPILE_OK;
+#undef SP_INSN
}
static int