diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-03-19 06:20:55 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-03-19 06:20:55 +0000 |
commit | 0d1c2268a81268e0026230d4d55cf73931665fcd (patch) | |
tree | acf141e49c2df6eee3cbdbe7a3fa6bc79765c787 /compile.c | |
parent | d4f0f28430c29d6d33621852640fbbccdd666b65 (diff) | |
download | ruby-0d1c2268a81268e0026230d4d55cf73931665fcd.tar.gz |
* 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.c | 82 |
1 files changed, 27 insertions, 55 deletions
@@ -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 |