[#31320] Import RubyGems to Ruby 1.9 — "NAKAMURA, Hiroshi" <nakahiro@...>

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

124 messages 2007/08/01
[#31321] Re: Import RubyGems to Ruby 1.9 — Nobuyoshi Nakada <nobu@...> 2007/08/01

なかだです。

[#31329] Re: Import RubyGems to Ruby 1.9 — "NAKAMURA, Hiroshi" <nakahiro@...> 2007/08/01

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

[#31918] Re: Import RubyGems to Ruby 1.9 — "NAKAMURA, Hiroshi" <nakahiro@...> 2007/09/30

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

[#31970] Re: Import RubyGems to Ruby 1.9 — "NAKAMURA, Hiroshi" <nakahiro@...> 2007/10/08

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

[#32023] Re: Import RubyGems to Ruby 1.9 — Yukihiro Matsumoto <matz@...> 2007/10/11

まつもと ゆきひろです

[#32062] Re: Import RubyGems to Ruby 1.9 — "NAKAMURA, Hiroshi" <nakahiro@...> 2007/10/15

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

[#32066] Re: Import RubyGems to Ruby 1.9 — Yukihiro Matsumoto <matz@...> 2007/10/15

まつもと ゆきひろです

[#32068] Re: Import RubyGems to Ruby 1.9 — "NAKAMURA, Hiroshi" <nakahiro@...> 2007/10/15

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

[#32069] Re: Import RubyGems to Ruby 1.9 — Yukihiro Matsumoto <matz@...> 2007/10/15

まつもと ゆきひろです

[#32070] Re: Import RubyGems to Ruby 1.9 — "NAKAMURA, Hiroshi" <nakahiro@...> 2007/10/15

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

[#32073] Re: Import RubyGems to Ruby 1.9 — Yukihiro Matsumoto <matz@...> 2007/10/15

まつもと ゆきひろです

[#32079] Re: Import RubyGems to Ruby 1.9 — "NAKAMURA, Hiroshi" <nakahiro@...> 2007/10/16

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

[#32080] Re: Import RubyGems to Ruby 1.9 — Yukihiro Matsumoto <matz@...> 2007/10/16

まつもと ゆきひろです

[#32132] Re: Import RubyGems to Ruby 1.9 — "NAKAMURA, Hiroshi" <nakahiro@...> 2007/10/23

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

[#32081] Re: Import RubyGems to Ruby 1.9 — Takahiro Kambe <taca@...> 2007/10/16

In message <471447D5.5050902@sarion.co.jp>

[#32087] Re: Import RubyGems to Ruby 1.9 — "Akinori MUSHA" <knu@...> 2007/10/17

 Rubygems は、基本的に他のパッケージシステムから包みやすい作り

[#32104] Re: Import RubyGems to Ruby 1.9 — akira yamada <akira@...> 2007/10/20

Tuesday 16 October 2007 14:09:13 に NAKAMURA, Hiroshi さんは書きました:

[#32109] Re: Import RubyGems to Ruby 1.9 — "NAKAMURA, Hiroshi" <nakahiro@...> 2007/10/20

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

[#31332] Re: Import RubyGems to Ruby 1.9 — Tadayoshi Funaba <tadf@...> 2007/08/01

> ちなみに「ruby/1.9.1の標準添付からどのライブラリを外すか?」という議論も

[#31858] Re: Import RubyGems to Ruby 1.9 — "NAKAMURA, Hiroshi" <nakahiro@...> 2007/09/25

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

[#31872] Re: Import RubyGems to Ruby 1.9 — "NAKAMURA, Hiroshi" <nakahiro@...> 2007/09/27

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

[#31905] Re: Import RubyGems to Ruby 1.9 — "NAKAMURA, Hiroshi" <nakahiro@...> 2007/09/29

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

[#31906] Re: Import RubyGems to Ruby 1.9 — Yukihiro Matsumoto <matz@...> 2007/09/29

まつもと ゆきひろです

[#31910] Re: Import RubyGems to Ruby 1.9 — "NAKAMURA, Hiroshi" <nakahiro@...> 2007/09/30

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

[#31920] Re: Import RubyGems to Ruby 1.9 — Yukihiro Matsumoto <matz@...> 2007/09/30

まつもと ゆきひろです

[#31323] Bignum#to_s の Karatsuba 基数変換による高速化 — "Kenta Murata" <muraken@...>

むらけんです.

16 messages 2007/08/01
[#31326] Re: Bignum#to_s の Karatsuba 基数変換による高速化 — Yukihiro Matsumoto <matz@...> 2007/08/01

まつもと ゆきひろです

[#31327] Re: Bignum#to_s の Karatsuba 基数変換による高速化 — "Kenta Murata" <muraken@...> 2007/08/01

むらけんです.

[#31328] Re: Bignum#to_s の Karatsuba 基数変換による高速化 — Yukihiro Matsumoto <matz@...> 2007/08/01

まつもと ゆきひろです

[#31525] いくつかのバグ報告と提案(5点) — eklerni <eklerni@...>

From:eklerni

13 messages 2007/08/20

[#31539] strtod の精度 — Satoshi Nakagawa <snakagawa@...>

中川といいます。

27 messages 2007/08/20
[#31542] Re: strtod の精度 — Yukihiro Matsumoto <matz@...> 2007/08/20

まつもと ゆきひろです

[ruby-dev:31508] Re: nested fiber invocation

From: SASADA Koichi <ko1@...>
Date: 2007-08-19 12:16:13 UTC
List: ruby-dev #31508
 ささだです。

Yukihiro Matsumoto wrote:
> まつもと ゆきひろです
> 
> 遠藤さんから 
> 
>   http://d.hatena.ne.jp/ku-ma-me/20070817/p2
> 
> で指摘されているのですが、Enumerator#nextの内側でさらに
> Enumerator#nextが呼ばれると、エラーになります。デバッガで追い
> かけると rb_fiber_yield() から渡した値と違うもの(yieldされた
> 値?)が帰ってきているようです。
> 
>   def (o = Object.new).each
>       yield 0
>       p [1,2,3].to_enum.next
>   end
> 
>   p o.to_enum.next # => double.rb:6:in `<main>': unhandled exception
> 
> current fiberをyieldしているはずなのに、FIXNUMの0(yieldした
> 値?)が渡される。0はFiberではないのでTypeError例外が発生して
> いる。
> 
> 私のFiberの知識ではここまでが限界でした。これはバグでしょう
> か、それとも制限とすべきでしょうか。できれば、ネストできない
> と言う制限はない方がうれしいのですが。
> 
>                                 まつもと ゆきひろ /:|)

 こんな感じでどうでしょう。つまり、ブロックの最後も rb_fiber_yield
で戻るようにしましょうって感じで。


Index: enumerator.c
===================================================================
--- enumerator.c	(リビジョン 13113)
+++ enumerator.c	(作業コピー)
@@ -13,6 +13,7 @@
 ************************************************/

 #include "ruby/ruby.h"
+#include "debug.h"

 /*
  * Document-class: Enumerable::Enumerator
@@ -42,6 +43,7 @@
     VALUE fib;
     VALUE next;
     VALUE dst;
+    VALUE has_next;
 };

 static void
@@ -237,6 +239,7 @@
     if (argc) ptr->args = rb_ary_new4(argc, argv);
     ptr->fib = 0;
     ptr->next = ptr->dst = Qnil;
+    ptr->has_next = Qnil;

     return enum_obj;
 }
@@ -381,19 +384,20 @@
 next_i(VALUE curr, VALUE obj)
 {
     struct enumerator *e = enumerator_ptr(obj);
+    e->dst = curr;

-    e->dst = curr;
     rb_block_call(obj, rb_intern("each"), 0, 0, next_ii, obj);
-    return e->next;
+    e->has_next = Qfalse;
+    rb_fiber_yield(e->dst, 1, &e->next);
 }

 static void
 next_init(VALUE obj, struct enumerator *e)
 {
     VALUE curr = rb_fiber_current();
-
     e->dst = curr;
     e->fib = rb_block_call(rb_cFiber, rb_intern("new"), 0, 0,
next_i, obj);
+    e->has_next = Qtrue;
     rb_fiber_yield(e->fib, 1, &curr);
 }

@@ -416,16 +420,18 @@
 {
     struct enumerator *e = enumerator_ptr(obj);
     VALUE curr, v;
+    curr = rb_fiber_current();

-    curr = rb_fiber_current();
     if (!e->fib) {
 	next_init(obj, e);
     }
-    if (!rb_fiber_alive_p(e->fib)) {
+
+    if (!e->has_next) {
 	e->fib = 0;
 	e->next = e->dst = Qnil;
 	rb_raise(rb_eStopIteration, "Enumerator#each reached at end");
     }
+
     v = rb_fiber_yield(e->fib, 1, &curr);
     return v;
 }
@@ -441,11 +447,7 @@
 enumerator_next_p(VALUE obj)
 {
     struct enumerator *e = enumerator_ptr(obj);
-
-    if (!e->fib) {
-	next_init(obj, e);
-    }
-    return rb_fiber_alive_p(e->fib);
+    return e->has_next;
 }

 /*

-- 
// SASADA Koichi at atdot dot net

In This Thread