зеркало из https://github.com/github/ruby.git
* 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
This commit is contained in:
Родитель
d4f0f28430
Коммит
0d1c2268a8
|
@ -1,3 +1,9 @@
|
||||||
|
Mon Mar 19 15:20:53 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* 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@ruby-lang.org>
|
Mon Mar 19 15:05:54 2012 URABE Shyouhei <shyouhei@ruby-lang.org>
|
||||||
|
|
||||||
* test/test_pty.rb: same as r29280, skip tests when PTY allocation
|
* test/test_pty.rb: same as r29280, skip tests when PTY allocation
|
||||||
|
|
82
compile.c
82
compile.c
|
@ -1870,68 +1870,40 @@ iseq_specialized_instruction(rb_iseq_t *iseq, INSN *iobj)
|
||||||
VALUE block = OPERAND_AT(iobj, 2);
|
VALUE block = OPERAND_AT(iobj, 2);
|
||||||
VALUE flag = OPERAND_AT(iobj, 3);
|
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 (block == 0 && flag == INT2FIX(0)) {
|
||||||
if (argc == 0) {
|
switch (argc) {
|
||||||
if (mid == idLength) {
|
case 0:
|
||||||
insn_set_specialized_instruction(iseq, iobj, BIN(opt_length));
|
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) {
|
break;
|
||||||
insn_set_specialized_instruction(iseq, iobj, BIN(opt_size));
|
case 1:
|
||||||
}
|
switch (mid) {
|
||||||
else if (mid == idSucc) {
|
case idPLUS: SP_INSN(plus); break;
|
||||||
insn_set_specialized_instruction(iseq, iobj, BIN(opt_succ));
|
case idMINUS: SP_INSN(minus); break;
|
||||||
}
|
case idMULT: SP_INSN(mult); break;
|
||||||
else if (mid == idNot) {
|
case idDIV: SP_INSN(div); break;
|
||||||
insn_set_specialized_instruction(iseq, iobj, BIN(opt_not));
|
case idMOD: SP_INSN(mod); break;
|
||||||
}
|
case idEq: SP_INSN(eq); break;
|
||||||
}
|
case idNeq: SP_INSN(neq); break;
|
||||||
else if (argc == 1) {
|
case idLT: SP_INSN(lt); break;
|
||||||
if (0) {
|
case idLE: SP_INSN(le); break;
|
||||||
}
|
case idGT: SP_INSN(gt); break;
|
||||||
else if (mid == idPLUS) {
|
case idGE: SP_INSN(ge); break;
|
||||||
insn_set_specialized_instruction(iseq, iobj, BIN(opt_plus));
|
case idLTLT: SP_INSN(ltlt); break;
|
||||||
}
|
case idAREF: SP_INSN(aref); break;
|
||||||
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));
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return COMPILE_OK;
|
return COMPILE_OK;
|
||||||
|
#undef SP_INSN
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|
Загрузка…
Ссылка в новой задаче