From: ko1@... Date: 2014-10-23T01:05:16+00:00 Subject: [ruby-core:65862] [ruby-trunk - Feature #10344] [PATCH] Implement Fiber#raise Issue #10344 has been updated by Koichi Sasada. Yura Sokolov wrote: > > At least, such feature should be located at ext/fiber. > > even if ext/fiber it is still should be implemented in C . I agree. > > > I'm afraid that introducing such feature increases complexity of Fiber. > > Not too much. Look at the patch: it uses same hook as `rb_fiber_terminate`. I don't mention about implementation, but specification. > By the way, why Thread has this feature? > http://www.ruby-doc.org/core-2.1.3/Thread.html#method-i-raise > And why Fiber hasn't? In fact, it is strange that this feature still not > presented, cause it is expected to exists. Thread#raise is one of inter communication method (but asynchronouse, difficult, unrecommended way). Fibers can be under control without such communication. ---------------------------------------- Feature #10344: [PATCH] Implement Fiber#raise https://bugs.ruby-lang.org/issues/10344#change-49597 * Author: Knut Franke * Status: Open * Priority: Normal * Assignee: * Category: * Target version: ---------------------------------------- While it is possible to implement this in pure Ruby (by wrapping Fiber.yield and Fiber#resume), this feels like a low-level feature that ought to be provided out of the box. Also, the C implementation is more straight-forward, and more efficient. Unfortunately, it is not quite possible to implement this as a C extension module (without resorting to wrappers again); cf. the change to make_passing_arg(). Example usage: ~~~ fib = Fiber.new do counter = 0 loop { counter += Fiber.yield } counter end fib.resume fib.resume 10 fib.resume 100 fib.raise StopIteration # => 110 ~~~ ---Files-------------------------------- 0001-Implement-Fiber-raise.patch (4.12 KB) 0001-Implement-Fiber-raise.patch (3.51 KB) 0001-Implement-Fiber-raise-in-ext-fiber.patch (3.6 KB) -- https://bugs.ruby-lang.org/