[#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:32355] Re: core dump with undef/alias using dynamic symbols

From: "Yusuke ENDOH" <mame@...>
Date: 2007-11-25 13:22:09 UTC
List: ruby-dev #32355
遠藤と申します。

07/11/19 に Tadashi Saito<shiba@mail2.accsnet.ne.jp> さんは書きました:
> undefに式展開を伴うシンボルを渡すと、以下のようにcoreを吐きます。
>
> $ ruby-trunk -ve 'undef :"#{foo}"'
(snip)


この問題は落ちないように対応されたようですが、式展開がされないようです。

$ ./miniruby -e 'def foobar; end; undef :"foo#{ :bar }"'
-e:1:in `<main>': undefined method `foo' for class `Object' (NameError)



スタックからシンボルを読み込んで alias や undef をするバイトコード命令を
(見よう見まねで) 追加してみました。余計なお世話だったらすみません。


Index: insns.def
===================================================================
--- insns.def	(revision 14012)
+++ insns.def	(working copy)
@@ -769,6 +769,28 @@

 /**
   @c setting
+  @e make alias (if v_p is Qtrue, make valias)
+  @j シンボルを受け取って alias を作る。もし v_p が Qtrue なら、valias (global variable) を作る。
+ */
+DEFINE_INSN
+alias_with_symbol
+(VALUE v_p)
+(VALUE id1, VALUE id2)
+()
+{
+    VALUE klass;
+
+    if (v_p == Qtrue) {
+	rb_alias_variable(SYM2ID(id1), SYM2ID(id2));
+    }
+    else {
+	klass = get_cref(GET_ISEQ(), GET_LFP())->nd_clss;
+	rb_alias(klass, SYM2ID(id1), SYM2ID(id2));
+    }
+}
+
+/**
+  @c setting
   @e undef
   @j undef を行う。
  */
@@ -785,6 +807,22 @@

 /**
   @c setting
+  @e undef_with_symbol
+  @j シンボルを受け取って undef を行う。
+ */
+DEFINE_INSN
+undef_with_symbol
+()
+(VALUE id)
+()
+{
+    VALUE klass = get_cref(GET_ISEQ(), GET_LFP())->nd_clss;
+    rb_undef(klass, SYM2ID(id));
+    INC_VM_STATE_VERSION();
+}
+
+/**
+  @c setting
   @e defined?
   @j defined? を行う。
  */
Index: compile.c
===================================================================
--- compile.c	(revision 14012)
+++ compile.c	(working copy)
@@ -4064,17 +4064,40 @@
       }
       case NODE_ALIAS:{
 	VALUE s1, s2;
-	enum node_type t;
+	enum node_type t1, t2;

-	if (((t = nd_type(node->u1.node)) != NODE_LIT && t != NODE_DSYM) ||
-	    ((t = nd_type(node->u2.node)) != NODE_LIT && t != NODE_DSYM)) {
+	t1 = nd_type(node->u1.node);
+	t2 = nd_type(node->u2.node);
+	if (t1 == NODE_LIT && t2 == NODE_LIT) {
+	    s1 = node->u1.node->nd_lit;
+	    s2 = node->u2.node->nd_lit;
+	    ADD_INSN3(ret, nd_line(node), alias, Qfalse, ID2SYM(rb_to_id(s1)),
+		      ID2SYM(rb_to_id(s2)));
+	}
+	else if ((t1 == NODE_LIT || t1 == NODE_DSYM) &&
+		 (t2 == NODE_LIT || t2 == NODE_DSYM)) {
+	    if (t1 == NODE_LIT) {
+	        s1 = node->u1.node->nd_lit;
+		ADD_INSN1(ret, nd_line(node), putobject, ID2SYM(rb_to_id(s1)));
+	    }
+	    else {
+		compile_dstr(iseq, ret, node->u1.node);
+		ADD_SEND(ret, nd_line(node), ID2SYM(idIntern), INT2FIX(0));
+	    }
+	    if (t2 == NODE_LIT) {
+	        s2 = node->u2.node->nd_lit;
+		ADD_INSN1(ret, nd_line(node), putobject, ID2SYM(rb_to_id(s2)));
+	    }
+	    else {
+		compile_dstr(iseq, ret, node->u2.node);
+		ADD_SEND(ret, nd_line(node), ID2SYM(idIntern), INT2FIX(0));
+	    }
+	    ADD_INSN1(ret, nd_line(node), alias_with_symbol, Qfalse);
+	}
+	else {
 	    rb_compile_bug(ERROR_ARGS "alias args must be NODE_LIT or NODE_DSYM");
 	}
-	s1 = node->u1.node->nd_lit;
-	s2 = node->u2.node->nd_lit;

-	ADD_INSN3(ret, nd_line(node), alias, Qfalse, ID2SYM(rb_to_id(s1)),
-		  ID2SYM(rb_to_id(s2)));
 	if (!poped) {
 	    ADD_INSN(ret, nd_line(node), putnil);
 	}
@@ -4090,11 +4113,19 @@
       }
       case NODE_UNDEF:{
 	enum node_type t = nd_type(node->u2.node);
-	if (t != NODE_LIT && t != NODE_DSYM) {
-	    rb_compile_bug(ERROR_ARGS "undef args must be NODE_LIT");
+	switch (t) {
+	  case NODE_LIT:
+	    ADD_INSN1(ret, nd_line(node), undef,
+		      ID2SYM(rb_to_id(node->u2.node->nd_lit)));
+	    break;
+	  case NODE_DSYM:
+	    compile_dstr(iseq, ret, node->u2.node);
+	    ADD_SEND(ret, nd_line(node), ID2SYM(idIntern), INT2FIX(0));
+	    ADD_INSN(ret, nd_line(node), undef_with_symbol);
+	    break;
+	  default:
+	    rb_compile_bug(ERROR_ARGS "undef args must be NODE_LIT or NODE_DSYM");
 	}
-	ADD_INSN1(ret, nd_line(node), undef,
-		  ID2SYM(rb_to_id(node->u2.node->nd_lit)));
 	if (!poped) {
 	    ADD_INSN(ret, nd_line(node), putnil);
 	}

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

In This Thread