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

ruby-changes:13691

From: yugui <ko1@a...>
Date: Sun, 25 Oct 2009 23:46:50 +0900 (JST)
Subject: [ruby-changes:13691] Ruby:r25478 (ruby_1_9_1): merges r24511 from trunk into ruby_1_9_1.

yugui	2009-10-25 23:46:19 +0900 (Sun, 25 Oct 2009)

  New Revision: 25478

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=25478

  Log:
    merges r24511 from trunk into ruby_1_9_1.
    --
    * insns.def, vm.c, vm_insnhelper.c, vm_insnhelper.h: check
      definition of (classes)#=== for case/when optimization.
      Fix Bug #1376 [ruby-core:23190].
    * string.c (Init_String), bignum.c (Init_Bignum),
      numeric.c (Init_Numeric): define String#===, Symbol#===,
      Bignum#===, Fixnum#===, Float#=== as same as (classes)#==.

  Modified files:
    branches/ruby_1_9_1/ChangeLog
    branches/ruby_1_9_1/bignum.c
    branches/ruby_1_9_1/insns.def
    branches/ruby_1_9_1/numeric.c
    branches/ruby_1_9_1/string.c
    branches/ruby_1_9_1/vm.c
    branches/ruby_1_9_1/vm_insnhelper.c
    branches/ruby_1_9_1/vm_insnhelper.h

Index: ruby_1_9_1/ChangeLog
===================================================================
--- ruby_1_9_1/ChangeLog	(revision 25477)
+++ ruby_1_9_1/ChangeLog	(revision 25478)
@@ -1,3 +1,13 @@
+Wed Aug 12 Wed Aug 12 14:54:34 2009  Koichi Sasada  <ko1@a...>
+
+	* insns.def, vm.c, vm_insnhelper.c, vm_insnhelper.h: check
+	  definition of (classes)#=== for case/when optimization.
+	  Fix Bug #1376 [ruby-core:23190].
+
+	* string.c (Init_String), bignum.c (Init_Bignum),
+	  numeric.c (Init_Numeric): define String#===, Symbol#===,
+	  Bignum#===, Fixnum#===, Float#=== as same as (classes)#==.
+
 Wed Aug 12 12:59:51 2009  Nobuyoshi Nakada  <nobu@r...>
 
 	* string.c (rb_str_new_frozen): must not change encoding of frozen
Index: ruby_1_9_1/insns.def
===================================================================
--- ruby_1_9_1/insns.def	(revision 25477)
+++ ruby_1_9_1/insns.def	(revision 25478)
@@ -1237,10 +1237,7 @@
 (..., VALUE key)
 () // inc += -1;
 {
-    if (0) {
-	/* TODO: if some === method is overrided */
-    }
-    else {
+    if (BASIC_OP_UNREDEFINED_P(BOP_EQQ)) {
 	VALUE val;
 	if (st_lookup(RHASH_TBL(hash), key, &val)) {
 	    JUMP(FIX2INT(val));
@@ -1249,6 +1246,20 @@
 	    JUMP(else_offset);
 	}
     }
+    else {
+	struct opt_case_dispatch_i_arg arg = {
+	    key, -1
+	};
+
+	st_foreach(RHASH_TBL(hash), opt_case_dispatch_i, &arg);
+
+	if (arg.label != -1) {
+	    JUMP(arg.label);
+	}
+	else {
+	    JUMP(else_offset);
+	}
+    }
 }
 
 /**
Index: ruby_1_9_1/string.c
===================================================================
--- ruby_1_9_1/string.c	(revision 25477)
+++ ruby_1_9_1/string.c	(revision 25478)
@@ -7125,6 +7125,7 @@
     rb_define_method(rb_cString, "initialize_copy", rb_str_replace, 1);
     rb_define_method(rb_cString, "<=>", rb_str_cmp_m, 1);
     rb_define_method(rb_cString, "==", rb_str_equal, 1);
+    rb_define_method(rb_cString, "===", rb_str_equal, 1);
     rb_define_method(rb_cString, "eql?", rb_str_eql, 1);
     rb_define_method(rb_cString, "hash", rb_str_hash_m, 0);
     rb_define_method(rb_cString, "casecmp", rb_str_casecmp, 1);
@@ -7254,6 +7255,7 @@
     rb_define_singleton_method(rb_cSymbol, "all_symbols", rb_sym_all_symbols, 0); /* in parse.y */
 
     rb_define_method(rb_cSymbol, "==", sym_equal, 1);
+    rb_define_method(rb_cSymbol, "===", sym_equal, 1);
     rb_define_method(rb_cSymbol, "inspect", sym_inspect, 0);
     rb_define_method(rb_cSymbol, "to_s", rb_sym_to_s, 0);
     rb_define_method(rb_cSymbol, "id2name", rb_sym_to_s, 0);
Index: ruby_1_9_1/numeric.c
===================================================================
--- ruby_1_9_1/numeric.c	(revision 25477)
+++ ruby_1_9_1/numeric.c	(revision 25478)
@@ -3163,6 +3163,7 @@
     rb_define_method(rb_cFixnum, "magnitude", fix_abs, 0);
 
     rb_define_method(rb_cFixnum, "==", fix_equal, 1);
+    rb_define_method(rb_cFixnum, "===", fix_equal, 1);
     rb_define_method(rb_cFixnum, "<=>", fix_cmp, 1);
     rb_define_method(rb_cFixnum, ">",  fix_gt, 1);
     rb_define_method(rb_cFixnum, ">=", fix_ge, 1);
@@ -3216,6 +3217,7 @@
     rb_define_method(rb_cFloat, "divmod", flo_divmod, 1);
     rb_define_method(rb_cFloat, "**", flo_pow, 1);
     rb_define_method(rb_cFloat, "==", flo_eq, 1);
+    rb_define_method(rb_cFloat, "===", flo_eq, 1);
     rb_define_method(rb_cFloat, "<=>", flo_cmp, 1);
     rb_define_method(rb_cFloat, ">",  flo_gt, 1);
     rb_define_method(rb_cFloat, ">=", flo_ge, 1);
Index: ruby_1_9_1/vm.c
===================================================================
--- ruby_1_9_1/vm.c	(revision 25477)
+++ ruby_1_9_1/vm.c	(revision 25478)
@@ -948,6 +948,7 @@
     OP(DIV, DIV), (C(Fixnum), C(Float));
     OP(MOD, MOD), (C(Fixnum), C(Float));
     OP(Eq, EQ), (C(Fixnum), C(Float), C(String));
+    OP(Eqq, EQQ), (C(Fixnum), C(Bignum), C(Float), C(Symbol), C(String));
     OP(LT, LT), (C(Fixnum));
     OP(LE, LE), (C(Fixnum));
     OP(LTLT, LTLT), (C(String), C(Array));
Index: ruby_1_9_1/vm_insnhelper.c
===================================================================
--- ruby_1_9_1/vm_insnhelper.c	(revision 25477)
+++ ruby_1_9_1/vm_insnhelper.c	(revision 25478)
@@ -1536,3 +1536,21 @@
 
     return val;
 }
+
+struct opt_case_dispatch_i_arg {
+    VALUE obj;
+    int label;
+};
+
+static int
+opt_case_dispatch_i(st_data_t key, st_data_t data, struct opt_case_dispatch_i_arg *arg)
+{
+    if (RTEST(rb_funcall((VALUE)key, idEqq, 1, arg->obj))) {
+	arg->label = FIX2INT((VALUE)data);
+	return ST_STOP;
+    }
+    else {
+	return ST_CONTINUE;
+    }
+}
+
Index: ruby_1_9_1/vm_insnhelper.h
===================================================================
--- ruby_1_9_1/vm_insnhelper.h	(revision 25477)
+++ ruby_1_9_1/vm_insnhelper.h	(revision 25478)
@@ -41,6 +41,7 @@
   BOP_DIV,
   BOP_MOD,
   BOP_EQ,
+  BOP_EQQ,
   BOP_LT,
   BOP_LE,
   BOP_LTLT,
Index: ruby_1_9_1/bignum.c
===================================================================
--- ruby_1_9_1/bignum.c	(revision 25477)
+++ ruby_1_9_1/bignum.c	(revision 25478)
@@ -2709,6 +2709,7 @@
 
     rb_define_method(rb_cBignum, "<=>", rb_big_cmp, 1);
     rb_define_method(rb_cBignum, "==", rb_big_eq, 1);
+    rb_define_method(rb_cBignum, "===", rb_big_eq, 1);
     rb_define_method(rb_cBignum, "eql?", rb_big_eql, 1);
     rb_define_method(rb_cBignum, "hash", rb_big_hash, 0);
     rb_define_method(rb_cBignum, "to_f", rb_big_to_f, 0);

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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