[#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:32327] rb_internal_struct_define_class, rb_internal_struct_alloc

From: Tanaka Akira <akr@...>
Date: 2007-11-21 04:25:44 UTC
List: ruby-dev #32327
rational の T_STRUCT 化をして思ったんですが、RStruct の内部
を知っていないと書きにくいので、あまり知らなくてもかけるよう
内部的に T_STRUCT を使うクラスを定義する
  VALUE rb_internal_struct_define_class(char *class_name, VALUE super, long num_members, ...);
と、それを (要素はすべて nil で) allocate する
  VALUE rb_internal_struct_alloc(VALUE klass);
を提供するのはどうでしょうか。

名前はもう少し考えたほうがいいかもしれません。いい名前を思い
ついた人は教えてください。

以下はその実装と、それを使うようにした Range の変更です。

Index: include/ruby/intern.h
===================================================================
--- include/ruby/intern.h	(リビジョン 13983)
+++ include/ruby/intern.h	(作業コピー)
@@ -542,6 +542,8 @@
 VALUE rb_struct_iv_get(VALUE, const char*);
 VALUE rb_struct_s_members(VALUE);
 VALUE rb_struct_members(VALUE);
+VALUE rb_internal_struct_define_class(char *, VALUE, long, ...);
+VALUE rb_internal_struct_alloc(VALUE);
 /* thread.c */
 typedef struct rb_thread_struct rb_thread_t;
 typedef void rb_unblock_function_t(rb_thread_t *, void *);
Index: struct.c
===================================================================
--- struct.c	(リビジョン 13983)
+++ struct.c	(作業コピー)
@@ -218,6 +218,40 @@
 }
 
 VALUE
+rb_internal_struct_alloc(VALUE klass)
+{
+    return struct_alloc(klass);
+}
+
+VALUE
+rb_internal_struct_define_class(char *class_name, VALUE super, long size, ...)
+{
+    VALUE klass;
+    va_list ar;
+    VALUE members;
+    long i;
+
+    members = rb_ary_new2(size);
+
+    va_start(ar, size);
+    for (i = 0; i < size; i++)
+        rb_ary_store(members, i, ID2SYM(rb_intern(va_arg(ar, char*))));
+    va_end(ar);
+
+    if (class_name) {
+        klass = rb_define_class(class_name, super);
+    }
+    else {
+        klass = rb_class_new(super);
+    }
+
+    rb_iv_set(klass, "__size__", LONG2NUM(size));
+    rb_iv_set(klass, "__members__", members);
+
+    return klass;
+}
+
+VALUE
 rb_struct_define(const char *name, ...)
 {
     va_list ar;
Index: range.c
===================================================================
--- range.c	(リビジョン 13983)
+++ range.c	(作業コピー)
@@ -23,22 +23,6 @@
 #define SET_EXCL(r,v) (RSTRUCT(r)->as.ary[2] = (v) ? Qtrue : Qfalse)
 
 static VALUE
-range_alloc(VALUE klass)
-{
-    long n;
-    NEWOBJ(r, struct RStruct);
-    OBJSETUP(r, klass, T_STRUCT);
-
-    n = 3;
-
-    RBASIC(r)->flags &= ~RSTRUCT_EMBED_LEN_MASK;
-    RBASIC(r)->flags |= n << RSTRUCT_EMBED_LEN_SHIFT;
-    rb_mem_clear(r->as.ary, n);
-
-    return (VALUE)r;
-}
-
-static VALUE
 range_failed(void)
 {
     rb_raise(rb_eArgError, "bad value for range");
@@ -895,15 +879,10 @@
     id_end = rb_intern("end");
     id_excl = rb_intern("excl");
 
-    rb_cRange = rb_define_class("Range", rb_cObject);
+    rb_cRange = rb_internal_struct_define_class("Range", rb_cObject,
+        3, "begin", "end", "excl");
 
-    /* compatibility for rb_struct_members, etc. */
-    members = rb_ary_new3(3, ID2SYM(id_beg), ID2SYM(id_end), ID2SYM(id_excl));
-    OBJ_FREEZE(members);
-    rb_iv_set(rb_cRange, "__size__", INT2FIX(3));
-    rb_iv_set(rb_cRange, "__members__", members);
-
-    rb_define_alloc_func(rb_cRange, range_alloc);
+    rb_define_alloc_func(rb_cRange, rb_internal_struct_alloc);
     rb_include_module(rb_cRange, rb_mEnumerable);
     rb_marshal_define_compat(rb_cRange, rb_cObject, range_dumper, range_loader);
     rb_define_method(rb_cRange, "initialize", range_initialize, -1);
-- 
[田中 哲][たなか あきら][Tanaka Akira]

In This Thread

Prev Next