mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	* 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:
		
							parent
							
								
									d4f0f28430
								
							
						
					
					
						commit
						0d1c2268a8
					
				
					 2 changed files with 33 additions and 55 deletions
				
			
		| 
						 | 
				
			
			@ -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>
 | 
			
		||||
 | 
			
		||||
	* 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 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));
 | 
			
		||||
		}
 | 
			
		||||
		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));
 | 
			
		||||
		}
 | 
			
		||||
		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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue