[#32185] Date#+に大きな数字を与えるとおかしな日付に — "madoka yamamoto" <yamamotomadoka@...>

こんにちは、山本と申します。

26 messages 2007/11/08
[#32186] Re: Date#+に大きな数字を与えるとおかしな日付に — Tadayoshi Funaba <tadf@...> 2007/11/08

> Dateオブジェクトに+で大きな数字を与えるとおかしくなるようです。

[#32188] Re: Date#+に大きな数字を与えるとおかしな日付に — "madoka yamamoto" <yamamotomadoka@...> 2007/11/09

山本です。

[#32191] Re: Date#+に大きな数字を与えるとおかしな日付に — tadf@... 2007/11/09

> アルゴリズムの意味がわからないで書いた、表層的なパッチなので

[#32194] Re: Date#+に大きな数字を与えるとおかしな日付に — Yukihiro Matsumoto <matz@...> 2007/11/09

Hi,

[#32200] Re: rational (Re: Date#+に大きな数字を与えるとおかしな日付に) — Tadayoshi Funaba <tadf@...> 2007/11/10

> 1.9ではRationalとComplexを組み込みに、という話はありましたが、

[#32225] Re: rational (Re: Date#+に大きな数字を与えるとおかしな日付に) — Shin-ichiro HARA <sinara@...> 2007/11/12

原です。

[#32198] [提案] Array#tail — "Yusuke ENDOH" <mame@...>

遠藤と申します。

21 messages 2007/11/09
[#32199] Re: [提案] Array#tail — Yukihiro Matsumoto <matz@...> 2007/11/10

まつもと ゆきひろです

[#32352] 1.9.1のリリース時期について — KIMURA Koichi <hogemuta@...>

木村です。

16 messages 2007/11/24
[#32353] Re: 1.9.1のリリース時期について — Yukihiro Matsumoto <matz@...> 2007/11/24

まつもと ゆきひろです

[#32403] Next 1.8.6 patch release? (was Re: 1.9.1のリリース時期について) — Takahiro Kambe <taca@...>

こんばんは。

32 messages 2007/11/29
[#32414] Re: Next 1.8.6 patch release? (was Re: 1.9.1のリリース時期について) — Urabe Shyouhei <shyouhei@...> 2007/11/30

卜部です。

[#32444] Re: Next 1.8.6 patch release? (was Re: 1.9.1のリリース時期について) — Yukihiro Matsumoto <matz@...> 2007/12/03

まつもと ゆきひろです

[#32488] Re: Next 1.8.6 patch release? (was Re: 1.9.1のリリース時期について) — Urabe Shyouhei <shyouhei@...> 2007/12/08

卜部です。

[#32525] Re: Next 1.8.6 patch release? (was Re: 1.9.1のリリース時期について) — "Yusuke ENDOH" <mame@...> 2007/12/10

遠藤と申します。

[#32643] Re: Next 1.8.6 patch release? (was Re: 1.9.1のリリース時期について) — "Yusuke ENDOH" <mame@...> 2007/12/19

遠藤です。

[#32409] Re: [ruby-cvs:21293] Ruby:r14056 (trunk): * signal.c (trap_signm): SIGVTALRM no longer used for green — SASADA Koichi <ko1@...>

 ささだです.

10 messages 2007/11/30

[ruby-dev:32354] a[*a]+=1 dumps core

From: "Yusuke ENDOH" <mame@...>
Date: 2007-11-25 02:10:08 UTC
List: ruby-dev #32354
遠藤と申します。

1.9 で以下を実行すると落ちます。



$ ./ruby -e 'a[*a]+=1'
-- control frame ----------
c:0001 p:---- s:0001 b:-001 l:000000 d:000000 ------
---------------------------
-- backtrace of native function call (Use addr2line) --
0x80e8065
0x8105bd3
0x8105c9b
0x8116a6d
0x8116a88
0x81106e4
0x811725e
0x80dc4e2
0x80dc5b6
0x8059ec4
0x805de00
0x8057be0
0xb7dd3ea8
0x8057b01
-------------------------------------------------------
[BUG] compile_array: This node is not NODE_ARRAY, but NODE_SPLAT
ruby 1.9.0 (2007-11-23) [i686-linux]

アボートしました



ちゃんと setup_args するようにすればいいと思います。
おそらくこんな感じでしょうか。

Index: compile.c
===================================================================
--- compile.c	(revision 14010)
+++ compile.c	(working copy)
@@ -3298,8 +3298,9 @@
 	break;
       }
       case NODE_OP_ASGN1:{
+	unsigned long flag = 0;
 	DECL_ANCHOR(args);
-	int argc;
+	VALUE argc;
 	ID id = node->nd_mid;

 	/*
@@ -3324,11 +3325,15 @@

 	INIT_ANCHOR(args);
 	COMPILE(ret, "NODE_OP_ASGN1 recv", node->nd_recv);
-	argc = compile_array(iseq, args, node->nd_args->nd_body, Qfalse);
-	POP_ELEMENT(args);
-	ADD_SEQ(ret, args);
-	ADD_INSN1(ret, nd_line(node), dupn, INT2FIX(argc+1));
-	ADD_SEND(ret, nd_line(node), ID2SYM(idAREF), INT2FIX(argc));
+	if (nd_type(node->nd_args->nd_body) != NODE_ZARRAY) {
+	    argc = setup_args(iseq, args, node->nd_args->nd_body, &flag);
+	    ADD_SEQ(ret, args);
+	}
+	else {
+	    argc = FIX2INT(0);
+	}
+	ADD_INSN1(ret, nd_line(node), dupn, INT2FIX(FIX2INT(argc)+1));
+	ADD_SEND_R(ret, nd_line(node), ID2SYM(idAREF), argc, Qfalse, LONG2FIX(flag));

 	if (id == 0 || id == 1) {
 	    /* 0: or, 1: and
@@ -3356,8 +3361,16 @@

 	    COMPILE(ret, "NODE_OP_ASGN1 args->head: ",
 		    node->nd_args->nd_head);
-	    ADD_SEND(ret, nd_line(node), ID2SYM(idASET),
-		     INT2FIX(argc + 1));
+	    if (flag & VM_CALL_ARGS_SPLAT_BIT) {
+		ADD_INSN1(ret, nd_line(node), newarray, INT2FIX(1));
+		ADD_INSN(ret, nd_line(node), concatarray);
+		ADD_SEND_R(ret, nd_line(node), ID2SYM(idASET),
+			   argc, Qfalse, LONG2FIX(flag));
+	    }
+	    else {
+		ADD_SEND_R(ret, nd_line(node), ID2SYM(idASET),
+			   INT2FIX(FIX2INT(argc) + 1), Qfalse, LONG2FIX(flag));
+	    }
 	    ADD_INSNL(ret, nd_line(node), jump, lfin);
 	    ADD_LABEL(ret, label);
 	    if (id == 0) {	/* or */
@@ -3377,8 +3390,16 @@
 	    COMPILE(ret, "NODE_OP_ASGN1 args->head: ",
 		    node->nd_args->nd_head);
 	    ADD_SEND(ret, nd_line(node), ID2SYM(id), INT2FIX(1));
-	    ADD_SEND(ret, nd_line(node), ID2SYM(idASET),
-		     INT2FIX(argc + 1));
+	    if (flag & VM_CALL_ARGS_SPLAT_BIT) {
+		ADD_INSN1(ret, nd_line(node), newarray, INT2FIX(1));
+		ADD_INSN(ret, nd_line(node), concatarray);
+		ADD_SEND_R(ret, nd_line(node), ID2SYM(idASET),
+			   argc, Qfalse, LONG2FIX(flag));
+	    }
+	    else {
+		ADD_SEND_R(ret, nd_line(node), ID2SYM(idASET),
+			   INT2FIX(FIX2INT(argc) + 1), Qfalse, LONG2FIX(flag));
+	    }
 	}

 	if (poped) {

-- 
Yusuke ENDOH <mame@tsg.ne.jp>

In This Thread

Prev Next