[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]