ruby-changes:23039
From: nobu <ko1@a...>
Date: Mon, 19 Mar 2012 15:21:10 +0900 (JST)
Subject: [ruby-changes:23039] nobu:r35089 (trunk): * compile.c (iseq_specialized_instruction): DRY and replace chain
nobu 2012-03-19 15:20:55 +0900 (Mon, 19 Mar 2012) New Revision: 35089 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=35089 Log: * 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 Modified files: trunk/ChangeLog trunk/compile.c Index: ChangeLog =================================================================== --- ChangeLog (revision 35088) +++ ChangeLog (revision 35089) @@ -1,3 +1,9 @@ +Mon Mar 19 15:20:53 2012 Nobuyoshi Nakada <nobu@r...> + + * 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 + Mon Mar 19 15:05:54 2012 URABE Shyouhei <shyouhei@r...> * test/test_pty.rb: same as r29280, skip tests when PTY allocation Index: compile.c =================================================================== --- compile.c (revision 35088) +++ compile.c (revision 35089) @@ -1870,68 +1870,40 @@ 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)); + 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 == idSize) { - insn_set_specialized_instruction(iseq, iobj, BIN(opt_size)); + 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; } - 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)); - } + break; } - 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)); - } - 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)); - } - } } } return COMPILE_OK; +#undef SP_INSN } static int -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/