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/