[#42194] Enhancing Numeric#step — "Akinori MUSHA" <knu@...>

 Numeric#step の仕様の拡張を提案します。

26 messages 2010/09/08
[#42196] Re: Enhancing Numeric#step — Yukihiro Matsumoto <matz@...> 2010/09/08

まつもと ゆきひろです

[#42200] Re: Enhancing Numeric#step — "Akinori MUSHA" <knu@...> 2010/09/08

At Wed, 8 Sep 2010 22:46:57 +0900,

[#42204] Re: Enhancing Numeric#step — Yukihiro Matsumoto <matz@...> 2010/09/09

まつもと ゆきひろです

[#42232] 1.9.2 readline can't handle cursorkeys, mbcs chars etc (msvcrt) — arton <artonx@...>

artonです。

11 messages 2010/09/10

[#42269] [Ruby 1.9-Bug#3836] Kernel.system, spawnがスペースを含むパスで動作しない — Hiroki Najima <redmine@...>

チケット #3836 が更新されました。 (by Hiroki Najima)

12 messages 2010/09/16
[#42270] WindowsでのKernel.systemの挙動、一貫性について — NAJIMA Hiroki <h.najima@...> 2010/09/16

名島(Nazy)と申します。

[#42310] ビジースレッドがあるとコンテキストスイッチが起きづらくなる — kuwamoto shintaro <beuniv@...>

こんにちは。

9 messages 2010/09/29
[#42315] [bug:trunk] ビジースレッドがあるとコンテキストスイッチが起きづらくなる — "U.Nakamura" <usa@...> 2010/09/30

こんにちは、なかむら(う)です。

[ruby-dev:42179] [Ruby 1.9-Bug#3696] Fwd: [ruby-list:47272] case when 整数と実数の比較 (ruby 1.9)

From: _ wanabe <redmine@...>
Date: 2010-09-05 00:11:48 UTC
List: ruby-dev #42179
チケット #3696 が更新されました。 (by _ wanabe)

ruby -v ruby 1.9.3dev (2010-09-01 trunk 29077) [i386-mingw32]にセット

ワナベと申します。

パッチありがとうございます。拝見しました。
大筋ではバッチリだと思うのですが、long long を使っているところや
速度的に不利な rb_obj_is_kind_of() を使っているところなど
ごく細かい部分が気になったので少し変えてみました。

VM の変更ではありますが、影響は限定的と思われるので
コミットしてしまおうと思いますがよろしいでしょうか。

diff --git a/compile.c b/compile.c
index 2fd804c..189ee43 100644
--- a/compile.c
+++ b/compile.c
@@ -2303,6 +2303,10 @@ case_when_optimizable_literal(NODE * node)
     switch (nd_type(node)) {
       case NODE_LIT: {
 	VALUE v = node->nd_lit;
+	if (TYPE(v) == T_FLOAT &&
+	    RFLOAT_VALUE(v) == (LONG_LONG)RFLOAT_VALUE(v)) {
+	    return LL2NUM(RFLOAT_VALUE(v));
+	}
 	if (SYMBOL_P(v) || rb_obj_is_kind_of(v, rb_cNumeric)) {
 	    return v;
 	}
diff --git a/insns.def b/insns.def
index fcd97ae..d6f8153 100644
--- a/insns.def
+++ b/insns.def
@@ -1260,16 +1260,26 @@ opt_case_dispatch
 (..., VALUE key)
 () // inc += -1;
 {
-    if (BASIC_OP_UNREDEFINED_P(BOP_EQQ)) {
-	VALUE val;
-	if (st_lookup(RHASH_TBL(hash), key, &val)) {
-	    JUMP(FIX2INT(val));
-	}
-	else {
-	    JUMP(else_offset);
+    switch(TYPE(key)) {
+      case T_FLOAT:
+	if (RFLOAT_VALUE(key) == (LONG_LONG)RFLOAT_VALUE(key)) {
+	    key = LL2NUM(RFLOAT_VALUE(key));
+	}
+      case T_SYMBOL: /* fall through */
+      case T_FIXNUM:
+      case T_BIGNUM:
+      case T_STRING:
+	if (BASIC_OP_UNREDEFINED_P(BOP_EQQ)) {
+	    VALUE val;
+	    if (st_lookup(RHASH_TBL(hash), key, &val)) {
+		JUMP(FIX2INT(val));
+	    }
+	    else {
+		JUMP(else_offset);
+	    }
+	    break;
 	}
-    }
-    else {
+      default: { /* fall through (else) */
 	struct opt_case_dispatch_i_arg arg;
 
 	arg.obj = key;
@@ -1282,6 +1292,7 @@ opt_case_dispatch
 	else {
 	    JUMP(else_offset);
 	}
+      }
     }
 }
 

----------------------------------------
http://redmine.ruby-lang.org/issues/show/3696

----------------------------------------
http://redmine.ruby-lang.org

In This Thread