[#39606] [Feature:trunk] Dir instance methods for relative path — Nobuyoshi Nakada <nobu@...>

なかだです。

15 messages 2009/11/02
[#39607] Re: [Feature:trunk] Dir instance methods for relative path — Yukihiro Matsumoto <matz@...> 2009/11/02

まつもと ゆきひろです

[#39611] Re: [Feature:trunk] Dir instance methods for relative path — KOSAKI Motohiro <kosaki.motohiro@...> 2009/11/02

kosakiです

[#39660] [Bug:trunk] Enumerator.new {|y| y << 1 << 2 << 3 } — Yusuke ENDOH <mame@...>

遠藤です。

14 messages 2009/11/11
[#39661] Re: [Bug:trunk] Enumerator.new {|y| y << 1 << 2 << 3 } — Tanaka Akira <akr@...> 2009/11/11

In article <e0b1e5700911110537u2aacf835pc0aea13d89a92cef@mail.gmail.com>,

[#39685] [Feature #2366] private constant — Yusuke Endoh <redmine@...>

Feature #2366: private constant

23 messages 2009/11/14
[#39689] [Feature #2366] private constant — Yusuke Endoh <redmine@...> 2009/11/14

チケット #2366 が更新されました。 (by Yusuke Endoh)

[#40207] Re: [Feature #2366] private constant — Yusuke ENDOH <mame@...> 2010/01/28

遠藤です。

[#40239] Re: [Feature #2366] private constant — Masatoshi SEKI <m_seki@...> 2010/01/29

=1B$B31$H$$$$$^$9!#=1B(B

[#40243] Re: [Feature #2366] private constant — Yusuke ENDOH <mame@...> 2010/01/29

遠藤です。

[#40246] Re: [Feature #2366] private constant — Masatoshi SEKI <m_seki@...> 2010/01/29

=1B$B31$H$$$$$^$9!#=1B(B

[#40247] Re: [Feature #2366] private constant — "NARUSE, Yui" <naruse@...> 2010/01/29

成瀬です。

[#39720] hidden objectって? — keiju@... (Keiju ISHITSUKA)

けいじゅ@いしつかです.

15 messages 2009/11/18
[#39721] Re: hidden objectって? — Yukihiro Matsumoto <matz@...> 2009/11/18

まつもと ゆきひろです

[#39726] Re: hidden objectって? — keiju@... (石塚圭樹) 2009/11/19

けいじゅ@いしつかです.

[#39727] Re: hidden objectって? — Yukihiro Matsumoto <matz@...> 2009/11/19

まつもと ゆきひろです

[#39730] Re: hidden objectって? — keiju@... (石塚圭樹) 2009/11/19

けいじゅ@いしつかです.

[#39735] [Bug:trunk] r25230 causes SEGV arround Marshal — "NARUSE, Yui" <naruse@...> 2009/11/19

以下のコミット以降、後述の現象が発生するそうです。

[#39755] RbConfig.rubybin — Tanaka Akira <akr@...>

ruby コマンドのパス名を返す RbConfig.rubybin というメソッド

18 messages 2009/11/23
[#39756] Re: RbConfig.rubybin — Kouhei Sutou <kou@...> 2009/11/23

須藤です。

[#39814] Re: RbConfig.rubybin — Tanaka Akira <akr@...> 2009/11/30

In article <20091123.123808.1122146273169400964.kou@cozmixng.org>,

[#39815] Re: RbConfig.rubybin — KOSAKI Motohiro <kosaki.motohiro@...> 2009/11/30

> In article <20091123.123808.1122146273169400964.kou@cozmixng.org>,

[#39796] バグ? ブロック引数で to_ary が呼ばれる必要のない場面で呼ばれる — keiju@... (Keiju ISHITSUKA)

けいじゅ@いしつかです.

14 messages 2009/11/27
[#39800] Re: バグ? ブロック引数で to_ary が呼ばれる必要のない場面で呼ばれる — Yukihiro Matsumoto <matz@...> 2009/11/27

まつもと ゆきひろです

[#39803] Re: バグ? ブロック引数で to_ary が呼ばれる必要のない場面で呼ばれる — keiju@... (石塚圭樹) 2009/11/27

けいじゅ@いしつかです.

[#39805] Re: バグ? ブロック引数で to_ary が呼ばれる必要のない場面で呼ばれる — Yukihiro Matsumoto <matz@...> 2009/11/28

まつもと ゆきひろです

[#39806] Re: バグ? ブロック引数で to_ary が呼ばれる必要のない場面で呼ばれる — keiju@... (石塚圭樹) 2009/11/28

けいじゅ@いしつかです.

[#39807] Re: バグ? ブロック引数で to_ary が呼ばれる必要のない場面で呼ばれる — Yukihiro Matsumoto <matz@...> 2009/11/28

まつもと ゆきひろです

[ruby-dev:39671] [Feature:trunk] hide the internal of anonymous Enumerator

From: Yusuke ENDOH <mame@...>
Date: 2009-11-12 11:53:54 UTC
List: ruby-dev #39671
遠藤です。

[ruby-dev:39665] より引用。

2009年11月12日0:38 Akinori MUSHA <knu@idaemons.org>:
>  Yielder/Generator という組合せによる実装は実験的なもので、特に
> 後者は外部に公開する必要がないので敢えて伏せていました。公開仕様に
> すると制約になるので、需要が生じるまでは非公開の方がいいのではない
> でしょうか。

ということなら、なるべく内部実装をユーザから見えないようにしませんか?

- Enumerator::Generator を匿名クラスにする (ARGF のように)
- Generator.new や Yielder.new を禁止する
- Enumerator#inspect で Generator の存在は隠す

とするパッチを書いてみました。どうでしょう。


diff --git a/enumerator.c b/enumerator.c
index 7c50f3d..88c37fd 100644
--- a/enumerator.c
+++ b/enumerator.c
@@ -886,29 +886,34 @@ inspect_enumerator(VALUE obj, VALUE dummy, int recur)
     untrusted = OBJ_UNTRUSTED(eobj);

     /* (1..100).each_cons(2) => "#<Enumerator: 1..100:each_cons(2)>" */
-    str = rb_sprintf("#<%s: ", cname);
-    rb_str_concat(str, rb_inspect(eobj));
-    rb_str_buf_cat2(str, ":");
-    rb_str_buf_cat2(str, rb_id2name(e->meth));
+    if (rb_obj_is_kind_of(eobj, rb_cGenerator)) {
+	str = rb_sprintf("#<%s:%p>", cname, (void*)eobj);
+    }
+    else {
+	str = rb_sprintf("#<%s: ", cname);
+	rb_str_concat(str, rb_inspect(eobj));
+	rb_str_buf_cat2(str, ":");
+	rb_str_buf_cat2(str, rb_id2name(e->meth));

-    if (e->args) {
-	long   argc = RARRAY_LEN(e->args);
-	VALUE *argv = RARRAY_PTR(e->args);
+        if (e->args) {
+	    long   argc = RARRAY_LEN(e->args);
+	    VALUE *argv = RARRAY_PTR(e->args);

-	rb_str_buf_cat2(str, "(");
+	    rb_str_buf_cat2(str, "(");

-	while (argc--) {
-	    VALUE arg = *argv++;
+	    while (argc--) {
+		VALUE arg = *argv++;

-	    rb_str_concat(str, rb_inspect(arg));
-	    rb_str_buf_cat2(str, argc > 0 ? ", " : ")");
+		rb_str_concat(str, rb_inspect(arg));
+		rb_str_buf_cat2(str, argc > 0 ? ", " : ")");

-	    if (OBJ_TAINTED(arg)) tainted = TRUE;
-	    if (OBJ_UNTRUSTED(arg)) untrusted = TRUE;
-	}
-    }
+		if (OBJ_TAINTED(arg)) tainted = TRUE;
+		if (OBJ_UNTRUSTED(arg)) untrusted = TRUE;
+	    }
+        }

-    rb_str_buf_cat2(str, ">");
+	rb_str_buf_cat2(str, ">");
+    }

     if (tainted) OBJ_TAINT(str);
     if (untrusted) OBJ_UNTRUST(str);
@@ -1223,17 +1228,17 @@ Init_Enumerator(void)
     rb_define_method(rb_eStopIteration, "result", stop_result, 0);

     /* Generator */
-    rb_cGenerator = rb_define_class_under(rb_cEnumerator,
"Generator", rb_cObject);
+    rb_cGenerator = rb_class_new(rb_cObject);
+    rb_undef_alloc_func(rb_cGenerator);
+    rb_set_class_path(rb_cGenerator, rb_cObject, "Enumerator::Generator");
     rb_include_module(rb_cGenerator, rb_mEnumerable);
-    rb_define_alloc_func(rb_cGenerator, generator_allocate);
-    rb_define_method(rb_cGenerator, "initialize", generator_initialize, -1);
-    rb_define_method(rb_cGenerator, "initialize_copy", generator_init_copy, 1);
     rb_define_method(rb_cGenerator, "each", generator_each, 0);
+    rb_obj_freeze(rb_cGenerator);
+    rb_gc_register_mark_object(rb_cGenerator);

     /* Yielder */
     rb_cYielder = rb_define_class_under(rb_cEnumerator, "Yielder", rb_cObject);
-    rb_define_alloc_func(rb_cYielder, yielder_allocate);
-    rb_define_method(rb_cYielder, "initialize", yielder_initialize, 0);
+    rb_undef_alloc_func(rb_cYielder);
     rb_define_method(rb_cYielder, "yield", yielder_yield, -2);
     rb_define_method(rb_cYielder, "<<", yielder_yield_push, -2);


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

In This Thread

Prev Next