[#29736] [提案] Kernel#p をもっと便利に — "Yusuke ENDOH" <mame@...>

遠藤侑介と申します。

19 messages 2006/11/01

[#29765] merge with YARV — SASADA Koichi <ko1@...>

 ささだです。

16 messages 2006/11/03

[#29767] 1.8 proposal of RUBY_PATCHLEVEL — URABE Shyouhei <root@...>

-----BEGIN PGP SIGNED MESSAGE-----

52 messages 2006/11/04
[#29771] Re: 1.8 proposal of RUBY_PATCHLEVEL — Shugo Maeda <shugo@...> 2006/11/04

前田です。

[#29925] ruby -v — Urabe Shyouhei <shyouhei@...>

卜部です。

28 messages 2006/11/24

[#29964] 1.8, 1.9, svn化, などなどのまとめ — "U.Nakamura" <usa@...>

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

15 messages 2006/11/28

[#29970] BUG: Incorrect handling of Ignorecase matching (regex.c of 1.8.5) — "きむらこういち" <hogemuta@...>

木村です。

15 messages 2006/11/28

[ruby-dev:29882] Re: case/when splat

From: Nobuyoshi Nakada <nobu@...>
Date: 2006-11-06 15:12:33 UTC
List: ruby-dev #29882
なかだです。

At Mon, 6 Nov 2006 14:35:02 +0900,
SASADA Koichi wrote in [ruby-dev:29860]:
>  次のプログラムは :ok と出力するべきだと思うのですが、ruby 1.9.0
> (2006-11-03) [x86_64-linux] では :ng2 と出力されます。

べきだと思います。

>  次のプログラムは :ok と表示されるのかなーと思っていたんですが、:ng と
> 表示されます。そんなもんでしょうか。

そんなもんでもないでしょう。

when_check()の構造が少々いまいちっぽいですが。


Index: eval.c
===================================================================
RCS file: /cvs/ruby/src/ruby/eval.c,v
retrieving revision 1.955
diff -p -U 2 -r1.955 eval.c
--- eval.c	6 Nov 2006 10:27:58 -0000	1.955
+++ eval.c	6 Nov 2006 14:34:38 -0000
@@ -2701,8 +2701,8 @@ unknown_node(NODE *volatile node)
 when_cond(VALUE v1, VALUE v2)
 {
-    if (v1 == Qundef) {
-	return RTEST(v2);
+    if (v1 != Qundef) {
+	v2 = rb_funcall2(v2, eqq, 1, &v1);
     }
-    return RTEST(rb_funcall2(v2, eqq, 1, &v1));
+    return RTEST(v2);
 }
 
@@ -2724,5 +2724,7 @@ when_check(NODE *tag, VALUE val, VALUE s
 	break;
       case NODE_SPLAT:
-	elm = splat_value(rb_eval(self, tag->nd_head));
+	tag = tag->nd_head;
+      splat:
+	elm = splat_value(rb_eval(self, tag));
 	for (i=0; i<RARRAY_LEN(elm); i++) {
 	    if (when_cond(val, RARRAY_PTR(elm)[i])) {
@@ -2733,5 +2735,6 @@ when_check(NODE *tag, VALUE val, VALUE s
       case NODE_ARGSCAT:
 	if (when_check(tag->nd_head, val, self)) return Qtrue;
-	return when_check(tag->nd_body, val, self);
+	tag = tag->nd_body;
+	goto splat;
       case NODE_ARGSPUSH:
 	if (when_check(tag->nd_head, val, self)) return Qtrue;


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread